mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-07-09 05:10:54 +02:00
3a6c31a51e
Replace the one-runner-per-configuration matrices across the
make-check workflow family with a generic pooled runner,
.github/scripts/parallel-make-check.py. Each workflow keeps its
configuration list as JSON next to the invocation; one runner (or a
small fixed set of shards, balanced by measured per-config minutes)
builds every config in its own out-of-tree (VPATH) build directory off
a single checkout/autogen, on a pool of one-per-CPU worker threads,
longest first. Concurrent checks are isolated with bubblewrap network
namespaces, compilations are cached with ccache, the first failure
aborts the rest (fail-fast, with --no-fail-fast to run everything),
and per-config timings plus pool efficiency land in the step summary.
Failure logs upload as artifacts. smoke-test.yml is likewise reworked
into a single pooled job that runs its nine configs on one runner.
Converted workflows (runner jobs per full pass):
os-check.yml 101 -> 8 (92 Ubuntu configs -> 4 shards;
the macOS matrix, the user-settings jobs and
the standalone
macos-apple-native-cert-validation.yml fold
into one macOS runner; Windows unchanged)
pq-all.yml 21 -> 2 shards
disable-pk-algs.yml 15 -> 1
wolfCrypt-Wconversion.yml 11 -> 1
trackmemory.yml 7 -> 1
cryptocb-only.yml 8 -> 1 (incl. the two new SHA512 entries)
multi-compiler.yml 6 -> 1
smallStackSize.yml 6 -> 1
multi-arch.yml 6 -> 1
async.yml 5 -> 1
psk.yml 5 -> 1
no-malloc.yml 3 -> 1
wolfsm.yml 3 -> 1
opensslcoexist.yml 2 -> 1
Measured against current upstream passing runs (job execution time,
queue excluded): ~200 runner jobs / ~374 runner-minutes per full pass
become 23 jobs / ~168 runner-minutes, with more coverage than before.
multi-arch's old matrix combined an "include" list of four
architectures with an "opts" axis; GitHub's include-merge rules made
each arch entry overwrite the previous one, so only the armel
combinations actually ran. The pooled list restores the intended
aarch64/armhf/riscv64 coverage (23 combinations; riscv64 x sp-math is
omitted as invalid - configure rejects sp-math without SP, and
--enable-riscv-asm, unlike --enable-sp-asm, does not bring SP in).
Out-of-tree build fixes this depends on:
- Makefile.am: symlink the read-only test data (certs/, tests/ config
files, sniffer captures and helpers, examples/crypto_policies,
input, quit) into the build tree via a BUILT_SOURCES stamp, removed
again in distclean-local. ChangeToWolfRoot() and the script tests
resolve everything relative to the working directory, so out-of-tree
make check and make distcheck now pass.
- scripts/multi-msg-record.py: locate the client binary from the build
tree working directory rather than the script's source directory.
- configure.ac + wolfssl/include.am: run
support/gen-debug-trace-error-codes.sh from $srcdir; it reads the
error-code headers from the source tree and generates into the build
tree.
- tests/swdev: a WOLFBUILD variable points the sub-make at the build
tree for the configure-generated headers (wolfssl/options.h,
wolfssl/version.h); the in-tree-only guards are dropped.
Portions of PR #10649 are incorporated: the cross-platform
ccache-setup composite action, repository_owner gates on check-headers
and check-source-text, the docs-only paths-ignore on os-check, and the
libspdm timeout bumps.
96 lines
3.2 KiB
YAML
96 lines
3.2 KiB
YAML
name: 'Wait for Smoke Test'
|
|
description: 'Polls the Smoke Test workflow for the current commit and fails if it failed.'
|
|
|
|
# Designed to be the leading job in pull_request-triggered workflows so that
|
|
# expensive integration CI does not run unless the smoke build passes.
|
|
#
|
|
# Push events bypass the wait entirely (we still get smoke results for those
|
|
# pushes, but other CI is not gated on push). For drafts, callers should
|
|
# skip dependent jobs via `if: github.event.pull_request.draft == false` -
|
|
# this action will still pass through if smoke is skipped or absent.
|
|
|
|
inputs:
|
|
workflow:
|
|
description: 'Name of the smoke workflow file to wait on'
|
|
required: false
|
|
default: 'smoke-test.yml'
|
|
timeout-seconds:
|
|
description: 'Maximum time to wait for smoke to complete'
|
|
required: false
|
|
default: '3600'
|
|
poll-seconds:
|
|
description: 'Polling interval'
|
|
required: false
|
|
default: '20'
|
|
github-token:
|
|
description: 'GITHUB_TOKEN with actions:read permission'
|
|
required: true
|
|
|
|
runs:
|
|
using: 'composite'
|
|
steps:
|
|
- name: Wait for smoke
|
|
shell: bash
|
|
env:
|
|
GH_TOKEN: ${{ inputs.github-token }}
|
|
SMOKE_WORKFLOW: ${{ inputs.workflow }}
|
|
TIMEOUT: ${{ inputs.timeout-seconds }}
|
|
POLL: ${{ inputs.poll-seconds }}
|
|
REPO: ${{ github.repository }}
|
|
run: |
|
|
set -u
|
|
# Only gate pull_request events. Push events are not gated.
|
|
if [ "${{ github.event_name }}" != "pull_request" ]; then
|
|
echo "Not a pull_request event - skipping smoke gate."
|
|
exit 0
|
|
fi
|
|
|
|
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
|
|
echo "Waiting for $SMOKE_WORKFLOW on $HEAD_SHA (timeout ${TIMEOUT}s)"
|
|
|
|
START=$(date +%s)
|
|
while :; do
|
|
NOW=$(date +%s)
|
|
ELAPSED=$((NOW - START))
|
|
if [ "$ELAPSED" -ge "$TIMEOUT" ]; then
|
|
echo "::error::Timed out after ${TIMEOUT}s waiting for $SMOKE_WORKFLOW on $HEAD_SHA"
|
|
exit 1
|
|
fi
|
|
|
|
# Look up the latest run for this workflow + head SHA.
|
|
RUN_JSON=$(gh api \
|
|
"repos/${REPO}/actions/workflows/${SMOKE_WORKFLOW}/runs?head_sha=${HEAD_SHA}&per_page=1" \
|
|
2>/dev/null || echo '{}')
|
|
|
|
STATUS=$(echo "$RUN_JSON" | jq -r '.workflow_runs[0].status // "missing"')
|
|
CONCLUSION=$(echo "$RUN_JSON" | jq -r '.workflow_runs[0].conclusion // ""')
|
|
RUN_URL=$(echo "$RUN_JSON" | jq -r '.workflow_runs[0].html_url // ""')
|
|
|
|
case "$STATUS" in
|
|
completed)
|
|
case "$CONCLUSION" in
|
|
success)
|
|
echo "Smoke test passed: $RUN_URL"
|
|
exit 0
|
|
;;
|
|
skipped|neutral)
|
|
echo "Smoke test was $CONCLUSION - treating as pass: $RUN_URL"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "::error::Smoke test concluded as '$CONCLUSION': $RUN_URL"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
missing)
|
|
echo "[$ELAPSED s] No smoke run yet for $HEAD_SHA"
|
|
;;
|
|
*)
|
|
echo "[$ELAPSED s] Smoke status=$STATUS ($RUN_URL)"
|
|
;;
|
|
esac
|
|
|
|
sleep "$POLL"
|
|
done
|