name: Build and Publish Docker Image on: push: tags: - "v*" env: REGISTRY: ghcr.io IMAGE_NAME: krau/saveany-bot concurrency: group: docker-build-${{ github.repository }} cancel-in-progress: true jobs: prepare: runs-on: ubuntu-latest permissions: contents: read packages: write outputs: tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} version: ${{ steps.args.outputs.version }} git_commit: ${{ steps.args.outputs.git_commit }} build_time: ${{ steps.args.outputs.build_time }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Extract metadata for Docker id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=sha type=raw,value=latest - name: Extract Dockerfile args id: args run: | echo "git_commit=$(git rev-parse --short HEAD)" >> "$GITHUB_OUTPUT" echo "build_time=$(git show -s --format=%cI)" >> "$GITHUB_OUTPUT" build: needs: prepare permissions: contents: read packages: write strategy: matrix: arch: [amd64, arm64] type: [default, micro, pico] fail-fast: false runs-on: ${{ matrix.arch == 'amd64' && 'ubuntu-latest' || 'ubuntu-24.04-arm' }} steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Set Dockerfile path id: dockerfile run: | if [ "${{ matrix.type }}" == "default" ]; then echo "DOCKERFILE=./Dockerfile" >> "$GITHUB_OUTPUT" elif [ "${{ matrix.type }}" == "micro" ]; then echo "DOCKERFILE=./Dockerfile.micro" >> "$GITHUB_OUTPUT" else echo "DOCKERFILE=./Dockerfile.pico" >> "$GITHUB_OUTPUT" - name: Set image tags id: tags run: | if [ "${{ matrix.type }}" == "default" ]; then TAGS="${{ needs.prepare.outputs.tags }}" elif [ "${{ matrix.type }}" == "micro" ]; then TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:micro,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:micro-latest,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:micro-${{ needs.prepare.outputs.version }}" else TAGS="${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:pico,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:pico-latest,${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:pico-${{ needs.prepare.outputs.version }}" fi echo "TAGS=$TAGS" >> "$GITHUB_OUTPUT" - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . file: ${{ steps.dockerfile.outputs.DOCKERFILE }} platforms: ${{ matrix.arch == 'amd64' && 'linux/amd64' || 'linux/arm64' }} push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.tags.outputs.TAGS }} labels: ${{ needs.prepare.outputs.labels }} cache-from: | type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ matrix.type }}-latest type=gha cache-to: type=gha,mode=max build-args: | VERSION=${{ needs.prepare.outputs.version }} GitCommit=${{ needs.prepare.outputs.git_commit }} BuildTime=${{ needs.prepare.outputs.build_time }}