- Fork the repository on GitHub
- Read the Develop Octopus and Develop Adaptors for build instructions.
Asking a question, reporting a bug or sending pull requests is welcome.
A workflow of asking a question or reporting a bug looks like:
- Create an issue with a clear direction title.
- Select the kind of the issue from the labels on the right side.
- Fill in and describe the situation in detail.
- As the discussion progresses, the kind of the issue may change or require more detailed descriptions. Long-term unresponsive and unreproducible issues will be closed, a bot will take care of these abandoned issues.
A workflow of sending pull request looks like:
- Create a corresponding issue as an admission ticket and associate it with this PR.
- Make commits of logical units, unit tests may be asked.
- Submit clear commit messages.
- The PR must receive approval from at least two maintainers.
Octopus follows the standard github pull request process. To submit a proposed change, please develop the code/fix and add new test cases. After that, run these local verifications before submitting pull request to predict the pass or fail of continuous integration:
- Developing Adaptor:
- Run and pass
make adaptors <adaptor directory name> test
- Run and pass
CROSS=true make adaptors <adaptor directory name> package only
- Run and pass
- Developing Octopus:
- Run and pass
make octopus test
- Run and pass
CROSS=true make octopus package only
- Run and pass
To make it easier for your PR to receive reviews, consider the reviewers will need you to:
- Follow good coding guidelines.
- Write good commit messages.
- Break large changes into a logical series of smaller patches which individually make easily understandable changes, and in aggregate solve a broader issue.
- Label PR with the scope or stage label.
- Request appropriate reviewers to review.
The commit message of Octopus follows Conventional Commits, which provides an easy set of rules for creating an explicit commit history, it should be structured as follows:
<type>[optional scope]: <description>
<BLANK LINE>
[optional body]
<BLANK LINE>
[optional footer]
With Conventional Commits, Octopus could generate the changelog automatically and navigate git history easily. An example of commit message:
fix(dummy): correct simulation interval
adjust the interval to relate with `gear` spec.
address #7
More examples could refer to here.
All commit messages should follow the rules as below:
- Separate subject from body with a blank line, and separate footer from body with another blank line.
- Subject line should not end with a period and limit to 70 characters.
- Use the body to describe what and why or how, and should wrap it at 80 characters.
- All content should be lowercase except
BREAKING CHANGE
. - Use the imperative mood to describe all things: "change" not "changed" nor "changes".
Subject line must include type
and scope
as shown below:
- Allowed
type
values:- fix, a bug fix.
- feat, a new feature.
- chore, updating the code dependencies.
- docs, changes to the documentation.
- test, changes to add tests, refactoring tests.
- ci, changes to CI and scripts.
- style, changes that do not affect the meaning of the code(e.g. white-space, formatting, missing semi-colons).
- perf, changes to improve the performance.
- refactor, changes that neither fixes a bug nor adds a feature(e.g. renaming a variable or extracting a method).
- revert, changes that revert previous commits.
- Example
scope
values:- brain/limb/suctioncup, the related content of main framework.
- dummy, the related content of dummy adaptor, the same is true of other adaptors.
The scope
can be empty, if the change is a global or difficult to assign to a single component, for example:
docs: correct spelling of CHANGELOG
The body should include the motivation for the change and contrasts with previous behavior, for more information about body message, please view: https://www.freecodecamp.org/news/writing-good-commit-messages-a-practical-guide/
The footer should be used for:
-
Referencing issues: Closed issues should be listed on a separate line prefixed with
address
keyword like this:address #7
or in the case of multiple issues:
address #8, #9, #10
-
Record breaking changes: Breaking changes should be prefixed with
BREAKING CHANGE
keyword like this:BREAKING CHANGE: bump Go version to 1.13
or use multiple lines to mention with the description of the change, justification and migration notes:
BREAKING CHANGE: `enable-metrics` option of `limb` has dropped, therefore, monitoring metrics are enabled by default. To migrate your project, change all command, where you use `--enable-metrics`.
There are multiple types of tests. The location of the test code varies with type, as do the specifics of the environment needed to successfully run the test:
- Unit: These confirm that a particular function behaves as intended. Unit test source code can be found adjacent to the corresponding source code within a given package.
- Integration: These tests cover interactions of package components or interactions between Octopus components and Kubernetes control plane components like API server. Integration test source code can be found in
test/integration
directory. - End-to-end ("e2e"): These are broad tests of overall system behavior and coherence. E2E test source code can be found in
test/e2e
directory.
Continuous integration will run these tests on PRs.
Usually, the unit tests easily run locally by any developer. Developed code can be PR after passing unit tests. You can run unit tests on:
- Adaptor:
make adaptors <adaptor directory name> test only
- Octopus:
make octopus test only
Integration testing bases on the envtest of sigs.k8s.io/controller-runtime, it's using Ginkgo, a testing framework which supports Behavior-Driven Development(BDD) style. You can run integration tests on:
- Adaptor:
make adaptors <adaptor directory name> verify only
- Octopus:
make octopus verify only
When running integration tests, the framework will launch a local Kubernetes cluster using Docker. There are two supported local clusters inside: kind
and k3d
, you can use environment variable CLUSTER_TYPE
to select, default is k3d
. Instead of setting up a local cluster, you can also use environment variable USE_EXISTING_CLUSTER=true
to point out an existing cluster, and then the integration tests will use the kubeconfig of the current environment to communicate with the existing cluster.
TODO
Currently, Octopus hosted its documentation on the cnrancher/docs-octopus repo, please submit your PR against this repo for documentation changes.