diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 48671c88d..ed2f88cc6 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -17,14 +17,19 @@ on: # go_lint # js_unit_tests -# Docker build and integration tests for every master/tag push and linkerd org PR +# master/tag push and linkerd org PR: Docker build and integration tests # # docker_pull # docker_build # kind_setup -# -> kind_integration +# -> kind_integration_host # -> kind_cleanup +# Forked repository PR: Docker build and integration tests +# +# docker_build +# -> kind_integration_github + # Docker deploy and cloud integration tests for every master/tag push # # -> docker_deploy @@ -135,18 +140,17 @@ jobs: # Docker build and kind integration tests run for: # - every master push # - every tag push - # - every PR from a linkerd org member + # - every PR # docker_pull: name: Docker pull + if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork runs-on: ubuntu-18.04 steps: - name: Checkout code - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork uses: actions/checkout@v2 - name: Docker SSH setup - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork run: | mkdir -p ~/.ssh/ touch ~/.ssh/id && chmod 600 ~/.ssh/id @@ -155,7 +159,6 @@ jobs: echo "${{ secrets.DOCKER_KNOWN_HOSTS }}" > ~/.ssh/known_hosts ssh linkerd-docker docker version - name: Docker pull - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork env: DOCKER_HOST: ssh://linkerd-docker run: | @@ -165,9 +168,10 @@ jobs: docker_build: name: Docker build runs-on: ubuntu-18.04 + env: + IMAGE_ARCHIVES_DIR: /home/runner/archives steps: - name: Checkout code - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork uses: actions/checkout@v2 - name: Docker SSH setup if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork @@ -178,13 +182,30 @@ jobs: echo "${{ secrets.DOCKER_PRIVATE_KEY }}" > ~/.ssh/id echo "${{ secrets.DOCKER_KNOWN_HOSTS }}" > ~/.ssh/known_hosts ssh linkerd-docker docker version - - name: Docker build - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork - env: - DOCKER_HOST: ssh://linkerd-docker + echo ::set-env name=DOCKER_HOST::ssh://linkerd-docker + - name: Build docker images run: | export PATH="`pwd`/bin:$PATH" DOCKER_TRACE=1 bin/docker-build + - name: Create artifact with CLI and image archives + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork + run: | + mkdir -p $IMAGE_ARCHIVES_DIR + cp target/cli/linux/linkerd $IMAGE_ARCHIVES_DIR/ + TAG="$(CI_FORCE_CLEAN=1 bin/root-tag)" + for img in controller grafana proxy web ; do + docker save "gcr.io/linkerd-io/$img:$TAG" > $IMAGE_ARCHIVES_DIR/$img.tar + done + # `with.path` values do not support environment variables yet, so an + # absolute path is used here. + # + # https://github.com/actions/upload-artifact/issues/8 + - name: Upload artifact + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork + uses: actions/upload-artifact@v1 + with: + name: image-archives + path: /home/runner/archives kind_setup: strategy: @@ -192,13 +213,12 @@ jobs: matrix: integration_test: [deep, upgrade, helm, helm_upgrade, custom_domain, external_issuer] name: Cluster setup (${{ matrix.integration_test }}) + if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork runs-on: ubuntu-18.04 steps: - name: Checkout code - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork uses: actions/checkout@v2 - name: Docker SSH setup - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork run: | mkdir -p ~/.ssh/ touch ~/.ssh/id && chmod 600 ~/.ssh/id @@ -207,7 +227,6 @@ jobs: echo "${{ secrets.DOCKER_KNOWN_HOSTS }}" > ~/.ssh/known_hosts ssh linkerd-docker docker version - name: Kind cluster setup - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork env: DOCKER_HOST: ssh://linkerd-docker run: | @@ -225,20 +244,27 @@ jobs: bin/kind create cluster --name=$KIND_CLUSTER --wait=2m --verbosity 3 fi - kind_integration: + # + # Integration tests that run on the docker host are limited by the fact that + # while they all run in separate KinD clusters, they are on the same + # machine. The `strategy` context cannot be conditionally set, so there are + # separate `kind_integration_*` jobs. This allows the `kind_integration_github` + # job to run it's entire matrix in parallel. + # + + kind_integration_host: strategy: max-parallel: 3 matrix: integration_test: [deep, upgrade, helm, helm_upgrade, custom_domain, external_issuer] needs: [docker_pull, docker_build, kind_setup] - name: Integration tests (${{ matrix.integration_test }}) + name: Host int. tests (${{ matrix.integration_test }}) + if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork runs-on: ubuntu-18.04 steps: - name: Checkout code - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork uses: actions/checkout@v2 - name: Docker SSH setup - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork run: | mkdir -p ~/.ssh/ touch ~/.ssh/id && chmod 600 ~/.ssh/id @@ -246,8 +272,14 @@ jobs: echo "${{ secrets.DOCKER_PRIVATE_KEY }}" > ~/.ssh/id echo "${{ secrets.DOCKER_KNOWN_HOSTS }}" > ~/.ssh/known_hosts ssh linkerd-docker docker version + - name: Try to load cached Go modules + uses: actions/cache@v1 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- - name: Kind load docker images - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork run: | TAG="$(CI_FORCE_CLEAN=1 bin/root-tag)" export KIND_CLUSTER=github-$TAG-${{ matrix.integration_test }} @@ -262,7 +294,6 @@ jobs: done EOF - name: Install linkerd CLI - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork env: DOCKER_HOST: ssh://linkerd-docker run: | @@ -275,7 +306,6 @@ jobs: [[ "$TAG" == "$($HOME/.linkerd version --short --client)" ]] echo "Installed Linkerd CLI version: $TAG" - name: Run integration tests - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork env: DOCKER_HOST: ssh://linkerd-docker GITCOOKIE_SH: ${{ secrets.GITCOOKIE_SH }} @@ -302,18 +332,65 @@ jobs: ${{ matrix.integration_test }}_integration_tests ) + kind_integration_github: + strategy: + matrix: + integration_test: [deep, upgrade, helm, helm_upgrade, custom_domain, external_issuer] + needs: [docker_build] + name: GitHub int. tests (${{ matrix.integration_test }}) + if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork + runs-on: ubuntu-18.04 + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Download image archives + uses: actions/download-artifact@v1 + with: + name: image-archives + - name: Try to load cached Go modules + uses: actions/cache@v1 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - name: Setup KinD (default) + if: matrix.integration_test != 'custom_domain' + uses: engineerd/setup-kind@v0.3.0 + with: + version: "v0.6.1" + - name: Setup KinD (custom_domain) + if: matrix.integration_test == 'custom_domain' + uses: engineerd/setup-kind@v0.3.0 + with: + config: test/testdata/custom_cluster_domain_config.yaml + version: "v0.6.1" + - name: Load image archives into KinD + run: | + for img in controller grafana proxy web; do + kind load image-archive image-archives/$img.tar + done + - name: Install linkerd CLI + run: | + cp image-archives/linkerd $HOME/.linkerd + chmod +x $HOME/.linkerd + - name: Run integration tests + run: | + . bin/_test-run.sh + init_test_run $HOME/.linkerd + ${{ matrix.integration_test }}_integration_tests + kind_cleanup: - if: always() strategy: fail-fast: false # always attempt to cleanup all clusters matrix: integration_test: [deep, upgrade, helm, helm_upgrade, custom_domain, external_issuer] - needs: [kind_integration] + needs: [kind_integration_host] name: Cluster cleanup (${{ matrix.integration_test }}) + if: always() && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) runs-on: ubuntu-18.04 steps: - name: Checkout code - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork uses: actions/checkout@v2 # for debugging - name: Dump env @@ -328,7 +405,6 @@ jobs: JOB_CONTEXT: ${{ toJson(job) }} run: echo "$JOB_CONTEXT" - name: Docker SSH setup - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork run: | mkdir -p ~/.ssh/ touch ~/.ssh/id && chmod 600 ~/.ssh/id @@ -337,7 +413,6 @@ jobs: echo "${{ secrets.DOCKER_KNOWN_HOSTS }}" > ~/.ssh/known_hosts ssh linkerd-docker docker version - name: Kind cluster cleanup - if: github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork env: DOCKER_HOST: ssh://linkerd-docker run: | @@ -353,14 +428,13 @@ jobs: docker_deploy: name: Docker deploy + if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') runs-on: ubuntu-18.04 - needs: [validate_go_deps, go_unit_tests, go_lint, js_unit_tests, kind_integration, kind_cleanup] + needs: [validate_go_deps, go_unit_tests, go_lint, js_unit_tests, kind_integration_host, kind_cleanup] steps: - name: Checkout code - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') uses: actions/checkout@v2 - name: Configure gcloud - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') env: CLOUDSDK_CORE_DISABLE_PROMPTS: "1" CLOUD_SDK_SERVICE_ACCOUNT_KEY: ${{ secrets.CLOUD_SDK_SERVICE_ACCOUNT_KEY }} @@ -384,7 +458,6 @@ jobs: gcloud auth configure-docker bin/kubectl version --short - name: Docker SSH setup - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') run: | mkdir -p ~/.ssh/ touch ~/.ssh/id && chmod 600 ~/.ssh/id @@ -393,7 +466,6 @@ jobs: echo "${{ secrets.DOCKER_KNOWN_HOSTS }}" > ~/.ssh/known_hosts ssh linkerd-docker docker version - name: Docker push - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') env: DOCKER_HOST: ssh://linkerd-docker run: | @@ -406,14 +478,13 @@ jobs: cloud_integration: name: Cloud integration tests + if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') runs-on: ubuntu-18.04 needs: [docker_deploy] steps: - name: Checkout code - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') uses: actions/checkout@v2 - name: Configure gcloud - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') env: CLOUDSDK_CORE_DISABLE_PROMPTS: "1" CLOUD_SDK_SERVICE_ACCOUNT_KEY: ${{ secrets.CLOUD_SDK_SERVICE_ACCOUNT_KEY }} @@ -437,7 +508,6 @@ jobs: gcloud auth configure-docker bin/kubectl version --short - name: Install linkerd CLI - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') run: | TAG="$(CI_FORCE_CLEAN=1 bin/root-tag)" image="gcr.io/linkerd-io/cli-bin:$TAG" @@ -448,7 +518,6 @@ jobs: [[ "$TAG" == "$($HOME/.linkerd version --short --client)" ]] echo "Installed Linkerd CLI version: $TAG" - name: Run integration tests - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') env: GITCOOKIE_SH: ${{ secrets.GITCOOKIE_SH }} run: | @@ -457,22 +526,19 @@ jobs: version="$($HOME/.linkerd version --client --short | tr -cd '[:alnum:]-')" bin/test-run $HOME/.linkerd linkerd-$version - name: CNI tests - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') run: | export TAG="$($HOME/.linkerd version --client --short)" go test -cover -race -v -mod=readonly ./cni-plugin/test -integration-tests cloud_cleanup: - if: always() + if: always() && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags')) name: Cloud cleanup runs-on: ubuntu-18.04 needs: [cloud_integration] steps: - name: Checkout code - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') uses: actions/checkout@v2 - name: Configure gcloud - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') env: CLOUDSDK_CORE_DISABLE_PROMPTS: "1" CLOUD_SDK_SERVICE_ACCOUNT_KEY: ${{ secrets.CLOUD_SDK_SERVICE_ACCOUNT_KEY }} @@ -495,7 +561,6 @@ jobs: gcloud auth configure-docker bin/kubectl version --short - name: Cleanup - if: github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags') run: | export PATH="`pwd`/bin:$PATH" bin/test-cleanup @@ -507,14 +572,13 @@ jobs: chart_deploy: name: Helm chart deploy + if: startsWith(github.ref, 'refs/tags') runs-on: ubuntu-18.04 needs: [cloud_integration] steps: - name: Checkout code - if: startsWith(github.ref, 'refs/tags') uses: actions/checkout@v2 - name: Configure gsutils - if: startsWith(github.ref, 'refs/tags') env: CLOUDSDK_CORE_DISABLE_PROMPTS: "1" CLOUD_SDK_SERVICE_ACCOUNT_KEY: ${{ secrets.LINKERD_SITE_TOKEN }}