From 7b6f23ee7e14cb09d1ac89ce70a4dcd5d79ce44a Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Wed, 20 Jul 2022 13:36:00 +0300 Subject: [PATCH] workflows: move docker push logic to the Build workflow publish_to_dockerhub.yml duplicated build.yml and run_tests.yml in many ways. We always want to build docker images, it's just that we don't push them on every occasion and there is some additional logic around the latest tag. We also want to publish multiarch images now, so all of this logic better be consolidated in one workflow. It doesn't depend on tests, since we only publish on release or on manual run, so it's known to be good. --- .github/workflows/build.yml | 45 +++++- .github/workflows/publish_to_dockerhub.yml | 169 --------------------- 2 files changed, 41 insertions(+), 173 deletions(-) delete mode 100644 .github/workflows/publish_to_dockerhub.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5c5be923..9d2f47d63 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,12 +8,28 @@ on: paths-ignore: - 'scripts/**' - '**/*.md' + push: + # Build for the master branch. + branches: + - master + release: + # Publish released commit as Docker `latest` and `git_revision` images. + types: + - published workflow_dispatch: inputs: ref: description: 'Ref to build CLI for Ubuntu and Windows Server Core [default: latest master; examples: v0.92.0, 0a4ff9d3e4a9ab432fd5812eb18c98e03b5a7432]' required: false default: '' + push_image: + description: 'Push images to DockerHub [default: false; examples: true, false]' + required: false + default: 'false' + use_latest_tag: + description: 'Use `latest` tag while pushing images to DockerHub (applied to Ubuntu image only) [default: false; examples: true, false]' + required: false + default: 'false' env: GO111MODULE: "on" @@ -65,7 +81,7 @@ jobs: build_image: needs: build_cli - name: Build Docker image + name: Build and push docker image runs-on: ubuntu-20.04 steps: @@ -81,23 +97,34 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Set vars id: setvars run: make gh-docker-vars + - name: Set latest tag + id: setlatest + if: ${{ (github.event_name == 'release' && github.event.release.target_commitish == 'master') || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true' && github.event.inputs.use_latest_tag == 'true') }} + run: echo "::set-output name=latest::,${{ steps.setvars.outputs.repo }}:latest" + - name: Build and push uses: docker/build-push-action@v3 with: - push: false + push: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} platforms: linux/amd64,linux/arm64 build-args: | REPO=${{ steps.setvars.outputs.repo }} VERSION=${{ steps.setvars.outputs.version }} - tags: ${{ steps.setvars.outputs.repo }}:${{ steps.setvars.outputs.version }}${{ steps.setvars.outputs.suffix }} + tags: ${{ steps.setvars.outputs.repo }}:${{ steps.setvars.outputs.version }}${{ steps.setvars.outputs.suffix }}${{ steps.setlatest.outputs.latest }} build_image_wsc: needs: build_cli - name: Build Docker image (Windows Server Core) + name: Build and push docker image (Windows Server Core) runs-on: windows-2022 steps: @@ -112,5 +139,15 @@ jobs: with: go-version: 1.18 + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Build Docker image run: make image + + - name: Push image to registry + if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} + run: make image-push diff --git a/.github/workflows/publish_to_dockerhub.yml b/.github/workflows/publish_to_dockerhub.yml deleted file mode 100644 index d8cf5e969..000000000 --- a/.github/workflows/publish_to_dockerhub.yml +++ /dev/null @@ -1,169 +0,0 @@ -name: Push images to DockerHub - -# Controls when the action will run. -on: - push: - # Publish `master` as Docker `latest` and `git_revision` images. - branches: - - master - release: - # Publish released commit as Docker `latest` and `git_revision` images. - types: - - published - - # Allows to run this workflow manually from the Actions tab. - workflow_dispatch: - inputs: - ref: - description: 'Ref to build Docker images for Ubuntu and Windows Server Core [default: latest master; examples: v0.92.0, 0a4ff9d3e4a9ab432fd5812eb18c98e03b5a7432]' - required: false - default: '' - push_image: - description: 'Push images to DockerHub [default: false; examples: true, false]' - required: false - default: 'false' - use_latest_tag: - description: 'Use `latest` tag while pushing images to DockerHub (applied to Ubuntu image only) [default: false; examples: true, false]' - required: false - default: 'false' - -# Environment variables. -env: - GO111MODULE: "on" - -# A workflow run. -jobs: - tests_ubuntu: - name: Run Ubuntu-based tests before publishing - runs-on: ubuntu-20.04 - - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.inputs.ref }} - # Allows to fetch all history for all branches and tags. Need this for proper versioning. - fetch-depth: 0 - - - name: Sync VM submodule - run: | - git submodule sync - git submodule update --init - - - name: Set up Go - uses: actions/setup-go@v2 - with: - go-version: 1.18 - - - name: Restore go modules from cache - uses: actions/cache@v2 - with: - path: /home/runner/go/pkg/mod - key: deps-${{ hashFiles('go.sum') }} - - - name: Update Go modules - run: go mod download -json - - - name: Run tests - run: make test - publish_ubuntu: - # Ensure test job passes before pushing image. - needs: tests_ubuntu - name: Publish Ubuntu-based image to DockerHub - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.inputs.ref }} - # Allows to fetch all history for all branches and tags. Need this for proper versioning. - fetch-depth: 0 - - - name: Set up Go - uses: actions/setup-go@v2 - with: - go-version: 1.18 - - - name: Build image - run: make image - - - name: Build image with 'latest' tag - if: ${{ (github.event_name == 'release' && github.event.release.target_commitish == 'master') || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true' && github.event.inputs.use_latest_tag == 'true') }} - run: make image-latest - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Push image to registry - if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} - run: make image-push - - - name: Push image with 'latest' tag to registry - if: ${{ (github.event_name == 'release' && github.event.release.target_commitish == 'master') || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true' && github.event.inputs.use_latest_tag == 'true') }} - run: make image-push-latest - - tests_wsc: - name: Run WindowsServerCore-based tests before publishing - runs-on: windows-2022 - - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.inputs.ref }} - # Allows to fetch all history for all branches and tags. Need this for proper versioning. - fetch-depth: 0 - - - name: Sync VM submodule - run: | - git submodule sync - git submodule update --init - - - name: Set up Go - uses: actions/setup-go@v2 - with: - go-version: 1.18 - - - name: Restore go modules from cache - uses: actions/cache@v2 - with: - path: /home/runner/go/pkg/mod - key: deps-${{ hashFiles('go.sum') }} - - - name: Update Go modules - run: go mod download -json - - - name: Run tests - run: make test - publish_wsc: - # Ensure test job passes before pushing image. - needs: tests_wsc - name: Publish WindowsServerCore-based image to DockerHub - runs-on: windows-2022 - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.inputs.ref }} - # Allows to fetch all history for all branches and tags. Need this for proper versioning. - fetch-depth: 0 - - - name: Show docker images - run: docker images - - - name: Set up Go - uses: actions/setup-go@v2 - with: - go-version: 1.18 - - - name: Build image - run: make image - - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Push image to registry - if: ${{ github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.push_image == 'true') }} - run: make image-push