From ae58efad31f2d0df72d03bb6a1ca8fdd33dcc6ff Mon Sep 17 00:00:00 2001 From: Shovnik Bhattacharya Date: Wed, 7 Oct 2020 15:19:45 -0400 Subject: [PATCH 1/4] Added lint job Signed-off-by: Azfaar Qureshi --- .github/workflows/test-build-deploy.yml | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/test-build-deploy.yml diff --git a/.github/workflows/test-build-deploy.yml b/.github/workflows/test-build-deploy.yml new file mode 100644 index 00000000000..7f2057e5e2f --- /dev/null +++ b/.github/workflows/test-build-deploy.yml @@ -0,0 +1,31 @@ +name: ci +on: + push: + branches: [master] + tags: + - v[0-9]+.[0-9]+.[0-9]+** # Tag filters not as strict due to different regex system on Github Actions + pull_request: +jobs: + lint: + runs-on: ubuntu-latest + container: + image: quay.io/cortexproject/build-image:update-golang-1.14.9-eb0c8d4d2 + steps: + - name: Checkout Repo + uses: actions/checkout@v1 + - name: Sym Link Expected Path to Workspace + run: | + mkdir -p /go/src/github.com/cortexproject/cortex + ln -s $GITHUB_WORKSPACE/* /go/src/github.com/cortexproject/cortex + - name: Generate protobuf files + run: "protoc -I /go/src:./vendor/github.com/thanos-io/thanos/pkg:./vendor/github.com/gogo/protobuf:./vendor:./pkg/ruler --gogoslick_out=plugins=grpc,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types,:./pkg/ruler ./pkg/ruler/ruler.proto" + - name: Lint + run: make BUILD_IN_CONTAINER=false lint + - name: Check Vendor Directory + run: make BUILD_IN_CONTAINER=false mod-check + - name: Check Protos + run: make BUILD_IN_CONTAINER=false check-protos + - name: Check Generated Documentation + run: make BUILD_IN_CONTAINER=false check-doc + - name: Check White Noise. + run: make BUILD_IN_CONTAINER=false check-white-noise From 38ae76ce347995b71a53edf78f51c266398fc46e Mon Sep 17 00:00:00 2001 From: Shovnik Bhattacharya Date: Wed, 7 Oct 2020 15:38:13 -0400 Subject: [PATCH 2/4] Added test and build jobs Signed-off-by: Azfaar Qureshi --- .github/workflows/test-build-deploy.yml | 86 +++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/.github/workflows/test-build-deploy.yml b/.github/workflows/test-build-deploy.yml index 7f2057e5e2f..f240df08090 100644 --- a/.github/workflows/test-build-deploy.yml +++ b/.github/workflows/test-build-deploy.yml @@ -29,3 +29,89 @@ jobs: run: make BUILD_IN_CONTAINER=false check-doc - name: Check White Noise. run: make BUILD_IN_CONTAINER=false check-white-noise + + test: + runs-on: ubuntu-latest + container: + image: quay.io/cortexproject/build-image:update-golang-1.14.9-eb0c8d4d2 + services: + cassandra: + image: cassandra:3.11 + env: + JVM_OPTS: "-Xms1024M -Xmx1024M" + ports: + - 9042:9042 + steps: + - name: Checkout Repo + uses: actions/checkout@v1 + - name: Get Dependencies + run: go get -v -t -d ./... + - name: Sym Link Expected Path to Workspace + run: | + mkdir -p /go/src/github.com/cortexproject/cortex + ln -s $GITHUB_WORKSPACE/* /go/src/github.com/cortexproject/cortex + - name: Run Tests + run: CASSANDRA_TEST_ADDRESSES=cassandra:9042 make BUILD_IN_CONTAINER=false test + + build: + runs-on: ubuntu-latest + container: + image: quay.io/cortexproject/build-image:update-golang-1.14.9-eb0c8d4d2 + steps: + - name: Checkout Repo + uses: actions/checkout@v1 + - name: Install Docker Client + run: | + set -x + VER="17.03.0-ce" + curl -L -o /tmp/docker-$VER.tgz https://download.docker.com/linux/static/stable/x86_64/docker-$VER.tgz + tar -xz -C /tmp -f /tmp/docker-$VER.tgz + mv /tmp/docker/* /usr/bin + - name: Sym Link Expected Path to Workspace + run: | + mkdir -p /go/src/github.com/cortexproject/cortex + ln -s $GITHUB_WORKSPACE/* /go/src/github.com/cortexproject/cortex + - name: Build Image + run: | + touch build-image/.uptodate + make BUILD_IN_CONTAINER=false + - name: Build Website + run: | + touch build-image/.uptodate + make BUILD_IN_CONTAINER=false web-build + - uses: actions/upload-artifact@v2 + with: + name: website public + path: website/public/ + - uses: actions/upload-artifact@v2 + with: + name: Frontend Protobuf + path: pkg/querier/frontend/frontend.pb.go + - uses: actions/upload-artifact@v2 + with: + name: Caching Index Client Protobuf + path: pkg/chunk/storage/caching_index_client.pb.go + - uses: actions/upload-artifact@v2 + with: + name: Ring Protobuf + path: pkg/ring/ring.pb.go + - uses: actions/upload-artifact@v2 + with: + name: Cortex Protobuf + path: pkg/ingester/client/cortex.pb.go + - uses: actions/upload-artifact@v2 + with: + name: Rules Protobuf + path: pkg/ruler/rules/rules.pb.go + - name: Save Images + run: | + mkdir /tmp/images + ln -s /tmp/images ./docker-images + make BUILD_IN_CONTAINER=false save-images + - name: Zip Images + run: tar -zcvf images.tar.gz /tmp/images + - name: Upload Images Artifact + uses: actions/upload-artifact@v2 + with: + name: Docker Images + path: ./images.tar.gz From f96681c40d9e62936daad3291abf0e4f78c98e35 Mon Sep 17 00:00:00 2001 From: Azfaar Qureshi Date: Thu, 8 Oct 2020 13:27:40 -0400 Subject: [PATCH 3/4] adding README Signed-off-by: Azfaar Qureshi --- .github/README.md | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 .github/README.md diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 00000000000..6fa7e0c8471 --- /dev/null +++ b/.github/README.md @@ -0,0 +1,94 @@ +# GitHub Actions CI/CD + +The purpose of this workflow is to run all continuous integration (CI) and continuous deployment (CD) jobs when needed while respecting their internal dependencies. The continuous integration jobs serve to ensure new code passes linting, unit tests and integration tests before reaching the master branch. The continuous deployment jobs serve to deploy the latest version of the code to cortex and the website when merged with master. + +## Contributing + +If you wish to add a new CI or CD job, add it to the existing current test-build-deploy workflow and make sure it does not prevent any of the other jobs from passing. If you wish to change any of the build or testing images, update it in all sections are containers are often reused. If you wish to add an entirely new workflow, create a new yml file with separate triggers and filters. In all cases, clearly document any changes made to the workflows, images and dependencies below. + +## Test, Build and Deploy + +test-build-deploy.yml specifies a workflow that runs all Cortex continuous integration and continuous deployment jobs. The workflow is triggered on every pull request and commit to master, however the CD jobs only run when changes are merged onto master . The workflow combines both CI and CD jobs, because the CD jobs are dependent on artifacts produced the CI jobs. + + +## Specific Jobs + +| Job | Description | Type | +|------------------------|-------------------------------------------------------------------------------------------------------------------------------|------| +| lint | Runs linting and ensures vendor directory, protos and generated documentation are consistent. | CI | +| test | Runs units tests on Cassandra testing framework. | CI | +| integration-configs-db | Integration tests for database configurations. | CI | +| integration | Runs integration tests after upgrading golang, pulling necessary docker images and downloading necessary module dependencies. | CI | +| build | Builds and saves an up-to-date Cortex image and website. | CI | +| deploy_website | Deploys the latest version of Cortex website to gh-pages branch. Triggered within workflow. | CD | +| deploy | Deploys the latest Cortex image. | CD | + +## Job Dependency Graph + +Internal dependencies between jobs illustrated below. Jobs run concurrently where possible but do not start until all jobs they depend on have completed successfully. + + +![cortex_test-build-deploy](https://user-images.githubusercontent.com/20804975/95492784-9b7feb80-0969-11eb-9934-f44a4b1da498.png) + +### Key Details + +**Naming Convention** + +Each step in a job has a clear name that encapsulates the purpose of the command. The convention we are using is each word in the name should be capitalized except articles and prepositions. This creates consistent labeling when looking at the progress of the current workflow on GitHub. + +```yaml +- name: Checkout Repo +# commands +- name: Get Dependencies +# commands +``` + +**Checkout Version** + +Current build-image ships with an older version of Git which breaks github/actions@v2 so we are using actions/checkout@v1 for all jobs until the quay image is updated to ship with a more recent version of Git. + +```yaml +- name: Checkout Repo + uses: actions/checkout@v1 +``` + +**Symbolic Link to Expected Workspace** + +A significant number of commands in the Makefile are hardcoded with an assumed file structure of the CI container. To ensure paths specified in previous commands don’t break, a symlink was created from the hardcoded “expected” working directory `/go/src/github.com/cortexproject/cortex` to the actual working directory `$GITHUB_WORKSPACE`. + +```yaml +- name: Sym link expected path to github workspace + run: | + mkdir -p /go/src/github.com/cortexproject/cortex + ln -s $GITHUB_WORKSPACE/* /go/src/github.com/cortexproject/cortex +``` + +**Sharing Artifacts Between Jobs** + +As of October 2020, GitHub Actions do not persist between different jobs in the same workflow. Each job is run on a fresh virtual environment (https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/introduction-to-github-actions#runners). As such, we need to upload and download artifacts to share data between jobs. + +Artifact Stored in Used by Purpose of storing artifact +website public build deploy_website share between jobs +Docker Images build deploy, integration, integrations-config-db share between jobs +Frontend Protobuf build - long term storage +Caching Index Client Protobuf build - long term storage +Ring Protobuf build - long term storage +Rules Protobuf build - long term storage + +*Note:* Docker Images are zipped before uploading as a workaround. The images contain characters that are illegal in the upload-artifact action. +```yaml +- name: Compressing Images + run: tar -zcvf images.tar.gz /tmp/images + - name: Cache Images + uses: actions/upload-artifact@v2 + with: + name: Docker Images + path: ./images.tar.gz +``` +**Tags** + +As of Oct 2020, GitHub [does not support](https://github.community/t/using-regex-for-filtering/16427/2) regex for tag filtering. The regex /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/ was approximated using the available GitHub [filter patterns](https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet) +```yaml +tags: + - v[0-9]+.[0-9]+.[0-9]+** +``` \ No newline at end of file From 8319961e940e02ea73cd454023562d9103e40909 Mon Sep 17 00:00:00 2001 From: Azfaar Qureshi Date: Fri, 9 Oct 2020 15:56:02 -0400 Subject: [PATCH 4/4] adding table to README and removing vestigial lines from workflow Signed-off-by: Azfaar Qureshi --- .github/README.md | 15 ++++++++------- .github/workflows/test-build-deploy.yml | 4 ---- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/README.md b/.github/README.md index 6fa7e0c8471..867f22aee27 100644 --- a/.github/README.md +++ b/.github/README.md @@ -67,13 +67,14 @@ A significant number of commands in the Makefile are hardcoded with an assumed f As of October 2020, GitHub Actions do not persist between different jobs in the same workflow. Each job is run on a fresh virtual environment (https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/introduction-to-github-actions#runners). As such, we need to upload and download artifacts to share data between jobs. -Artifact Stored in Used by Purpose of storing artifact -website public build deploy_website share between jobs -Docker Images build deploy, integration, integrations-config-db share between jobs -Frontend Protobuf build - long term storage -Caching Index Client Protobuf build - long term storage -Ring Protobuf build - long term storage -Rules Protobuf build - long term storage +| Artifact | Stored In | Used By | Purpose of Storing Artifact | +|-------------------------------|-----------|---------------------------------------------|-----------------------------| +| website public | build | deploy_website | share data between jobs | +| Docker Images | build | deploy, integration, integrations-config-db | share data between jobs | +| Frontend Protobuf | build | | long term storage | +| Caching Index Client Protobuf | build | | long term storage | +| Ring Protobuf | build | | long term storage | +| Rules Protobuf | build | | long term storage | *Note:* Docker Images are zipped before uploading as a workaround. The images contain characters that are illegal in the upload-artifact action. ```yaml diff --git a/.github/workflows/test-build-deploy.yml b/.github/workflows/test-build-deploy.yml index f240df08090..b6af42cc7f6 100644 --- a/.github/workflows/test-build-deploy.yml +++ b/.github/workflows/test-build-deploy.yml @@ -17,8 +17,6 @@ jobs: run: | mkdir -p /go/src/github.com/cortexproject/cortex ln -s $GITHUB_WORKSPACE/* /go/src/github.com/cortexproject/cortex - - name: Generate protobuf files - run: "protoc -I /go/src:./vendor/github.com/thanos-io/thanos/pkg:./vendor/github.com/gogo/protobuf:./vendor:./pkg/ruler --gogoslick_out=plugins=grpc,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types,:./pkg/ruler ./pkg/ruler/ruler.proto" - name: Lint run: make BUILD_IN_CONTAINER=false lint - name: Check Vendor Directory @@ -44,8 +42,6 @@ jobs: steps: - name: Checkout Repo uses: actions/checkout@v1 - - name: Get Dependencies - run: go get -v -t -d ./... - name: Sym Link Expected Path to Workspace run: | mkdir -p /go/src/github.com/cortexproject/cortex