name: Build Docker Image on: push: branches: - main schedule: - cron: '@monthly' jobs: build-amd64: runs-on: linux_amd name: Build AMD64 container: image: catthehacker/ubuntu:act-latest env: RUNNER_TOOL_CACHE: /toolcache strategy: matrix: python-version: ['3.10', '3.11', '3.12', '3.13'] outputs: digest-3-10: ${{ steps.digest.outputs.DIGEST_3_10 }} digest-3-11: ${{ steps.digest.outputs.DIGEST_3_11 }} digest-3-12: ${{ steps.digest.outputs.DIGEST_3_12 }} digest-3-13: ${{ steps.digest.outputs.DIGEST_3_13 }} steps: - name: Checkout uses: actions/checkout@v4 with: github-server-url: https://gitea.technocloud.ee - name: Set up Docker BuildX uses: docker/setup-buildx-action@v3 with: platforms: linux/amd64 - name: Login to DockerHub uses: docker/login-action@v3 with: registry: gitea.technocloud.ee username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Get Meta id: meta run: | echo "REPO_NAME=${GITHUB_REPOSITORY}" >> $GITHUB_OUTPUT - name: Build and Push AMD64 id: build-docker uses: docker/build-push-action@v5 with: context: . file: Dockerfile.python${{ matrix.python-version }} platforms: linux/amd64 push: true provenance: false outputs: type=image,name=gitea.technocloud.ee/${{ steps.meta.outputs.REPO_NAME }},push-by-digest=true - name: Summarize the Docker digest id: digest run: | PY_VERSION=${{ matrix.python-version }} PY_VERSION_MOD=$(echo $PY_VERSION | sed 's/\./_/g') echo DIGEST_${PY_VERSION_MOD}="${{ steps.build-docker.outputs.digest }}" >> $GITHUB_OUTPUT build-arm64: runs-on: ubuntu-latest name: Build ARM64 container: image: catthehacker/ubuntu:act-latest env: RUNNER_TOOL_CACHE: /toolcache strategy: matrix: python-version: ['3.10', '3.11', '3.12', '3.13'] outputs: digest-3-10: ${{ steps.digest.outputs.DIGEST_3_10 }} digest-3-11: ${{ steps.digest.outputs.DIGEST_3_11 }} digest-3-12: ${{ steps.digest.outputs.DIGEST_3_12 }} digest-3-13: ${{ steps.digest.outputs.DIGEST_3_13 }} steps: - name: Checkout uses: actions/checkout@v4 with: github-server-url: https://gitea.technocloud.ee - name: Set up Docker BuildX uses: docker/setup-buildx-action@v3 with: platforms: linux/arm64 - name: Login to DockerHub uses: docker/login-action@v3 with: registry: gitea.technocloud.ee username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Get Meta id: meta run: | echo "REPO_NAME=${GITHUB_REPOSITORY}" >> $GITHUB_OUTPUT - name: Build and Push ARM64 id: build-docker uses: docker/build-push-action@v6 with: context: . file: Dockerfile.python${{ matrix.python-version }} platforms: linux/arm64 push: true provenance: false outputs: type=image,name=gitea.technocloud.ee/${{ steps.meta.outputs.REPO_NAME }},push-by-digest=true - name: Summarize the Docker digest id: digest run: | PY_VERSION=${{ matrix.python-version }} PY_VERSION_MOD=$(echo $PY_VERSION | sed 's/\./_/g') echo DIGEST_${PY_VERSION_MOD}="${{ steps.build-docker.outputs.digest }}" echo DIGEST_${PY_VERSION_MOD}="${{ steps.build-docker.outputs.digest }}" >> $GITHUB_OUTPUT create-manifest: needs: [build-arm64, build-amd64] runs-on: ubuntu-latest name: Create Multi-arch Manifest strategy: matrix: python-version: ['3.10', '3.11', '3.12', '3.13'] steps: - name: Login to Docker Registry uses: docker/login-action@v3 with: registry: gitea.technocloud.ee username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Set up Docker BuildX uses: docker/setup-buildx-action@v3 with: driver: docker-container - name: Get Repository Metadata id: meta run: | echo "PACKAGE=gitea.technocloud.ee/${GITHUB_REPOSITORY}" >> $GITHUB_OUTPUT echo "PY_VERSION=digest-$(echo ${{ matrix.python-version }} | sed 's/\./-/g')" >> $GITHUB_OUTPUT - name: Create and Push Multi-arch Manifest run: | echo '${{ toJSON(needs.build-arm64.outputs) }}' echo '${{ toJSON(needs.build-amd64.outputs) }}' echo '${{ steps.meta.outputs.PY_VERSION }}' ARM_DIGEST=${{ needs.build-arm64.outputs[steps.meta.outputs.PY_VERSION] }} AMD_DIGEST=${{ needs.build-amd64.outputs[steps.meta.outputs.PY_VERSION] }} IMAGE_NAME=${{ steps.meta.outputs.PACKAGE }}:python${{ matrix.python-version }} docker manifest create $IMAGE_NAME --amend ${{ steps.meta.outputs.PACKAGE }}@${ARM_DIGEST} --amend ${{ steps.meta.outputs.PACKAGE }}@${AMD_DIGEST} docker manifest push $IMAGE_NAME