diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3a99fbc..94846a8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,59 +1,163 @@ name: Publish Docker image + on: workflow_dispatch: release: types: [published] + +env: + # Use docker.io for Docker Hub if empty + REGISTRY: ghcr.io + # github.repository as / + IMAGE_NAME: ${{ github.repository }} + jobs: - push_to_registry: + build: name: Push Docker image to GitHub Packages runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Prepare tags - id: prepare_tags + name: Prepare run: | - REPOSITORY=ghcr.io - DOCKER_IMAGE=tchapi/davis - VERSION=edge - if [[ $GITHUB_REF == refs/tags/* ]]; then - VERSION=${GITHUB_REF#refs/tags/} - fi - TAGS="${REPOSITORY}/${DOCKER_IMAGE}:${VERSION}" - if [ "${{ github.event_name }}" = "push" ]; then - TAGS="$TAGS,${REPOSITORY}/${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}" - fi - echo "version=${VERSION}" >> $GITHUB_OUTPUT - echo "tags=${TAGS}" >> $GITHUB_OUTPUT - echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + - + name: Checkout + uses: actions/checkout@v4 + + - + name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + context: git + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + # "Push by digest" needs an untagged ref + tags: | + type=raw,value= + + # - + # name: Prepare tags + # id: prepare_tags + # run: | + # REPOSITORY=ghcr.io + # DOCKER_IMAGE=tchapi/davis + # VERSION=edge + # if [[ $GITHUB_REF == refs/tags/* ]]; then + # VERSION=${GITHUB_REF#refs/tags/} + # fi + # TAGS="${REPOSITORY}/${DOCKER_IMAGE}:${VERSION}" + # if [ "${{ github.event_name }}" = "push" ]; then + # TAGS="$TAGS,${REPOSITORY}/${DOCKER_IMAGE}:sha-${GITHUB_SHA::8}" + # fi + # echo "version=${VERSION}" >> $GITHUB_OUTPUT + # echo "tags=${TAGS}" >> $GITHUB_OUTPUT + # echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 + - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + name: Login to GitHub Container Registry (${{ env.REGISTRY }}) + uses: docker/login-action@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} + - - name: Build and Push to GitHub Packages - id: docker_build - uses: docker/build-push-action@v3 + name: Build and Push by digest + id: build + uses: docker/build-push-action@v5 with: - platforms: linux/amd64,linux/arm64 + context: . file: docker/Dockerfile - pull: true - push: true - tags: ${{ steps.prepare_tags.outputs.tags }} - labels: | - org.opencontainers.image.source=${{ github.event.repository.html_url }} - org.opencontainers.image.created=${{ steps.prepare_tags.outputs.created }} - org.opencontainers.image.version=${{ steps.prepare_tags.outputs.version }} - org.opencontainers.image.revision=${{ github.sha }} + platforms: ${{ matrix.platform }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + annotations: ${{ steps.meta.outputs.annotations }} + outputs: type=image,name=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true + # pull: true + # push: true + # annotations: ${{ steps.meta.outputs.labels }} + # tags: ${{ steps.meta.outputs.tags }} + # labels: ${{ steps.meta.outputs.labels }} + # tags: ${{ steps.prepare_tags.outputs.tags }} + # labels: | + # org.opencontainers.image.source=${{ github.event.repository.html_url }} + # org.opencontainers.image.created=${{ steps.prepare_tags.outputs.created }} + # org.opencontainers.image.version=${{ steps.prepare_tags.outputs.version }} + # org.opencontainers.image.revision=${{ github.sha }} + - + name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + - + name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: + - build + steps: + - + name: Checkout # needed to get the git information + uses: actions/checkout@v4 + + - + name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - + name: Docker meta + # if: github.event_name == 'push' || github.event_name == 'pull_request' && github.event.pull_request. ... == + id: meta + uses: docker/metadata-action@v5 + with: + context: git + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + # type=sha + tags: | + type=semver,pattern=test{{version}} + type=edge + - + name: Login to Docker Hub + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - + 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 }}/${{ env.IMAGE_NAME }}@sha256:%s ' *) + - + name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }} \ No newline at end of file