diff --git a/.gitea/workflows/build-image.yml b/.gitea/workflows/build-image.yml index 7215d24..96846f9 100644 --- a/.gitea/workflows/build-image.yml +++ b/.gitea/workflows/build-image.yml @@ -2,12 +2,33 @@ name: build-image on: push: - branches: [main] + branches: + - main + pull_request: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number + || github.run_id }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: docker: - runs-on: ubuntu-latest + runs-on: butler-ci steps: - - uses: actions/checkout@v4 + - uses: https://github.com/actions/checkout@v4 + - name: Select relevant delivery work + id: delivery + env: + DELIVERY_EVENT: ${{ github.event_name }} + DELIVERY_REF: ${{ github.ref }} + DELIVERY_SHA: ${{ github.sha }} + DELIVERY_BASE: ${{ github.event.pull_request.base.sha || github.event.before }} + run: | + cd . + bash scripts/ci-select.sh - name: Build image - run: make docker-build IMAGE_TAG=${{ gitea.sha }} + if: ${{ steps.delivery.outputs.run == 'true' }} + run: | + make ci-fast IMAGE_TAG=${{ gitea.sha }} diff --git a/scripts/ci-select.sh b/scripts/ci-select.sh new file mode 100644 index 0000000..7260b1b --- /dev/null +++ b/scripts/ci-select.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Keep required jobs alive; only skip reviewed non-runtime documentation paths. +set -euo pipefail +base="${DELIVERY_BASE:-}" +head="$(git rev-parse HEAD)" +run=true +if [[ "${DELIVERY_REF:-}" != refs/tags/* && "$head" == "${DELIVERY_SHA:-}" && "${DELIVERY_EVENT:-}" =~ ^(push|pull_request)$ && "$base" =~ ^[0-9a-f]{40}$ && "$base" != 0000000000000000000000000000000000000000 ]]; then + if ! git cat-file -e "$base^{commit}" 2>/dev/null; then + if [[ -n "${DELIVERY_FETCH_TOKEN:-}" ]]; then + git -c "http.extraHeader=Authorization: token ${DELIVERY_FETCH_TOKEN}" fetch --quiet --depth=1 origin "$base" >/dev/null 2>&1 || true + else + git fetch --quiet --depth=1 origin "$base" >/dev/null 2>&1 || true + fi + fi + if git cat-file -e "$base^{commit}" 2>/dev/null; then + paths="$(mktemp)" + trap 'rm -f -- "$paths"' EXIT + # Snapshot comparison is conservative when main advanced during a PR. + # Both rename sides remain visible, including names containing newlines. + if git diff --no-renames --name-only -z "$base" "$head" > "$paths"; then + run=false + while IFS= read -r -d '' path; do + case "$path" in + README.md|CHANGELOG.md|LICENSE|LICENSE.md) ;; + *) run=true; break ;; + esac + done < "$paths" + fi + fi +fi +if [[ "$run" == false ]]; then + echo 'Only reviewed non-runtime documentation changed; build and validation are not applicable.' +else + echo 'Runtime, unknown inputs, or unavailable event history: run required validation.' +fi +if [[ -n "${GITHUB_OUTPUT:-}" ]]; then + echo "run=$run" >> "$GITHUB_OUTPUT" +fi +printf '%s\n' "$run"