Skip to content

Enable CI, disable CD - #2878

Merged
anvacaru merged 22 commits into
masterfrom
enable-ci-disable-cd
Aug 12, 2026
Merged

Enable CI, disable CD#2878
anvacaru merged 22 commits into
masterfrom
enable-ci-disable-cd

Conversation

@palinatolmach

@palinatolmach palinatolmach commented Aug 9, 2026

Copy link
Copy Markdown
Member

This PR re-enables CI on this repository and removes all secret usage from it, which makes it safe to run again. It also drops the secret-based CD entirely rather than converting it: the release workflow is removed here and comes back, secret-less, in a follow-up PR.

It performs the following updates:

  • Removes auto version bumps and release-cutting on master, along with release.yml itself. There is no release automation left in this repository. This will be updated in a follow-up PR.
  • Removes Nix/Cachix cache and gh-pages docs deploys, Slack notifications, the devops dispatch, and the check-cachix-pin.sh helper that verified the Cachix push.
  • Removes the dependency-bump automation that synced deps/* into kevm-pyk/pyproject.toml, kevm-pyk/uv.lock and flake.{nix,lock}; the _update-deps/* cron is not running, so that sync is manual for now.
  • Bumps all pulled-in actions to the latest (checkout v7.0.1, setup-python v7.0.0, setup-uv v9.0.0) and pins every one of them to its commit SHA.
  • Sets permissions: contents: read on test-pr.yml and persist-credentials: false on its checkouts, so the CI token is minimal regardless of the repository default, and no credential is left behind in the workspace.
  • Passes the with-docker action's inputs through env: instead of interpolating them into the shell block, which removes the template-injection exposure in the action that runs PR-authored code on the self-hosted runners.
  • Makes the Docker teardown best-effort and switches the deprecated --time flag to --timeout.

palinatolmach and others added 6 commits August 9, 2026 23:52
…etup-python to v7

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
setup-uv does not publish a floating major tag for v7+, so @v9 does not
resolve on runners; pin the exact version.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Delete master-push.yml (auto version-bump on every master push via
JENKINS_GITHUB_PAT). Rewrite release.yml as a single secret-less job that,
on a manual push to the `release` branch, bumps package/version, commits it
back to `release`, and creates the v<version> tag + GitHub release -- all via
the built-in GITHUB_TOKEN with `contents: write` and no stored secrets.

The Cachix/kup binary publish, DockerHub image, gh-pages docs, Slack
notifications, and the devops dependents-dispatch all required stored secrets
and are removed; those move to a manual/off-GitHub flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Automated deps bump/push required JENKINS_GITHUB_PAT and CACHIX_PUBLIC_TOKEN.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Only referenced by the removed release nix-cache job.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@palinatolmach
palinatolmach marked this pull request as ready for review August 9, 2026 19:13

@yiyi-wang-rv yiyi-wang-rv left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the whole diff. The core goal is achieved and verified: grep -rn "secrets\." .github/ now returns exactly one hit, the auto-issued secrets.GITHUB_TOKEN in release.yml. I also checked the two subtle things this design leans on, and both hold:

  • No self-trigger loop. release.yml pushes to release, which is its own trigger branch — but pushes made with the built-in GITHUB_TOKEN do not create new workflow runs, so this terminates. Worth a one-line comment in the file, since it is load-bearing and invisible.
  • git push still works after the checkout bump. actions/checkout v6 moved credentials to a separate file, but persist-credentials still defaults to true in v7, so the pushes in the release job authenticate.

I verified the action versions too: actions/checkout@v7 and actions/setup-python@v7 both exist and publish floating major tags; astral-sh/setup-uv genuinely has no v8/v9 floating tag (git/matching-refs/tags/v9 returns only v9.0.0), so the exact pin in commit 2 is correct and necessary. gh release create without --notes does not error in a non-TTY (create.go only prompts when IO.CanPrompt()), so the release step will not fail on that.

Findings inline. The two I would resolve before merging:

  1. node24 on the self-hosted runnerscheckout@v7/setup-python@v7/setup-uv@v9 are all using: node24; v4 was the last node20 checkout. The self-hosted normal/fast/ARM64 runners need a recent enough actions-runner or every conformance/proof/nix job dies at the checkout step. This is the most likely thing to actually break.
  2. Deleting update-version.yml breaks the dependency-bump pipeline, which is still live (#2864/#2865/#2866 all came from rv-jenkins pushing _update-deps/runtimeverification/k in the last few days). Its secrets were replaceable rather than load-bearing — details inline.

Smaller: cancel-in-progress: true on a workflow that now pushes commits and cuts releases can half-apply and silently skip a version; the release is published with no build verification, where the old flow gated promotion on a successful Nix build; and test-pr.yml has no permissions: block.

One nit on the PR description: it lists a DockerHub image publish among the removals, but I don't see one anywhere in the diff — the only Docker usage is .github/workflows/Dockerfile via the local with-docker action, which is untouched CI infrastructure.

Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/test-pr.yml Outdated
Comment thread .github/workflows/test-pr.yml Outdated
Comment thread .github/workflows/master-push.yml
Comment thread .github/workflows/update-version.yml
Comment thread .github/workflows/test-pr.yml
@anvacaru anvacaru self-assigned this Aug 10, 2026
@anvacaru
anvacaru requested a review from yiyi-wang-rv August 10, 2026 13:35

@yiyi-wang-rv yiyi-wang-rv left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-audited all 8 new commits. This is in good shape — everything I raised is addressed, and I verified each fix rather than taking the reply at face value. One new finding, non-blocking, inline on package/version.sh.

Verified fixes

SHA pins — resolved all three against the tag objects; every one matches its comment:

pin tag object claimed
actions/checkout@3d3c42e5… 3d3c42e5aac5ba805825da76410c181273ba90b1 v7.0.1 ✅
actions/setup-python@5fda3b95… 5fda3b95a4ea91299a34e894583c3862153e4b97 v7.0.0 ✅
astral-sh/setup-uv@c771a70e… c771a70e6277c0a99b617c7a806ffedaca235ff9 v9.0.0 ✅

node24 on self-hosted runners — agreed, and confirmed independently: run 31393430707 is green on all 12 jobs, covering [self-hosted, linux, normal], [self-hosted, linux, fast], and both normal and ARM64. That was the finding I was least able to settle from the diff, so having it exercised end-to-end closes it properly.

Dropping the with: block — checked the two things this now depends on. persist-credentials still defaults to true in checkout v7 (v6 moved credentials to a separate file but kept the default), so git push origin HEAD:release still authenticates; and for a push event the default ref is refs/heads/release at exactly github.sha, which is strictly better than the old ref: release.

enable-cache: false — valid and does what the comment says: getEnableCache() in setup-uv/src/utils/inputs.ts is enableCacheInput === "true", so anything other than "true"/"auto" disables it. Good instinct not to restore a cache into the one workflow holding contents: write.

version.sh cleanup — behaviour-preserving, and worth saying why so nobody re-adds the guard: the old code read version and current_version from the same file, so major == major && minor == minor was always true and the patch was always incremented. The deleted branch was unreachable, not a major/minor code path. The new comment about a hand-set line starting at X.Y.1 is accurate.

--draft / --generate-notes / --repo dropped, cancel-in-progress: false, contents: read — all good, and the header comment now explains the one gap CI doesn't cover, which is the right thing to write down.

release-<version> tags — your reply checks out: kontrol's flake.nix pins kevm.url = "github:runtimeverification/evm-semantics/v1.0.921" alongside deps/kevm_release, so it consumes v<version>, not release-*. No consumer to break.

Docker teardown — I was initially wary of || true on a teardown step, since it can hide a real leak on a long-lived self-hosted runner. Pulling the log from the pre-fix run (d825b52) shows the change is well-motivated: the registry mirror returned EOF, Set up Docker failed, and teardown then emitted No such container: kevm-ci-concrete-<sha> plus a second ##[error] Process completed with exit code 1 — exactly the duplicate-failure noise the comment describes. --time is also genuinely deprecated now (Flag --time has been deprecated, use --timeout instead on Docker 28), and the self-hosted daemons accept --timeout: the teardown steps in the green run succeeded rather than being silently swallowed by || true, which is the distinction I wanted to confirm.

update-version.yml

Agreed, and your reasoning is better than mine — if the cron is down, nothing regresses today, and this PR shouldn't be blocked on rebuilding an automation whose trigger doesn't fire. One ask: file a tracking issue rather than leaving it in the PR thread. The failure mode is delayed rather than absent — when the cron comes back it will start opening _update-deps/* PRs that carry only the deps/* file and fail CI, and at that point the context for why the workflow went away will be hard to recover.

Operational note on --draft

Not a code issue, just worth writing into the release runbook: a draft release does not create the git tag until it is published, and the Slack notifications are gone, so nothing announces that a draft is waiting. Until someone clicks publish, downstream pins like kontrol's github:runtimeverification/evm-semantics/v<version> will 404 on the new version. That is the intended trade for gating publication on a human, but the human now has to know to show up.

Verdict

Approvable from my side. The uv lock point below is a follow-up, not a blocker.

For the kontrol port, the three checks that actually earned their keep here: resolve every pinned SHA against its tag before merging, exercise the self-hosted runners once for the node24 bump rather than reasoning about runner versions, and check whether kontrol has its own deps/-driven update-version flow that would be deleted along the same lines — the same delayed-failure question applies there.

Comment thread package/version.sh Outdated
Comment thread .github/actions/with-docker/action.yml Outdated
Comment thread .github/workflows/test-pr.yml
Comment thread .github/workflows/lint-workflows.yml Outdated
@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

Comment thread .github/workflows/lint-workflows.yml Outdated
Co-authored-by: Tamás Tóth <tothtamas28@users.noreply.github.com>
@anvacaru
anvacaru merged commit d818397 into master Aug 12, 2026
47 of 51 checks passed
@anvacaru
anvacaru deleted the enable-ci-disable-cd branch August 12, 2026 13:54
anvacaru added a commit to runtimeverification/kontrol that referenced this pull request Aug 12, 2026
* .github/workflows, .github/scripts, README.md, CLAUDE.md: remove secret-using CD

Ports the CD half of runtimeverification/evm-semantics#2878.

CD is removed rather than converted: version bumping, release cutting, Cachix
publishing, the Docker Hub and ghcr.io image pushes, and the dependency-bump
automation all read repository secrets. Release automation is reinstated in a
follow-up PR, so until then dependency syncing and releases are manual.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* .github/actions/with-docker, .github/workflows/Dockerfile: pass inputs via env

Composite action inputs were interpolated straight into the shell script, which
is a template-injection surface on self-hosted runners; they now arrive as env
vars and every expansion is quoted. Drops the subdir/os/distro inputs and the
BASE_DISTRO build arg, which nothing read, and the `type:` keys, which are not
valid on composite action inputs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* .github/workflows/test-pr.yml: pin actions to SHAs, restrict token permissions

Pins every action to a commit SHA with a version comment, sets a read-only
workflow token (plus packages:read on the jobs that pull ghcr.io/foundry-rs/
foundry), and stops persisting credentials in the checkout.

Docker teardown becomes `docker stop --timeout=0 ... || true` so a container
that was never created cannot mask the step that actually failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* .github/workflows/update-expected-output.yml, README.md: publish golden files as an artifact

The job pushed the regenerated files straight to the branch, which required a
push-capable PAT. Since it checks out and runs the dispatched branch's own
composite action in the same job, anyone with write access could exfiltrate
that PAT; it was also the last secret left in the repository.

The files now go up via actions/upload-artifact with a 7-day retention, and the
README documents the download-and-commit step. `if-no-files-found: error` guards
against a silently empty upload, since every test step here ends in `|| true`.

Drops the `github.ref != master` guard along with the push it protected.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* .github/actionlint.yaml, .github/workflows/lint-workflows.yml, CLAUDE.md: add workflow linting

Runs actionlint and zizmor over .github/ on every PR, so the SHA pinning and
permission scoping added in this branch stay enforced. The actionlint release is
pinned by version and verified by checksum; actionlint.yaml declares the
self-hosted runner labels it cannot discover on its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* test-pr.yml: fix typo

* Update .github/workflows/test-pr.yml

Co-authored-by: Tamás Tóth <tothtamas28@users.noreply.github.com>

* .github/workflows/test-pr.yml: declare k-framework cache as a substituter

cachix-action failed on the self-hosted runner with "Cachix Auth token
CACHIX_WEB_PRIVATE_TOKEN has been revoked": the cachix CLI validates whatever
token is left in the runner's own config before registering a cache, so leftover
state from the removed CD workflows broke a step that passes no token at all.

k-framework is public, so the cache is declared directly in extra_nix_config and
the CLI drops out of the path. Also drops cache.iog.io, which could never be used
because its public key was not in trusted-public-keys, and switches cache.nixos.org
to https.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Tamás Tóth <tothtamas28@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants