Cut out objects with transparent background in the segmenter #287
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build Docker container image for the segmenter | |
on: | |
push: | |
branches: | |
- 'main' | |
- 'beta' | |
- 'stable' | |
tags: | |
- 'v*' | |
pull_request: | |
merge_group: | |
workflow_dispatch: | |
inputs: | |
git-ref: | |
description: 'Git ref (optional)' | |
required: false | |
env: | |
IMAGE_REGISTRY: ghcr.io/${{ github.repository_owner }} | |
IMAGE_NAME: 'device-backend-processing-segmenter' | |
MAIN_BRANCH: 'main' # pushing to this branch will update the "edge" tag on the image | |
BETA_BRANCH: 'beta' # pushing to this branch will update the "beta" tag on the image | |
STABLE_BRANCH: 'stable' # pushing to this branch will update the "stable" tag on the image | |
TAG_PREFIX: 'v' # pushing tags with this prefix will add a version tag to the image and update the "latest" tag on the image | |
PUSH_IMAGE: ${{ (github.event_name == 'pull_request' && !github.event.pull_request.head.repo.fork) || github.event_name == 'push' || github.event_name == 'push tag' }} | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
packages: write | |
strategy: | |
fail-fast: false | |
matrix: | |
platform: | |
- linux/amd64 | |
- linux/arm64 | |
- linux/arm/v7 | |
steps: | |
- uses: actions/checkout@v4 | |
# Work around a bug where capital letters in the GitHub username (e.g. "PlanktoScope") make it | |
# impossible to push to GHCR. See https://github.com/macbre/push-to-ghcr/issues/12 | |
- name: Lowercase image registry and owner | |
id: image_registry_case | |
uses: ASzc/change-string-case-action@v6 | |
with: | |
string: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }} | |
# Build and publish Docker container image | |
- name: Get Docker metadata | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
images: ${{ steps.image_registry_case.outputs.lowercase }} | |
tags: | | |
type=sha # this sha doesn't appear to correspond to the git sha | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Log in to GitHub Container Registry | |
if: env.PUSH_IMAGE == 'true' | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Build and push by digest | |
id: build | |
uses: docker/build-push-action@v5 | |
with: | |
context: ./processing/segmenter | |
pull: true | |
platforms: ${{ matrix.platform }} | |
labels: ${{ steps.meta.outputs.labels }} | |
cache-from: type=gha,scope=processing-segmenter-build-${{ matrix.platform }} | |
cache-to: type=gha,mode=max,scope=processing-segmenter-build-${{ matrix.platform }} | |
outputs: type=image,name=${{ steps.image_registry_case.outputs.lowercase }},push-by-digest=true,name-canonical=true,push=${{ env.PUSH_IMAGE }} | |
- name: Export digest | |
run: | | |
mkdir -p /tmp/digests | |
digest="${{ steps.build.outputs.digest }}" | |
touch "/tmp/digests/${digest#sha256:}" | |
- name: Determine digest name | |
run: | | |
platform=${{ matrix.platform }} | |
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV | |
- 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: Download digests | |
uses: actions/download-artifact@v4 | |
with: | |
path: /tmp/digests | |
pattern: digests-* | |
merge-multiple: true | |
# Work around a bug where capital letters in the GitHub username (e.g. "PlanktoScope") make it | |
# impossible to push to GHCR. See https://github.com/macbre/push-to-ghcr/issues/12 | |
- name: Lowercase image registry and owner | |
id: image_registry_case | |
uses: ASzc/change-string-case-action@v6 | |
with: | |
string: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }} | |
- name: Get actual commit SHA | |
# Get the SHA of the actual commit (not the fake merge commit) on PR-triggered runs | |
# (refer to https://stackoverflow.com/a/68068674/23202949): | |
run: | | |
if [[ -n "${{ github.event.pull_request.head.sha }}" ]]; then | |
printf "ACTUAL_SHA=%.7s" "${{ github.event.pull_request.head.sha }}" >> $GITHUB_ENV | |
elif [[ ${{ env.PUSH_IMAGE }} = "true" ]]; then | |
printf "ACTUAL_SHA=%.7s" "${{ github.sha }}" >> $GITHUB_ENV | |
fi | |
# Build and publish Docker container image | |
- name: Get Docker metadata | |
id: meta | |
uses: docker/metadata-action@v5 | |
env: | |
IS_MAIN_BRANCH: ${{ github.ref == format('refs/heads/{0}', env.MAIN_BRANCH) }} | |
IS_BETA_BRANCH: ${{ github.ref == format('refs/heads/{0}', env.BETA_BRANCH) }} | |
IS_STABLE_BRANCH: ${{ github.ref == format('refs/heads/{0}', env.STABLE_BRANCH) }} | |
with: | |
images: ${{ steps.image_registry_case.outputs.lowercase }} | |
tags: | | |
type=match,pattern=${{ env.TAG_PREFIX }}(.*),group=1 # this implicitly updates latest | |
type=raw,value=stable,enable=${{ env.IS_STABLE_BRANCH }},priority=702 | |
type=raw,value=beta,enable=${{ env.IS_BETA_BRANCH }},priority=701 | |
type=edge,branch=${{ env.MAIN_BRANCH }} | |
type=ref,event=pr | |
type=raw,value=sha-${{ env.ACTUAL_SHA }},enable=${{ env.ACTUAL_SHA != '' }},priority=100 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Log in to GitHub Container Registry | |
if: env.PUSH_IMAGE == 'true' | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: ${{ github.repository_owner }} | |
password: ${{ secrets.GITHUB_TOKEN }} | |
- name: Create manifest list and push | |
if: env.PUSH_IMAGE == 'true' | |
working-directory: /tmp/digests | |
run: | | |
docker buildx imagetools create \ | |
$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ | |
$(printf '${{ steps.image_registry_case.outputs.lowercase }}@sha256:%s ' *) | |
- name: Inspect image | |
if: env.PUSH_IMAGE == 'true' | |
run: | | |
docker buildx imagetools inspect \ | |
${{ steps.image_registry_case.outputs.lowercase }}:${{ steps.meta.outputs.version }} |