From e9c0557562a196a2e7f6b17fc2d7d1a3b1c69f0e Mon Sep 17 00:00:00 2001 From: Jian Zhu <36154065+zhujian7@users.noreply.github.com> Date: Fri, 17 Mar 2023 14:07:57 +0800 Subject: [PATCH] ci: build multi-arch image (#101) Signed-off-by: zhujian --- .github/workflows/go-postsubmit.yml | 39 ++++++++++++-- .github/workflows/go-release.yml | 82 ++++++++++++++++++++++++----- 2 files changed, 105 insertions(+), 16 deletions(-) diff --git a/.github/workflows/go-postsubmit.yml b/.github/workflows/go-postsubmit.yml index 58d573f2d..7632cb1d1 100644 --- a/.github/workflows/go-postsubmit.yml +++ b/.github/workflows/go-postsubmit.yml @@ -16,9 +16,12 @@ defaults: working-directory: go/src/open-cluster-management.io/placement jobs: - verify: + images: name: images runs-on: ubuntu-latest + strategy: + matrix: + arch: [ amd64, arm64 ] steps: - name: checkout code uses: actions/checkout@v3 @@ -31,9 +34,39 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: install imagebuilder run: go install github.com/openshift/imagebuilder/cmd/imagebuilder@v1.2.3 + - name: pull base image + run: docker pull registry.access.redhat.com/ubi8/ubi-minimal:latest --platform=linux/${{ matrix.arch }} - name: images - run: make images + run: | + IMAGE_TAG=latest-${{ matrix.arch }} \ + IMAGE_BUILD_EXTRA_FLAGS="--build-arg OS=linux --build-arg ARCH=${{ matrix.arch }}" \ + make images - name: push run: | echo ${{ secrets.DOCKER_PASSWORD }} | docker login quay.io --username ${{ secrets.DOCKER_USER }} --password-stdin - docker push quay.io/open-cluster-management/placement:latest + docker push quay.io/open-cluster-management/placement:latest-${{ matrix.arch }} + image-manifest: + name: image manifest + runs-on: ubuntu-latest + needs: [ images ] + steps: + - name: checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + path: go/src/open-cluster-management.io/placement + - name: create + run: | + echo ${{ secrets.DOCKER_PASSWORD }} | docker login quay.io --username ${{ secrets.DOCKER_USER }} --password-stdin + docker manifest create quay.io/open-cluster-management/placement:latest \ + quay.io/open-cluster-management/placement:latest-amd64 \ + quay.io/open-cluster-management/placement:latest-arm64 + - name: annotate + run: | + docker manifest annotate quay.io/open-cluster-management/placement:latest \ + quay.io/open-cluster-management/placement:latest-amd64 --arch amd64 + docker manifest annotate quay.io/open-cluster-management/placement:latest \ + quay.io/open-cluster-management/placement:latest-arm64 --arch arm64 + - name: push + run: | + docker manifest push quay.io/open-cluster-management/placement:latest diff --git a/.github/workflows/go-release.yml b/.github/workflows/go-release.yml index 5d2cfbb47..ce22a3ce1 100644 --- a/.github/workflows/go-release.yml +++ b/.github/workflows/go-release.yml @@ -16,9 +16,32 @@ defaults: working-directory: go/src/open-cluster-management.io/placement jobs: - release: - name: release + env: + name: prepare release env runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + path: go/src/open-cluster-management.io/placement + - name: get release version + run: | + echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + - name: get major release version + run: | + echo "MAJOR_RELEASE_VERSION=${RELEASE_VERSION%.*}" >> $GITHUB_ENV + echo "TRIMED_RELEASE_VERSION=${RELEASE_VERSION#v}" >> $GITHUB_ENV + outputs: + MAJOR_RELEASE_VERSION: ${{ env.MAJOR_RELEASE_VERSION }} + RELEASE_VERSION: ${{ env.RELEASE_VERSION }} + images: + name: images + runs-on: ubuntu-latest + needs: [ env ] + strategy: + matrix: + arch: [ amd64, arm64 ] steps: - name: checkout code uses: actions/checkout@v3 @@ -31,24 +54,57 @@ jobs: go-version: ${{ env.GO_VERSION }} - name: install imagebuilder run: go install github.com/openshift/imagebuilder/cmd/imagebuilder@v1.2.3 + - name: pull base image + run: docker pull registry.access.redhat.com/ubi8/ubi-minimal:latest --platform=linux/${{ matrix.arch }} - name: images - run: make images - - name: get release version run: | - echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - name: get major release version - run: | - echo "MAJOR_RELEASE_VERSION=${RELEASE_VERSION%.*}" >> $GITHUB_ENV + IMAGE_TAG=${{ needs.env.outputs.RELEASE_VERSION }}-${{ matrix.arch }} \ + IMAGE_BUILD_EXTRA_FLAGS="--build-arg OS=linux --build-arg ARCH=${{ matrix.arch }}" \ + make images - name: push image run: | echo ${{ secrets.DOCKER_PASSWORD }} | docker login quay.io --username ${{ secrets.DOCKER_USER }} --password-stdin - docker tag quay.io/open-cluster-management/placement:latest quay.io/open-cluster-management/placement:$RELEASE_VERSION - docker push quay.io/open-cluster-management/placement:$RELEASE_VERSION + docker push quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }}-${{ matrix.arch }} + image-manifest: + name: image manifest + runs-on: ubuntu-latest + needs: [ env, images ] + steps: + - name: checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + path: go/src/open-cluster-management.io/placement + - name: create + run: | + echo ${{ secrets.DOCKER_PASSWORD }} | docker login quay.io --username ${{ secrets.DOCKER_USER }} --password-stdin + docker manifest create quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }} \ + quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }}-amd64 \ + quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }}-arm64 + - name: annotate + run: | + docker manifest annotate quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }} \ + quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }}-amd64 --arch amd64 + docker manifest annotate quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }} \ + quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }}-arm64 --arch arm64 + - name: push + run: | + docker manifest push quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }} + release: + name: release + runs-on: ubuntu-latest + needs: [ env, image-manifest ] + steps: + - name: checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 1 + path: go/src/open-cluster-management.io/placement - name: generate changelog run: | - echo "# Placement $RELEASE_VERSION" > /home/runner/work/changelog.txt - echo "- See the [CHANGELOG](https://github.com/open-cluster-management-io/placement/blob/main/CHANGELOG/CHANGELOG-${MAJOR_RELEASE_VERSION}.md) for more details." >> /home/runner/work/changelog.txt - echo "- The released image is quay.io/open-cluster-management/placement:$RELEASE_VERSION" >> /home/runner/work/changelog.txt + echo "# Placement ${{ needs.env.outputs.RELEASE_VERSION }}" > /home/runner/work/changelog.txt + echo "- See the [CHANGELOG](https://github.com/open-cluster-management-io/placement/blob/main/CHANGELOG/CHANGELOG-${{ needs.env.outputs.MAJOR_RELEASE_VERSION }}.md) for more details." >> /home/runner/work/changelog.txt + echo "- The released image is quay.io/open-cluster-management/placement:${{ needs.env.outputs.RELEASE_VERSION }}" >> /home/runner/work/changelog.txt - name: publish release uses: softprops/action-gh-release@v0.1.5 env: