| name: Publish Docker image (Multi Registries, native amd64+arm64) |
|
|
| on: |
| push: |
| tags: |
| - '*' |
| workflow_dispatch: |
| inputs: |
| tag: |
| description: 'Tag name to build (e.g., v0.10.8-alpha.3)' |
| required: true |
| type: string |
|
|
| jobs: |
| build_single_arch: |
| name: Build & push (${{ matrix.arch }}) [native] |
| strategy: |
| fail-fast: false |
| matrix: |
| include: |
| - arch: amd64 |
| platform: linux/amd64 |
| runner: ubuntu-latest |
| - arch: arm64 |
| platform: linux/arm64 |
| runner: ubuntu-24.04-arm |
| runs-on: ${{ matrix.runner }} |
|
|
| permissions: |
| packages: write |
| contents: read |
|
|
| steps: |
| - name: Check out |
| uses: actions/checkout@v4 |
| with: |
| fetch-depth: ${{ github.event_name == 'workflow_dispatch' && 0 || 1 }} |
| ref: ${{ github.event.inputs.tag || github.ref }} |
|
|
| - name: Resolve tag & write VERSION |
| run: | |
| if [ -n "${{ github.event.inputs.tag }}" ]; then |
| TAG="${{ github.event.inputs.tag }}" |
| # Verify tag exists |
| if ! git rev-parse "refs/tags/$TAG" >/dev/null 2>&1; then |
| echo "Error: Tag '$TAG' does not exist in the repository" |
| exit 1 |
| fi |
| else |
| TAG=${GITHUB_REF#refs/tags/} |
| fi |
| echo "TAG=$TAG" >> $GITHUB_ENV |
| echo "$TAG" > VERSION |
| echo "Building tag: $TAG for ${{ matrix.arch }}" |
| |
|
|
| |
| |
|
|
| - name: Set up Docker Buildx |
| uses: docker/setup-buildx-action@v3 |
|
|
| - name: Log in to Docker Hub |
| uses: docker/login-action@v3 |
| with: |
| username: ${{ secrets.DOCKERHUB_USERNAME }} |
| password: ${{ secrets.DOCKERHUB_TOKEN }} |
|
|
| |
| |
| |
| |
| |
| |
|
|
| - name: Extract metadata (labels) |
| id: meta |
| uses: docker/metadata-action@v5 |
| with: |
| images: | |
| calciumion/new-api |
| |
|
|
| - name: Build & push single-arch (to both registries) |
| uses: docker/build-push-action@v6 |
| with: |
| context: . |
| platforms: ${{ matrix.platform }} |
| push: true |
| tags: | |
| calciumion/new-api:${{ env.TAG }}-${{ matrix.arch }} |
| calciumion/new-api:latest-${{ matrix.arch }} |
| |
| |
| labels: ${{ steps.meta.outputs.labels }} |
| cache-from: type=gha |
| cache-to: type=gha,mode=max |
| provenance: false |
| sbom: false |
|
|
| create_manifests: |
| name: Create multi-arch manifests (Docker Hub) |
| needs: [build_single_arch] |
| runs-on: ubuntu-latest |
| if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' |
| steps: |
| - name: Extract tag |
| run: | |
| if [ -n "${{ github.event.inputs.tag }}" ]; then |
| echo "TAG=${{ github.event.inputs.tag }}" >> $GITHUB_ENV |
| else |
| echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV |
| fi |
| |
| |
| |
|
|
| - name: Log in to Docker Hub |
| uses: docker/login-action@v3 |
| with: |
| username: ${{ secrets.DOCKERHUB_USERNAME }} |
| password: ${{ secrets.DOCKERHUB_TOKEN }} |
|
|
| - name: Create & push manifest (Docker Hub - version) |
| run: | |
| docker buildx imagetools create \ |
| -t calciumion/new-api:${TAG} \ |
| calciumion/new-api:${TAG}-amd64 \ |
| calciumion/new-api:${TAG}-arm64 |
| |
| - name: Create & push manifest (Docker Hub - latest) |
| run: | |
| docker buildx imagetools create \ |
| -t calciumion/new-api:latest \ |
| calciumion/new-api:latest-amd64 \ |
| calciumion/new-api:latest-arm64 |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|