CI Validation Workflow¶
File: .github/workflows/ci.yml
This workflow validates that the parsing machinery itself works correctly, using fixture logs checked into the repository rather than live cluster data — it does not run real benchmark jobs, and it does not validate uploading (see test-parser below).
A pull request also triggers real benchmark jobs
Opening or updating a pull request against main does not only trigger this workflow — it also triggers uchicago.yml, which runs all 11 real benchmark jobs on the actual UChicago self-hosted runner (arc-runner-set-uchicago). That trigger is gated only by a fork/dependabot check, not by which files changed, so a documentation-only PR still runs real EVNT/TRUTH3/Rucio/etc jobs on live UC infrastructure unless it comes from a fork or dependabot.
Trigger¶
The workflow runs:
- On every push, to any branch
- On pull requests to
main - Manually via
workflow_dispatch
Runs for the same workflow and ref cancel any still-in-progress run (concurrency.cancel-in-progress: true), and the workflow only requests contents: read at the top level.
Jobs¶
Three independent jobs run in parallel — none depend on another:
| Job | Runner | Validates |
|---|---|---|
test-actions | arc-runner-set-uchicago | The setup-globus composite action runs on a real self-hosted runner |
test-handlers | ubuntu-latest | The parser's Python unit tests (parsing/tests/) |
test-parser | ubuntu-latest | The parse action, integration-tested against 7 real log formats |
test-actions¶
Checks out the repo and runs ./.github/actions/setup-globus with the VOMS_USERCERT/VOMS_USERKEY secrets. This is a smoke test — success means the composite action completed without error on the actual self-hosted runner it will run on in uchicago.yml.
The job is skipped for pull requests from forks (github.event.pull_request.head.repo.fork == false), since forked PRs can't access repository secrets and shouldn't be granted access to the self-hosted runner.
test-handlers¶
Sets up the kibana pixi environment and runs:
which is the pixi task alias (pixi.toml) for pytest parsing/tests/. This runs the parser's unit test suite directly against the Python package — parsing/base_parser.py and parsing/scripts/ci_parse.py — without going through the composite action. It checks that the === BENCHMARK === block extractor returns the last block when a log contains retries, that submitTime/queueTime/runTime/status/setupTime/cpuPercent/maxRssKb are derived correctly, and that a fully-assembled payload passes schema validation.
test-parser¶
Runs the parse composite action itself — not just the underlying Python — against a matrix of real log fixtures under parsing/example-logs/:
log-file | log-type |
|---|---|
coffea_hist.log | coffea |
eventloop_arrays.log | eventloop |
eventloop_noarrays.log | eventloop |
log.generate | evnt |
fastframes.log | fastframes |
rucio.log | rucio |
log.Derivation | truth3 |
- name: parse ${{ matrix.log-type }} log
uses: ./.github/actions/parse
with:
job: ${{ matrix.log-type }}
log-file: parsing/example-logs/${{ matrix.log-file }}
log-type: ${{ matrix.log-type }}
cluster: UC-AF
kibana-token: "our-token"
kibana-kind: "our-index"
host: "our-host"
os: alma9
mode: batch
containerized: "false"
No secrets.* are used here — the token/kind/host values are dummy literals, since this job never uploads anywhere.
log-type is metadata only. parse_atlas_log (in parsing/base_parser.py) does not branch on it — the exact same === BENCHMARK === block extractor handles every log type uniformly. The matrix exists to prove the action works across every real-world log format the AFs actually produce (different tools writing wildly different surrounding log content), not to exercise different parsing code paths.
This job validates parsing, not uploading. There is no step here that calls ./.github/actions/upload — the upload action is only exercised by the real benchmark jobs in uchicago.yml. A regression in the upload action's curl invocation would not be caught by CI.