diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7fbfae7c2..46c7f729f 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,69 +1,54 @@ name: Publish Docker Image -on: +on: push: - branches: [master] + branches: [ master ] + tags: + - '**' -concurrency: +concurrency: group: ${{ github.ref }}-${{ github.workflow }} cancel-in-progress: true +env: + REGISTRY_IMAGE: ghcr.io/metacubex/subconverter:latest + jobs: - amd64_build: - name: Build AMD64 Image - runs-on: ubuntu-latest + build: + strategy: + matrix: + include: + - platform: linux/amd64 + os: ubuntu-latest + - platform: linux/386 + os: ubuntu-latest + - platform: linux/arm/v7 + os: [self-hosted, linux, ARM] + - platform: linux/arm64 + os: [self-hosted, linux, ARM64] + runs-on: ${{ matrix.os }} + name: Build ${{ matrix.platform }} Image steps: + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + - name: Checkout base - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: login to ghcr.io - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Get commit SHA - id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" - - - name: Build and export - id: build - if: github.ref == 'refs/heads/master' - uses: docker/build-push-action@v3 - with: - platforms: linux/amd64 - context: scripts/ - tags: ghcr.io/metacubex/subconverter:latest - build-args: | - SHA=${{ steps.vars.outputs.sha_short }} - outputs: type=image,push=true - - - name: Save digest - if: github.ref == 'refs/heads/master' - run: echo ${{ steps.build.outputs.digest }} > /tmp/digest.txt + uses: docker/setup-buildx-action@v3 - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: digest_amd64 - path: /tmp/digest.txt - - x86_build: - name: Build x86 Image - runs-on: ubuntu-latest - steps: - - name: Checkout base - uses: actions/checkout@v3 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 with: - fetch-depth: 0 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=semver,pattern={{version}} + type=raw,value=latest,enable={{is_default_branch}} - name: login to ghcr.io uses: docker/login-action@v3 @@ -73,105 +58,59 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Get commit SHA - id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" - - - name: Build and export - id: build if: github.ref == 'refs/heads/master' - uses: docker/build-push-action@v3 - with: - platforms: linux/386 - context: scripts/ - tags: ghcr.io/metacubex/subconverter:latest - build-args: | - SHA=${{ steps.vars.outputs.sha_short }} - outputs: type=image,push=true - - - name: Save digest - if: github.ref == 'refs/heads/master' - run: echo ${{ steps.build.outputs.digest }} > /tmp/digest.txt - - - name: Upload artifact - uses: actions/upload-artifact@v3 - with: - name: digest_386 - path: /tmp/digest.txt - - arm64_build: - name: Build ARM64 Image - runs-on: ubuntu-latest - steps: - - name: Checkout base - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: login to ghcr.io - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Get commit SHA id: vars - run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT - name: Build and export id: build - if: github.ref == 'refs/heads/master' - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: - platforms: linux/arm64 + platforms: ${{ matrix.platform }} context: scripts/ - tags: ghcr.io/metacubex/subconverter:latest + labels: ${{ steps.meta.outputs.labels }} build-args: | SHA=${{ steps.vars.outputs.sha_short }} - THREADS=2 - outputs: type=image,push=true + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true - - name: Save digest - if: github.ref == 'refs/heads/master' - run: echo ${{ steps.build.outputs.digest }} > /tmp/digest.txt + - name: Export digest + run: | + rm -rf /tmp/digests + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" - name: Upload artifact - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: digest_arm64 - path: /tmp/digest.txt - build: - name: Build - needs: [amd64_build, x86_build, arm64_build] + name: digest-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + name: Merge + needs: build runs-on: ubuntu-latest steps: - - name: Checkout base - uses: actions/checkout@v3 + - name: Download digests + uses: actions/download-artifact@v4 with: - fetch-depth: 0 - - # https://github.com/docker/setup-qemu-action - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + path: /tmp/digests + pattern: digest-* + merge-multiple: true - # https://github.com/docker/setup-buildx-action - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - with: - config-inline: | - [worker.oci] - max-parallelism = 1 + uses: docker/setup-buildx-action@v3 - - name: Download artifact - uses: actions/download-artifact@v3 + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 with: - path: /tmp/images/ + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=semver,pattern={{version}} + type=raw,value=latest,enable={{is_default_branch}} - name: login to ghcr.io uses: docker/login-action@v3 @@ -180,6 +119,12 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Merge and push manifest on master branch - if: github.ref == 'refs/heads/master' - run: python scripts/merge_manifest.py + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} \ No newline at end of file