You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 6a4a72f
Browse filesBrowse the repository at this point in the historyBrowse files
ci(experimental): skip or stop superseded runs instead of cancelling them (#1938) (#1942)
* ci(experimental): skip or stop superseded runs instead of cancelling them (#1938)
- Drop experimental.yml's concurrency group: a cancelled check marks its
commit red, and a group without cancel-in-progress still cancels its
pending run.
- Add util/superseded.py: a commit is current while it heads main, or its
open pull request; any other event, or an API error, is current.
- Add a `current` gate job that every other job needs and skips on, so a run
superseded before it starts ends with skipped checks and a notice.
- Run the capped pytest command under the script's watcher, which checks every
60 s and, once superseded, stops the session (TERM, then KILL) and exits 0
with a notice and a summary line; otherwise it keeps the tests' status.
- Describe it in workflows.rst; pin it in tests/project and update the pins
the gate and watcher move.
Closes#1938
* ci(experimental): bound the superseded stop and reach the test scope (#1938)
- Run the watcher outside the scope and, where the tests run in one, stop
pcapkit-tests.scope by name with `sudo -n systemctl kill`: the scope's
processes are out of reach of a signal to the session's root-owned sudo.
The session's process group stays the path for an unscoped run.
- Bound every wait. A command that outlives SIGKILL gets a `Superseded run
not stopped` warning and exit 70, not 0, since its tests may run on.
- Open each downstream `if:` with `!cancelled()`, so a failed `current` job
runs the rest; the legs still need `changes` and `python-versions`.
- Test the scoped stop, the bounded stop and the gate's failure semantics
through an injectable command runner and signaller, and in the step.
Refs #1938
* ci(experimental): fetch superseded state with requests (#1938)
- Back util/superseded.py's transport with a requests.Session, keeping the
injectable transport, ETag/If-None-Match, the bounded timeout, and any
error, a missing requests included, counting as current.
- Gate: read `latest`, set it up and install requests before the check,
every step continue-on-error.
- Legs: set up `latest` apart from the leg (`update-environment: false`),
install requests into it alone, and run the watcher on it; where either
step fails, the tests run unwatched. Each step is capped at 1 minute,
leaving 3 of the job's 140 uncapped.
- util/update_python_versions.py reads a matrix job's fallback label for
`latest`, as it does for the tiers.
- Update the docs, the caps pins and the new tests.
Refs #1938
* test(experimental): drop review-round labels from the #1938 pins (#1938)
- Reword the #1938 tests' docstrings and comments without the review-round
prefixes, each still stating what its test checks.
- State the experimental leg's uncapped margin as what it covers and the
measured maximum, not as what it was.
Refs #1938
0 commit comments