Skip to content

ci(release): three-tier release automation - #524

Merged
16bit-ykiko merged 10 commits into
mainfrom
ci/release-tiers
Jul 18, 2026
Merged

ci(release): three-tier release automation#524
16bit-ykiko merged 10 commits into
mainfrom
ci/release-tiers

Conversation

@16bit-ykiko

@16bit-ykiko 16bit-ykiko commented Jul 18, 2026

Copy link
Copy Markdown
Member

Summary

Finishes the pre-release cleanup round: a three-tier release process (instant builds / nightlies / stable), single-source versioning with no hand-edited version numbers, consolidated workflows, and user-facing release documentation.

Release tiers

Tier Trigger Version Distribution
Instant every green CI run commit-identified workflow artifacts: per-platform vsix repackaged from the test-suite binaries, plus the raw build artifacts
Nightly daily cron (or dispatch), only when main moved X.<odd>.YYMMDDHH (UTC hour) GitHub pre-release + Marketplace pre-release channel; pruned after 30 days
Stable manual tag, even minor vX.<even>.Z permanent release + Marketplace
  • Nightly tags are computed on the odd minor above the newest release, so the pre-release channel keeps updating after each stable ships (Marketplace serves the highest version per channel).
  • The publish workflows check out the release tag itself, so the binary's embedded git describe version always names the exact release — required for crash symbolization.
  • Version placeholders in the repo are permanent; real versions are injected from the tag at build time. An accidental local vsce publish is rejected by the Marketplace as a version downgrade.

Workflow consolidation

  • publish-vscode.yml is one parameterized pipeline (source: none | package | build) covering the universal PR build, release bundling, and instant repackaging — the previously separate logic is gone.
  • check-format.yml, deploy-docs.yml, and the release dry-run file are folded into main.yml (leaf jobs inline, orchestration via uses:); the dry run fires on release-plumbing paths and workflow_dispatch.
  • Dead commented-out jobs and the no-op SCCACHE_BASEDIRS variable removed everywhere.

Observability & packaging

  • Binaries stamp version and target (asset-style identifier); both are logged at master startup and at the top of every crash section, so a crash log names the exact downloadable artifact and symbol package.
  • LICENSE ships in the binary packages and the vsix.
  • READMEs (project + extension) document the channels and how to get each kind of build; the extension README is now Marketplace-facing.

Validation

  • Unit (1020) + integration (299) + smoke (3) suites green locally, including new tests for the version/target stamps and the crash-log version line.
  • All workflow YAML parse-checked; the dry-run path, instant path, and universal path are each exercised by CI on this PR. The nightly orchestration itself (tag push, notes, pruning) cannot run pre-merge; its blast radius is limited to the odd-minor pre-release channel and the first run should be a watched manual dispatch.

Summary by CodeRabbit

  • New Features
    • Improved Stable/Nightly release-channel flow, including automated nightly tagging and prerelease publication.
    • VS Code publishing now supports choosing the packaging source mode (none/package/build) and produces prerelease-labeled, multi-platform VSIX outputs.
    • Startup and crash logs now include version + platform (target) stamps for easier identification.
  • Documentation
    • Updated release-channel guidance and rewrote the VS Code extension README, including release-channel/versioning details and crash symbol notes.
    • Added a complete release-process guide covering dry-run checks and symbolization scenarios.
  • Bug Fixes
    • More deterministic version stamping when multiple tags point to the same commit.
  • Chores
    • Release packages now include the LICENSE file.

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 8d2df082-04d8-4da2-adfc-c4c58a853926

📥 Commits

Reviewing files that changed from the base of the PR and between 35cd936 and 27c09f9.

📒 Files selected for processing (1)
  • .github/workflows/publish-vscode.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/publish-vscode.yml

📝 Walkthrough

Walkthrough

This change adds nightly and stable release automation, release dry-run checks, parameterized clice and VS Code publishing, target metadata in generated builds and crash logs, updated package contents, and release-channel documentation.

Changes

Release orchestration and CI gating

Layer / File(s) Summary
Release process and nightly automation
.claude/commands/release.md, .github/workflows/nightly.yml
Documents release tiers, version conventions, dry runs, and crash symbolization; nightly runs compute odd-minor tags, create pre-releases, publish packages, and prune expired nightlies.
Main workflow integration
.github/workflows/main.yml
Adds manual dispatch, release filtering, inline formatting and deployment, release checks, instant VS Code builds, and updated aggregation rules.
CI environment cleanup
.github/workflows/cross-pair.yml, .github/workflows/native-test.yml
Removes SCCACHE_BASEDIRS from native and cross-compilation environments.

Parameterized package publishing

Layer / File(s) Summary
clice and VS Code publishing
.github/workflows/publish-clice.yml, .github/workflows/publish-vscode.yml, pixi.toml
Adds release-tag inputs, replaces VS Code bundle with source and prerelease parameters, packages platform-specific artifacts, and pins Linux packaging tools.

Target version generation and crash stamps

Layer / File(s) Summary
Build target metadata
CMakeLists.txt, cmake/generate_version.cmake, cmake/version.h.in
Derives a platform target string and exposes it alongside the generated version.
Runtime logging and tests
src/server/transport/master_server.cpp, src/support/logging.cpp, tests/integration/lifecycle/test_anomaly.py, tests/unit/support/logging_tests.cpp
Startup and crash logs include version and target identifiers, with integration and unit coverage.

Package contents and release documentation

Layer / File(s) Summary
Distribution package contents
cmake/release.cmake
Copies LICENSE into the packaged clice directory.
Release and extension guidance
README.md, editors/vscode/README.md
Documents stable and nightly channels, setup, settings, troubleshooting, and crash-log support.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant NightlyWorkflow as nightly.yml
  participant GitHubRelease
  participant ClicePublisher as publish-clice.yml
  participant VSCodePublisher as publish-vscode.yml
  NightlyWorkflow->>GitHubRelease: create nightly tag and pre-release
  NightlyWorkflow->>ClicePublisher: pass release_tag
  NightlyWorkflow->>VSCodePublisher: pass package source and prerelease
  ClicePublisher->>GitHubRelease: upload packages and symbols
  VSCodePublisher->>GitHubRelease: upload VSIX assets
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: three-tier release automation for CI and release workflows.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch ci/release-tiers

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🧹 Nitpick comments (4)
.github/workflows/main.yml (2)

149-164: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Explicitly restrict permissions for reusable workflow calls.

Jobs calling reusable workflows (publish-clice.yml, publish-vscode.yml) inherit the caller's top-level default permissions. Since main.yml does not define top-level permissions, these jobs may run with broad read-all or write-all permissions depending on repository settings.

Adding a permissions: block enforces the principle of least privilege.

🔒 Proposed fix
   release-check-clice:
     needs: changes
     if: >-
       ${{ !cancelled() && (github.event_name == 'workflow_dispatch' ||
           needs.changes.outputs.release == 'true') }}
+    permissions:
+      contents: read
     uses: ./.github/workflows/publish-clice.yml
 
   release-check-vscode:
     needs: release-check-clice
     if: ${{ !cancelled() && needs.release-check-clice.result == 'success' }}
+    permissions:
+      contents: read
     uses: ./.github/workflows/publish-vscode.yml
     with:
       source: package
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/main.yml around lines 149 - 164, Add explicit
least-privilege permissions to the release-check-clice and release-check-vscode
reusable workflow jobs that call publish-clice.yml and publish-vscode.yml.
Define only the permissions required by those workflows, setting all others to
none where appropriate, while preserving the existing job dependencies and
conditions.

202-210: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Explicitly restrict permissions for instant-vscode.

Similar to the release-check-* jobs, this job calls a reusable workflow and inherits the unconstrained top-level permissions. Adding a permissions: block enforces least privilege.

🔒 Proposed fix
   instant-vscode:
     needs: [changes, native-test, cross-test]
     if: ${{ needs.changes.outputs.cmake == 'true' }}
+    permissions:
+      contents: read
     uses: ./.github/workflows/publish-vscode.yml
     with:
       source: build
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/main.yml around lines 202 - 210, Add a job-level
permissions block to the instant-vscode job that invokes publish-vscode.yml,
matching the least-privilege permissions used by the release-check-* jobs. Do
not alter its triggers, dependencies, or workflow inputs.
.github/workflows/nightly.yml (1)

13-14: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Remove overly broad top-level permissions.

Defining contents: write at the top level grants write permissions to all jobs, including the reusable workflow calls (clice and vscode) which already define their own permissions.

Instead, define contents: write directly within the prepare job (the only job missing it, as cleanup and the reusable workflows already define their own permissions blocks).

🔒 Proposed fix
-permissions:
-  contents: write
-
 jobs:
   prepare:
     runs-on: ubuntu-latest
+    permissions:
+      contents: write
     outputs:
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/nightly.yml around lines 13 - 14, Remove the top-level
permissions block and add contents: write under the prepare job’s permissions
configuration. Leave cleanup and the clice and vscode reusable workflow jobs’
existing permissions unchanged.
.github/workflows/publish-vscode.yml (1)

94-98: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Prevent shell template injection.

Passing the GitHub Actions string input directly into the shell script can trigger template injection warnings in static analysis tools (like zizmor) and is generally discouraged. Bind it to an environment variable instead.

♻️ Proposed refactor
       - name: Stage bundled server
+        env:
+          INPUT_SOURCE: ${{ inputs.source }}
         run: |
           DEST=editors/vscode/clice
-          if [ "${{ inputs.source }}" = "package" ]; then
+          if [ "$INPUT_SOURCE" = "package" ]; then
             cd /tmp/server
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/publish-vscode.yml around lines 94 - 98, Update the “Stage
bundled server” step to pass the inputs.source value through the step’s
environment rather than interpolating the GitHub Actions expression directly in
the shell condition. Keep the existing package-source branching behavior
unchanged while comparing the environment variable inside the script.

Source: Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/main.yml:
- Around line 119-124: Update the “Auto correct” workflow step to use a
consistent enforcement mode: replace --lint with --fix if it should modify
documentation and let the subsequent Check diff detect changes, or remove
continue-on-error: true if it should remain lint-only and fail on violations.

---

Nitpick comments:
In @.github/workflows/main.yml:
- Around line 149-164: Add explicit least-privilege permissions to the
release-check-clice and release-check-vscode reusable workflow jobs that call
publish-clice.yml and publish-vscode.yml. Define only the permissions required
by those workflows, setting all others to none where appropriate, while
preserving the existing job dependencies and conditions.
- Around line 202-210: Add a job-level permissions block to the instant-vscode
job that invokes publish-vscode.yml, matching the least-privilege permissions
used by the release-check-* jobs. Do not alter its triggers, dependencies, or
workflow inputs.

In @.github/workflows/nightly.yml:
- Around line 13-14: Remove the top-level permissions block and add contents:
write under the prepare job’s permissions configuration. Leave cleanup and the
clice and vscode reusable workflow jobs’ existing permissions unchanged.

In @.github/workflows/publish-vscode.yml:
- Around line 94-98: Update the “Stage bundled server” step to pass the
inputs.source value through the step’s environment rather than interpolating the
GitHub Actions expression directly in the shell condition. Keep the existing
package-source branching behavior unchanged while comparing the environment
variable inside the script.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 9abead77-d0c9-4afa-b78f-0c5d41137a5d

📥 Commits

Reviewing files that changed from the base of the PR and between 95fad18 and dee392e.

📒 Files selected for processing (20)
  • .claude/commands/release.md
  • .github/workflows/check-format.yml
  • .github/workflows/cross-pair.yml
  • .github/workflows/deploy-docs.yml
  • .github/workflows/main.yml
  • .github/workflows/native-test.yml
  • .github/workflows/nightly.yml
  • .github/workflows/publish-clice.yml
  • .github/workflows/publish-vscode.yml
  • .github/workflows/release-check.yml
  • CMakeLists.txt
  • README.md
  • cmake/generate_version.cmake
  • cmake/release.cmake
  • cmake/version.h.in
  • editors/vscode/README.md
  • src/server/transport/master_server.cpp
  • src/support/logging.cpp
  • tests/integration/lifecycle/test_anomaly.py
  • tests/unit/support/logging_tests.cpp
💤 Files with no reviewable changes (5)
  • .github/workflows/deploy-docs.yml
  • .github/workflows/cross-pair.yml
  • .github/workflows/release-check.yml
  • .github/workflows/check-format.yml
  • .github/workflows/native-test.yml

Comment thread .github/workflows/main.yml

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: dee392e4b9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .claude/commands/release.md
Comment thread .github/workflows/nightly.yml
Comment thread .github/workflows/main.yml
Comment thread CMakeLists.txt
Comment thread .github/workflows/main.yml

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/main.yml:
- Around line 218-219: Remove the secrets: inherit setting from the reusable
workflow invocation in the publish-clice job, leaving the uses reference
unchanged so the workflow relies only on the automatically provided
GITHUB_TOKEN.

In `@cmake/generate_version.cmake`:
- Around line 26-46: Update the exact-tag path in the CMake version-generation
logic to detect whether the working tree is dirty and append the “-dirty” suffix
to CLICE_GIT_DESCRIBE when it is. Preserve the highest exact-tag selection and
existing clean-build behavior, using the nearby git execution flow rather than
changing the fallback describe path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: acd6b963-edab-482e-a39e-6b20be4a23e0

📥 Commits

Reviewing files that changed from the base of the PR and between dee392e and d2ffd43.

📒 Files selected for processing (4)
  • .github/workflows/main.yml
  • .github/workflows/nightly.yml
  • CMakeLists.txt
  • cmake/generate_version.cmake
🚧 Files skipped from review as they are similar to previous changes (2)
  • CMakeLists.txt
  • .github/workflows/nightly.yml

Comment thread .github/workflows/main.yml Outdated
Comment thread cmake/generate_version.cmake

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d1d8af16f8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/publish-clice.yml Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 35cd936f9d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/nightly.yml
@16bit-ykiko
16bit-ykiko merged commit 935cc24 into main Jul 18, 2026
44 checks passed
@16bit-ykiko
16bit-ykiko deleted the ci/release-tiers branch August 8, 2026 13:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant