name: Build & Push Docker on: push: branches: ["main"] workflow_dispatch: schedule: - cron: "@weekly" jobs: build-and-push: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Resolve latest Open Stage Control release shell: bash run: | set -euo pipefail python3 <<'PY' import json import urllib.request url = "https://framagit.org/api/v4/projects/jean-emmanuel%2Fopen-stage-control/releases" with urllib.request.urlopen(url) as response: releases = json.load(response) if not releases: raise SystemExit("No releases returned by upstream API") latest = releases[0] tag = latest["tag_name"] version = tag[1:] if tag.startswith("v") else tag with open("release.env", "w", encoding="utf-8") as f: f.write(f"OSC_TAG={tag}\n") f.write(f"OSC_VERSION={version}\n") PY cat release.env >> "$GITHUB_ENV" - name: Set image names shell: bash env: REPOSITORY: ${{ gitea.repository }} run: | set -euo pipefail OWNER="$(printf '%s' "${REPOSITORY%/*}" | tr '[:upper:]' '[:lower:]')" REPO="$(printf '%s' "${REPOSITORY#*/}" | tr '[:upper:]' '[:lower:]')" echo "IMAGE_LATEST=git.f-40.com/${OWNER}/${REPO}:latest" >> "$GITHUB_ENV" echo "IMAGE_VERSIONED=git.f-40.com/${OWNER}/${REPO}:${OSC_VERSION}" >> "$GITHUB_ENV" - name: Login to Gitea Container Registry shell: bash env: REGISTRY_USER: ${{ secrets.USER }} REGISTRY_TOKEN: ${{ secrets.TOKEN }} run: | set -euo pipefail echo "$REGISTRY_TOKEN" | docker login git.f-40.com -u "$REGISTRY_USER" --password-stdin - name: Decide whether a build is needed shell: bash env: EVENT_NAME: ${{ gitea.event_name }} run: | set -euo pipefail if [ "$EVENT_NAME" = "push" ] || [ "$EVENT_NAME" = "workflow_dispatch" ]; then echo "SHOULD_BUILD=true" >> "$GITHUB_ENV" echo "BUILD_REASON=repository change or manual run" >> "$GITHUB_ENV" exit 0 fi if docker manifest inspect "$IMAGE_VERSIONED" >/dev/null 2>&1; then echo "SHOULD_BUILD=false" >> "$GITHUB_ENV" echo "BUILD_REASON=version ${OSC_VERSION} already exists in registry" >> "$GITHUB_ENV" else echo "SHOULD_BUILD=true" >> "$GITHUB_ENV" echo "BUILD_REASON=new upstream release ${OSC_TAG}" >> "$GITHUB_ENV" fi - name: Build shell: bash run: | set -euo pipefail if [ "${SHOULD_BUILD}" != "true" ]; then echo "Skipping build: ${BUILD_REASON}" exit 0 fi echo "Building ${OSC_TAG} because ${BUILD_REASON}" docker build \ --build-arg OPEN_STAGE_CONTROL_VERSION="${OSC_VERSION}" \ -t "${IMAGE_LATEST}" \ -t "${IMAGE_VERSIONED}" \ . - name: Push shell: bash run: | set -euo pipefail if [ "${SHOULD_BUILD}" != "true" ]; then echo "Skipping push: ${BUILD_REASON}" exit 0 fi docker push "${IMAGE_VERSIONED}" docker push "${IMAGE_LATEST}"