diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index a7ec77b79..6ccb97049 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -22,28 +22,47 @@ concurrency: env: DOCKER_NAMESPACE: halfshot - PLATFORMS: linux/amd64 - PLATFORMS_PUSH: linux/amd64,linux/arm64 - # Only push if this is main, otherwise we just want to build - BUILD_FOR_ALL_PLATFORMS: ${{ github.ref == 'refs/heads/main' || github.event_name == 'release' }} jobs: - docker-latest: + docker-clean-metadata: runs-on: ubuntu-latest + outputs: + json: ${{ steps.meta.outputs.json }} + steps: + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + tags: | + type=semver,pattern={{version}} + type=ref,event=branch + type=ref,event=pr + type=raw,value=latest,enable={{is_default_branch}} + flavor: | + latest=auto + images: | + ${{ env.DOCKER_NAMESPACE }}/matrix-hookshot + ghcr.io/matrix-org/matrix-hookshot + docker-build: permissions: contents: read packages: write attestations: write id-token: write + strategy: + matrix: + include: + - os: ubuntu-latest + arch: amd64 + - os: ubuntu-24.04-arm + arch: arm64 + + runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - name: Log in to Docker Hub uses: docker/login-action@v3 with: @@ -55,7 +74,6 @@ jobs: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 @@ -65,20 +83,45 @@ jobs: type=ref,event=branch type=ref,event=pr type=raw,value=latest,enable={{is_default_branch}} + flavor: | + latest=auto + suffix=-${{ matrix.arch }},onlatest=true images: | ${{ env.DOCKER_NAMESPACE }}/matrix-hookshot ghcr.io/matrix-org/matrix-hookshot - + - name: Build and push Docker images - id: push uses: docker/build-push-action@v6 with: - context: . - # arm64 builds OOM without the git fetch setting. c.f. - # https://github.com/rust-lang/cargo/issues/10583 - build-args: | - CARGO_NET_GIT_FETCH_WITH_CLI=true - platforms: ${{ (env.BUILD_FOR_ALL_PLATFORMS == 'true' && env.PLATFORMS_PUSH) || env.PLATFORMS }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} + + docker-manifest: + needs: + - docker-build + - docker-clean-metadata + runs-on: ubuntu-latest + + strategy: + matrix: + image: ${{ fromJson(needs.docker-clean-metadata.outputs.json).tags }} + + steps: + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_TOKEN }} + + - name: Log in to the GitHub Container registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create and push manifest + run: | + docker manifest create ${{ matrix.image }} ${{ matrix.image }}-amd64 ${{ matrix.image }}-arm64 + docker manifest push ${{ matrix.image }} \ No newline at end of file diff --git a/changelog.d/1008.misc b/changelog.d/1008.misc new file mode 100644 index 000000000..27c5542fb --- /dev/null +++ b/changelog.d/1008.misc @@ -0,0 +1 @@ +Switch to using GitHub Actions native arm runners for Docker builds, which will reduce build times.