diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index a69fedb82..2bdc23d47 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -10,33 +10,141 @@ env: IMAGE_NAME: ${{ github.repository }} jobs: - build: + prepare: runs-on: ubuntu-latest + outputs: + image_name: ${{ steps.lowercase.outputs.image_name }} + steps: + - name: Set lowercase image name + id: lowercase + run: echo "image_name=$(echo '${{ env.IMAGE_NAME }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT + + build-amd64: + runs-on: ubuntu-latest + needs: prepare permissions: contents: read packages: write + outputs: + digest: ${{ steps.build.outputs.digest }} steps: - - uses: actions/checkout@v4 - - name: 'Login to GitHub Container Registry' - uses: docker/login-action@v1 + - uses: actions/checkout@v6 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 with: - registry: ghcr.io - username: ${{github.actor}} - password: ${{secrets.GITHUB_TOKEN}} + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - name: Docker meta id: meta uses: docker/metadata-action@v5 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + images: ${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build and push (amd64) + id: build + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/amd64 + outputs: type=image,name=${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }},push-by-digest=true,name-canonical=true,push=true + labels: ${{ steps.meta.outputs.labels }} + + build-arm64: + runs-on: ubuntu-24.04-arm + needs: prepare + permissions: + contents: read + packages: write + outputs: + digest: ${{ steps.build.outputs.digest }} + steps: + - uses: actions/checkout@v6 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build and push (arm64) + id: build + uses: docker/build-push-action@v6 + with: + context: . + platforms: linux/arm64 + outputs: type=image,name=${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }},push-by-digest=true,name-canonical=true,push=true + labels: ${{ steps.meta.outputs.labels }} + + build-armv7: + runs-on: ubuntu-24.04-arm + needs: prepare + permissions: + contents: read + packages: write + outputs: + digest: ${{ steps.build.outputs.digest }} + steps: + - uses: actions/checkout@v6 + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }} - 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 - uses: docker/build-push-action@v5 + - name: Build and push (arm/v7) + id: build + uses: docker/build-push-action@v6 with: context: . - platforms: linux/amd64,linux/arm64,linux/arm/v7 - push: true - tags: ${{ steps.meta.outputs.tags }} + platforms: linux/arm/v7 + outputs: type=image,name=${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }},push-by-digest=true,name-canonical=true,push=true labels: ${{ steps.meta.outputs.labels }} + + merge: + runs-on: ubuntu-latest + needs: + - prepare + - build-amd64 + - build-arm64 + - build-armv7 + permissions: + contents: read + packages: write + steps: + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }} + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Create and push multi-arch manifest + run: | + docker buildx imagetools create \ + $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + ${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }}@${{ needs.build-amd64.outputs.digest }} \ + ${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }}@${{ needs.build-arm64.outputs.digest }} \ + ${{ env.REGISTRY }}/${{ needs.prepare.outputs.image_name }}@${{ needs.build-armv7.outputs.digest }} diff --git a/Dockerfile b/Dockerfile index 93afb73f9..14d4afb22 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM php:8.3-apache +FROM php:8.4-apache ENV CI_ENV=docker COPY --from=ghcr.io/mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/