Skip packing a PR build when edge already holds the version
A PR can change a package's directory without bumping its version: an upstream hook, its tests, a README. bin/build then plans nothing, and the pack step failed on the empty build output, turning the required result check red (seen on #769). Make the same dry-run check publish.yml's rebuild job already makes, and skip packing and uploading when nothing was built. publish.yml finds no artifact for such a merge and records the package as already published.
This commit is contained in:
1 parent
88c82f3f24
commit
5bd85a785f
1 file changed
+17
-1
@@ -211,11 +211,25 @@ jobs:
|
|||||||
# git's SIGPIPE (141) failed the step for any PR far enough behind
|
# git's SIGPIPE (141) failed the step for any PR far enough behind
|
||||||
# master to differ in more files; sed reads the whole stream.
|
# master to differ in more files; sed reads the whole stream.
|
||||||
git status --short | sed -n '1,10p'
|
git status --short | sed -n '1,10p'
|
||||||
|
# A PR can change a package's directory without changing its version:
|
||||||
|
# an upstream hook, its tests, a README. edge already holds that
|
||||||
|
# version, so the planner builds nothing and there is nothing to pack.
|
||||||
|
# The same check publish.yml's rebuild job makes; without it the pack
|
||||||
|
# step failed on the empty output and the required result went red.
|
||||||
- name: Build ${{ matrix.package }} (${{ matrix.arch }}, ships to ${{ matrix.channels }})
|
- name: Build ${{ matrix.package }} (${{ matrix.arch }}, ships to ${{ matrix.channels }})
|
||||||
id: build
|
id: build
|
||||||
env:
|
env:
|
||||||
CONTAINER_ENGINE: docker
|
CONTAINER_ENGINE: docker
|
||||||
run: bin/build --mirror edge --arch ${{ matrix.arch }} --package ${{ matrix.package }}
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
plan=$(bin/build --dry-run --mirror edge --arch "${{ matrix.arch }}" --package "${{ matrix.package }}" 2>&1 | grep -E '^==> Plan complete' || true)
|
||||||
|
if [[ -n "$plan" && -z "$(sed -E 's/.*would build: *//' <<<"$plan" | tr -d '[:space:]')" ]]; then
|
||||||
|
echo "==> ${{ matrix.package }} (${{ matrix.arch }}): edge already holds this version, nothing to build"
|
||||||
|
echo "built=false" >> "$GITHUB_OUTPUT"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
bin/build --mirror edge --arch "${{ matrix.arch }}" --package "${{ matrix.package }}"
|
||||||
|
echo "built=true" >> "$GITHUB_OUTPUT"
|
||||||
# makepkg's check() leaves meson's per-test output in the build tree,
|
# makepkg's check() leaves meson's per-test output in the build tree,
|
||||||
# never on stdout, so a failing test shows only a summary line in this
|
# never on stdout, so a failing test shows only a summary line in this
|
||||||
# job log. bin/build bind-mounts $SRC_DIR at /src, so those logs outlive
|
# job log. bin/build bind-mounts $SRC_DIR at /src, so those logs outlive
|
||||||
@@ -243,12 +257,14 @@ jobs:
|
|||||||
# successful build uploads: the artifact's existence is what lets the
|
# successful build uploads: the artifact's existence is what lets the
|
||||||
# planner above and publish.yml skip rebuilding this exact tree.
|
# planner above and publish.yml skip rebuilding this exact tree.
|
||||||
- name: Pack artifact
|
- name: Pack artifact
|
||||||
|
if: steps.build.outputs.built == 'true'
|
||||||
id: pack
|
id: pack
|
||||||
run: |
|
run: |
|
||||||
source helpers/artifact-helpers.sh
|
source helpers/artifact-helpers.sh
|
||||||
pack_packages build-output/edge/${{ matrix.arch }} packages.tar
|
pack_packages build-output/edge/${{ matrix.arch }} packages.tar
|
||||||
tar -tvf packages.tar
|
tar -tvf packages.tar
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
|
if: steps.build.outputs.built == 'true'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.package }}-${{ matrix.arch }}-${{ steps.tree.outputs.hash }}
|
name: ${{ matrix.package }}-${{ matrix.arch }}-${{ steps.tree.outputs.hash }}
|
||||||
|
|||||||
Reference in new issue
Block a user