CI/CD · GitHub Actions · Stage B

PipeForge

公开仓库已建立,流水线在 GitHub Actions 上真实运行;公司是虚构的;不部署到任何服务器。页面上的 run 链接来自 GitHub API 的构建时记录,徽章是唯一的外部图片。

Badges

The live image URLs use caoyadong888-wq/pipeforge-demo. They are the only external images on this page. The recorded copies below are build-time fallbacks.

ci.yml

构建时记录:live,(Asia/Shanghai)

release.yml

构建时记录:live,(Asia/Shanghai)

Pipeline

lint and the four test cells run first. build needs both. sbom and scan run in parallel after build. summary runs after all of them. publish runs only from release.yml after that same ci workflow succeeds.

Diagram of lint, test 3.10 through 3.13, build, parallel sbom and scan, summary, and release publish

The same drawing is pipeline.svg.

Recent runs

Recorded runs: 28. Status live.

From results/runs.json. Live run ids from the public repository.
WorkflowEventBranchCommitConclusionDuration
ci.ymlpushmain2263a41success164s
codeql.ymlpushmain2263a41success100s
make-ghcr-public.ymlworkflow_dispatchmain0386901failure8s
codeql.ymlpushmain0386901success70s
ci.ymlpushmain0386901cancelled26s
make-ghcr-public.ymlworkflow_dispatchmainda796d5failure23s
codeql.ymlpushmainda796d5success57s
ci.ymlpushmainda796d5success124s
release.ymlpushv0.1.0f653c0bsuccess228s
ci.ymlpushmainf653c0bsuccess134s
codeql.ymlpushmainf653c0bsuccess66s
release.ymlpushv0.1.0568d7b3failure2s
codeql.ymlpushmain568d7b3success59s
ci.ymlpushmain568d7b3success151s
codeql.ymlpull_requestdependabot/pip/uvicorn-gte-0.30-and-lt-0.5584d667fsuccess58s
ci.ymlpull_requestdependabot/pip/uvicorn-gte-0.30-and-lt-0.5584d667fsuccess168s
ci.ymlpull_requestdemo/intentional-scan-block33603f7failure (intentional)220s
codeql.ymlpull_requestdemo/intentional-scan-block33603f7success88s
codeql.ymlpull_requestdemo/intentional-scan-blockb81a239cancelled4s
ci.ymlpull_requestdemo/intentional-scan-blockb81a239cancelled50s
ci.ymlpull_requestdemo/add-express-service-levelc505198success191s
codeql.ymlpull_requestdemo/add-express-service-levelc505198success65s
ci.ymlpushmainb65fc71success204s
codeql.ymlpushmainb65fc71success58s
codeql.ymlpull_requestdependabot/pip/uvicorn-gte-0.30-and-lt-0.551f9a155success140s
ci.ymlpull_requestdependabot/pip/uvicorn-gte-0.30-and-lt-0.551f9a155failure274s
ci.ymlpull_requestdependabot/pip/fastapi-gte-0.115-and-lt-0.143b63b99efailure270s
codeql.ymlpull_requestdependabot/pip/fastapi-gte-0.115-and-lt-0.143b63b99esuccess142s

Run graph fallback (open a linked run above for the live Actions page):

Local fallback graphic for the Actions run graph

Stages

lint

Runs ruff, mypy, and a sha256-checked actionlint binary with shellcheck beside it.

Pinned tools and a shell-checked run script catch workflow mistakes before the test matrix spends minutes.

ci.yml line 40

test

Pytest on Python 3.10, 3.11, 3.12, and 3.13. Coverage must stay at or above 90 percent. fail-fast is off.

One Python version can hide a syntax or typing gap. The matrix is the whole supported range, and one red cell does not cancel the others.

ci.yml line 77

build

Builds the wheel and sdist, then builds the image with push false and load true, and saves image.tar.

CI proves the image builds. It does not publish it. Publish happens only on a version tag, from the archive the scanner already saw.

ci.yml line 143

sbom

Syft writes SPDX JSON and CycloneDX JSON for the image, and SPDX JSON for the source tree.

Two image formats cover consumers that accept only one of them. The source SBOM is a separate file.

ci.yml line 213

scan

Trivy scans the image archive at CRITICAL and HIGH, ignores unfixed issues, and fails the job when exit-code is 1. SARIF is uploaded for code scanning.

A scanner that always exits 0 does not gate a release. The failing exit code is the gate.

ci.yml line 280

summary

Writes each job result, the local image id, and the CycloneDX component count into the run summary.

Those values are passed in through environment variables. The run script does not interpolate event fields.

ci.yml line 302

publish

On a v*.*.* tag, pushes the scanned image to GHCR as the version and a short sha, attests the image, wheel, and sdist, and attaches those files plus SHA256SUMS to a GitHub Release.

There is no floating latest tag and no server rollout. The token is GITHUB_TOKEN.

release.yml line 68

permissions

The workflow token starts at contents: read. Only the scan job, CodeQL, and publish raise it, and only for the scope that job uses.

A pull request run does not receive a write token for packages or releases. Checkout sets persist-credentials to false.

ci.yml line 12

Workflow YAML

Highlighted from snapshot 2263a414fe628107f433d708f83dd82cc29e55a6. Blob links point at the public repository.

Release artifacts

Recorded releases: 1. State live. Recorded from the live GitHub Releases / Packages API for the public demo repository.

Locked decisions

Offline checks

构建时记录. Recorded at 2026-10-07T08:30:30+08:00. Stage B. Owner status set. Image build not-run-locally. The box has no Docker, so this checkout does not claim an image was built here.

actionlint 1.7.12

Errors 0. Result pass. shellcheck 0.11.0 is on PATH for the run: scripts.

zizmor 1.30.1

High 0. Medium 0. Informational 1. Result pass.

  • informational superfluous-actions /workspace/pipeforge-demo/.github/workflows/release.yml

ruff ruff 0.16.10

Errors 0. Result pass.

mypy mypy 2.4.0 (compiled: yes)

Errors 0. Result pass.

pytest pytest 9.1.1

Passed 35. Failed 0. Coverage 98.7 percent. Result pass.

Workflow policy

Passed 15. Failed 0. Result pass.

  • passed test_checkout_drops_credentials
  • passed test_dependabot_covers_actions_pip_and_docker_weekly
  • passed test_jobs_have_timeouts
  • passed test_no_pull_request_target
  • passed test_only_github_token_secret_is_referenced
  • passed test_public_readme_does_not_link_to_the_portfolio_host
  • passed test_python_matrix_is_exactly_3_10_through_3_13
  • passed test_release_does_not_push_latest
  • passed test_run_scripts_do_not_interpolate_event_context
  • passed test_scan_fails_on_critical_and_high
  • passed test_snapshot_manifest_tracks_main
  • passed test_top_level_permissions_are_contents_read
  • passed test_uses_are_full_shas
  • passed test_workflows_have_no_deploy_channel
  • passed test_write_permissions_stay_on_the_whitelist