name: Publish to Docker Hub on: release: types: [published] permissions: contents: read jobs: build: name: Build (${{ matrix.platform }}) runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: include: - platform: linux/amd64 platform_pair: linux-amd64 runner: ubuntu-latest - platform: linux/arm64 platform_pair: linux-arm64 runner: ubuntu-24.04-arm env: IMAGE_NAME: diegosouzapw/omniroute steps: - name: Checkout uses: actions/checkout@v6 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push by digest id: build uses: docker/build-push-action@v6 with: context: . target: runner-base platforms: ${{ matrix.platform }} outputs: type=image,name=${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true cache-from: type=gha,scope=omniroute-runner-base-${{ matrix.platform_pair }} cache-to: type=gha,mode=max,scope=omniroute-runner-base-${{ matrix.platform_pair }} - name: Export digest run: | mkdir -p "${{ runner.temp }}/digests" digest="${{ steps.build.outputs.digest }}" touch "${{ runner.temp }}/digests/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v7 with: name: digests-${{ matrix.platform_pair }} path: ${{ runner.temp }}/digests/* if-no-files-found: error retention-days: 1 merge: name: Merge manifest and publish tags runs-on: ubuntu-latest needs: build env: IMAGE_NAME: diegosouzapw/omniroute steps: - name: Checkout uses: actions/checkout@v6 - name: Extract version from release tag id: version run: | VERSION="${GITHUB_REF_NAME}" VERSION="${VERSION#v}" echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "Publishing Docker image version: $VERSION" - name: Download digests uses: actions/download-artifact@v8 with: path: ${{ runner.temp }}/digests pattern: digests-* merge-multiple: true - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Create manifest list and push working-directory: ${{ runner.temp }}/digests run: | docker buildx imagetools create \ -t "${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}" \ -t "${{ env.IMAGE_NAME }}:latest" \ $(printf '${{ env.IMAGE_NAME }}@sha256:%s ' *) - name: Inspect image run: | docker buildx imagetools inspect "${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}" - name: Update Docker Hub description uses: peter-evans/dockerhub-description@v5 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} repository: diegosouzapw/omniroute short-description: "OmniRoute — Unified AI proxy. Route any LLM through one endpoint." readme-filepath: ./README.md