This article will introduce the CI Workflow which all pull requests should pass before being merged. The CI Workflow of OpenYurt is built based on Github Actions. Details of Github Actions can be found at its official documentation. The config of the CI Workflow is located at ci.yaml.
The current CI Worflow of OpenYurt contains the following checks:
At the moment you submit a pull request to OpenYurt, Github Actions will be triggered to check your PR. A pull request can not be merged until it passed all the checks in Github Actions as the following picture shows:
You can click
Details to check logs to solve the problem if you find some checks failed. The article will then give the discription of all six checks to help you understand why some of these checks fail. By the way, all of these checks can run at your local host.
check-license will check all the
.sh files to ensure all of them have a license. It will use the bash shell check_license.sh. If it finds some files don't contain license, it will output their paths.
license is a statement in the comments at the beginning of the file. The following license is what OpenYurt uses:
Copyright 2021 The OpenYurt Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
golangci-lint will check the format of all go source code files. It uses the tool
golangci-lint with serval linters to do the check. More details of
golangci-lint can be found at the doc. This sections will give the brief introduction of linters used by OpenYurt.
The config file of
golangci-lint is at .golangci.yaml. The enabled linters and their descriptions are as follows:
|Finds unused code
|checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
|In addition to fixing imports, goimports also formats your code in the same style as gofmt.
|Gci control golang package import order and make it always deterministic
|Detects when assignments to existing variables are not used
|Finds commonly misspelled English words in comments
|Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
You can use
make lint at your local host to run these checks. This command will automatically install the
golangci-lint tool if not found. Running this command at local host will show more details than what Github Actions will output, such as the error lines. We always recommend running
make lint at your local host before submitting a pull reuqest.
OpenYurt uses the pouchlinter to do this check, which contains some installed lint tools we need: misspell and markdownlint. misspell will check if there're some misspelled English words. It will output the file path and line number, if any. markdownlint will check if markdown files repect specified rules. The descriptions of all rules can be found at the doc. In this check,
MD036 will not be respected.
In this check, all go files with suffix
_test.go will be executed. These files usually contain test cases of some functions and modules. The following command will be used to run these tests:
This check will try to build binaries of all OpenYurt components on the
linux/amd64 platform, including
yurt-tunnel-agent. It will use the following command to build these binaries:
In this check, a OpenYurt cluster with two nodes will be set up to run e2e test cases under
test folder. OpenYurt also provide a way to run this test at your local host which you can find at Local Up OpenYurt. Currently, the following e2e test cases will run during this check:
|Fetch cluster info from the cluster, including the number of pods and all namespaces
|Create/Delete pod on the edge node
|Execute command in the pod on the edge node