diff --git a/.github/workflows/build_container.yaml b/.github/workflows/build_container.yaml index f96d04d..92eb427 100644 --- a/.github/workflows/build_container.yaml +++ b/.github/workflows/build_container.yaml @@ -16,6 +16,8 @@ on: env: GO_VERSION: "~1.22" IMAGE_NAME: "k8sgpt" + REGISTRY_IMAGE: ghcr.io/k8sgpt-ai/k8sgpt + defaults: run: shell: bash @@ -54,26 +56,89 @@ jobs: NON_FORKED_AND_NON_ROBOT_RUN=${{ ( github.actor != 'renovate[bot]' && github.actor != 'dependabot[bot]' ) && ( github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository ) }} echo "NON_FORKED_AND_NON_ROBOT_RUN=$NON_FORKED_AND_NON_ROBOT_RUN" >> "$GITHUB_OUTPUT" - upload_images: - name: Upload images to ghcr registry + build: + name: Build for ${{ matrix.platform }} needs: prepare_ci_run - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest strategy: + fail-fast: false matrix: - image: - - name: k8sgpt - target: production + platform: + - linux/amd64 + - linux/arm64 env: DATETIME: ${{ needs.prepare_ci_run.outputs.DATETIME }} BUILD_TIME: ${{ needs.prepare_ci_run.outputs.BUILD_TIME }} GIT_SHA: ${{ needs.prepare_ci_run.outputs.GIT_SHA }} - permissions: - packages: write - contents: read steps: - name: Check out code uses: actions/checkout@v4 + - name: Set env pair + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + context: . + file: ./container/Dockerfile + platforms: ${{ matrix.platform }} + target: production + build-args: | + GIT_HASH=${{ env.GIT_SHA }} + RELEASE_VERSION=dev-${{ env.DATETIME }} + BUILD_TIME=${{ env.BUILD_TIME }} + tags: ${{ env.REGISTRY_IMAGE }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,push-by-digest=true,name-canonical=true,push=true + + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests + echo "${{ steps.build.outputs.digest }}" > "${{ runner.temp }}/digests/${{ env.PLATFORM_PAIR }}.digest" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + retention-days: 1 + + merge: + name: Create and Push Manifest List + needs: build + # if: github.event_name == 'push' && needs.prepare_ci_run.outputs.NON_FORKED_AND_NON_ROBOT_RUN == 'true' + runs-on: ubuntu-latest + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true + - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: @@ -82,23 +147,21 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Set up Docker Buildx - id: buildx uses: docker/setup-buildx-action@v3 - - name: Build and push Docker image - uses: docker/build-push-action@v6 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 with: - context: . - file: ./container/Dockerfile - platforms: linux/arm64 - target: ${{ matrix.image.target }} + images: ${{ env.REGISTRY_IMAGE }} tags: | - ghcr.io/k8sgpt-ai/${{ matrix.image.name }}:dev-${{ env.DATETIME }} - build-args: | - GIT_HASH=${{ env.GIT_SHA }} - RELEASE_VERSION=dev-${{ env.DATETIME }} - BUILD_TIME=${{ env.BUILD_TIME }} - builder: ${{ steps.buildx.outputs.name }} - push: true - cache-from: type=gha,scope=${{ github.ref_name }}-${{ matrix.image.name }} - cache-to: type=gha,scope=${{ github.ref_name }}-${{ matrix.image.name }} + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=raw,value=dev-${{ needs.prepare_ci_run.outputs.DATETIME }} + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + digests=$(printf "${{ env.REGISTRY_IMAGE }}@%s " $(cat *.*_