Skip to content

Commit 775c453

Browse files
committed
chore: merge main after RPM installer integration
Signed-off-by: Evan Lezar <elezar@nvidia.com>
2 parents f8db6e7 + 82e8893 commit 775c453

10 files changed

Lines changed: 304 additions & 4 deletions

File tree

‎.agents/skills/watch-github-actions/SKILL.md‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,18 @@ not substitute the current `main` tip or the event's older PR base SHA. Merge
132132
groups and manual runs use their explicit baseline. Findings are reported by
133133
`Reject new high or critical findings`; distinguish those from scanner failures.
134134

135+
For `Protobuf Compatibility`, check the logged train and comparison baseline.
136+
Branch Checks compares the prospective merge tree with its target; Release Tag
137+
compares the tagged candidate with the previous stable release. Both use
138+
the shared `check-protobuf-compatibility` action with `nix run .#check-protobuf-compatibility -- <ref>`.
139+
During `0.x`, a minor train permits compatibility findings
140+
as warnings; a patch train or no active train rejects them. Compare the current
141+
train's version with the latest stable release; commit messages are irrelevant.
142+
Compilation, baseline, and tool errors remain fatal. The `protobuf_compatibility` suite participates in
143+
the `release-tag-v1` qualification profile. Failed qualification prevents stable
144+
publication but still allows pre-release artifacts to publish with the failure
145+
recorded.
146+
135147
View logs for a specific run:
136148

137149
```bash
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
name: Check Protobuf Compatibility
5+
description: Check protobuf compatibility against the target or latest stable release using the release train policy. Requires a checkout with full history and tags.
6+
7+
inputs:
8+
ref:
9+
description: PR or merge-group target branch/commit, or release tag to qualify.
10+
required: true
11+
12+
runs:
13+
using: composite
14+
steps:
15+
- uses: ./.github/actions/setup-nix
16+
17+
- name: Check protobuf compatibility
18+
shell: bash
19+
env:
20+
CHECK_REF: ${{ inputs.ref }}
21+
run: |
22+
nix run .#check-protobuf-compatibility --no-write-lock-file -- "$CHECK_REF"

‎.github/actions/pr-gate/action.yml‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ outputs:
1616
should_run:
1717
description: "true if the workflow should proceed, false otherwise"
1818
value: ${{ steps.gate.outputs.should_run }}
19+
base_sha:
20+
description: "Target branch commit SHA for a mirrored pull request, or empty for other events"
21+
value: ${{ steps.gate.outputs.base_sha }}
1922
labels_json:
2023
description: "JSON array of PR label names for push-triggered mirror runs, or [] otherwise"
2124
value: ${{ steps.gate.outputs.labels_json }}
@@ -40,16 +43,19 @@ runs:
4043
if [ "$EVENT_NAME" != "push" ]; then
4144
echo "labels_json=[]" >> "$GITHUB_OUTPUT"
4245
echo "should_run=true" >> "$GITHUB_OUTPUT"
46+
echo "base_sha=" >> "$GITHUB_OUTPUT"
4347
exit 0
4448
fi
4549
4650
if [ "$GET_PR_INFO_OUTCOME" != "success" ]; then
4751
echo "labels_json=[]" >> "$GITHUB_OUTPUT"
4852
echo "should_run=false" >> "$GITHUB_OUTPUT"
53+
echo "base_sha=" >> "$GITHUB_OUTPUT"
4954
exit 0
5055
fi
5156
5257
head_sha="$(jq -r '.head.sha' <<< "$PR_INFO")"
58+
base_sha="$(jq -r '.base.sha // empty' <<< "$PR_INFO")"
5359
labels_json="$(jq -c '[.labels[].name]' <<< "$PR_INFO")"
5460
if [ -z "$REQUIRED_LABEL" ]; then
5561
has_label=true
@@ -67,3 +73,4 @@ runs:
6773
6874
echo "labels_json=$labels_json" >> "$GITHUB_OUTPUT"
6975
echo "should_run=$should_run" >> "$GITHUB_OUTPUT"
76+
echo "base_sha=$base_sha" >> "$GITHUB_OUTPUT"

‎.github/workflows/branch-checks.yml‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,33 @@ jobs:
3030
pull-requests: read
3131
outputs:
3232
should_run: ${{ steps.gate.outputs.should_run }}
33+
base_sha: ${{ steps.gate.outputs.base_sha }}
3334
steps:
3435
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3536

3637
- id: gate
3738
uses: ./.github/actions/pr-gate
3839

40+
protobuf-compatibility:
41+
name: Protobuf Compatibility
42+
needs: pr_metadata
43+
if: needs.pr_metadata.outputs.should_run == 'true'
44+
runs-on: linux-amd64-cpu8
45+
timeout-minutes: 15
46+
steps:
47+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
48+
with:
49+
fetch-depth: 0
50+
persist-credentials: false
51+
52+
- uses: ./.github/actions/check-protobuf-compatibility
53+
with:
54+
ref: >-
55+
${{ github.event_name == 'workflow_dispatch'
56+
&& format('refs/remotes/origin/{0}', github.event.repository.default_branch)
57+
|| github.event.merge_group.base_sha
58+
|| needs.pr_metadata.outputs.base_sha }}
59+
3960
mise-lockfile:
4061
name: mise Lockfile
4162
needs: pr_metadata

‎.github/workflows/release-tag.yml‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,28 @@ jobs:
223223
checkout-ref: ${{ needs.compute-versions.outputs.source_sha }}
224224
conformance-artifact-prefix: openshell-conformance
225225

226+
protobuf-compatibility:
227+
name: Protobuf Compatibility
228+
needs: compute-versions
229+
runs-on: linux-amd64-cpu8
230+
timeout-minutes: 15
231+
steps:
232+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
233+
with:
234+
fetch-depth: 0
235+
persist-credentials: false
236+
ref: ${{ needs.compute-versions.outputs.source_sha }}
237+
238+
- uses: ./.github/actions/check-protobuf-compatibility
239+
with:
240+
ref: refs/tags/${{ env.RELEASE_TAG }}
241+
226242
qualification-result:
227243
name: Release Qualification
228244
if: always()
229245
needs:
230246
- compute-versions
247+
- protobuf-compatibility
231248
- security
232249
- conformance-integration
233250
- feature-specific-integration
@@ -253,6 +270,7 @@ jobs:
253270
DOCKER_E2E_RESULT: ${{ needs.docker-e2e.result }}
254271
FEATURE_INTEGRATION_RESULT: ${{ needs.feature-specific-integration.result }}
255272
IS_PRERELEASE: ${{ needs.compute-versions.outputs.is_prerelease }}
273+
PROTO_COMPATIBILITY_RESULT: ${{ needs.protobuf-compatibility.result }}
256274
SECURITY_RESULT: ${{ needs.security.result }}
257275
SOURCE_SHA: ${{ needs.compute-versions.outputs.source_sha }}
258276
VM_E2E_RESULT: ${{ needs.vm-e2e.result }}
@@ -277,6 +295,7 @@ jobs:
277295
echo
278296
echo "| Suite | Result |"
279297
echo "| --- | --- |"
298+
echo "| Protobuf API compatibility | ${PROTO_COMPATIBILITY_RESULT} |"
280299
echo "| Security | ${SECURITY_RESULT} |"
281300
echo "| Conformance integration | ${CONFORMANCE_RESULT} |"
282301
echo "| Feature integration | ${FEATURE_INTEGRATION_RESULT} |"

‎CI.md‎

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,55 @@ Manual admission does not change the bot's automatic trust policy for ready PRs.
1717

1818
Merge queue validation is a second integration gate for `main`. After a PR has passed the required PR-head statuses, a maintainer adds it to the merge queue. GitHub creates a temporary merge-group branch that combines the latest `main`, the queued PR, and any earlier queued PRs. The same required `OpenShell / ...` status contexts are then published against the merge-group SHA before GitHub merges it.
1919

20+
### Protobuf API compatibility
21+
22+
`Protobuf Compatibility` runs in Branch Checks and Release Tag through the shared
23+
`check-protobuf-compatibility` action and Nix app. The app supplies Python, Buf,
24+
and Git from the flake lockfile.
25+
It uses Buf's `FILE` policy for the `proto/`
26+
module, covering SDK descriptors and extension contracts. Storage-only protobufs
27+
remain subject to their separate durability checks.
28+
29+
Branch Checks compares the prospective merge tree with the PR target commit,
30+
so additions on the target do not look like deletions in an outdated PR. Merge
31+
queues use their base commit. Both paths resolve the train from tags reachable
32+
from that target, preventing a PR from selecting its own train. The checkout
33+
must contain full history and tags; the checker leaves HEAD and working files
34+
unchanged.
35+
36+
The current train's version is compared with the latest stable release. During
37+
`0.x`, a minor increment permits breaking changes: for example, `0.2.0-pre.N`
38+
after stable `0.1.2`. A patch increment such as `0.1.3-pre.N` rejects them.
39+
Commit messages do not affect this decision. No active train also rejects
40+
breaking changes. Allowed findings remain visible as warnings; schema errors,
41+
missing baselines, merge conflicts, and tool failures always fail the check.
42+
43+
Release Tag compares the tagged candidate cumulatively against the previous
44+
stable release, using the same minor-versus-patch policy. Its result is part
45+
of the qualification profile: failure blocks stable publication, while a
46+
pre-release can still publish with failed qualification recorded. This checks
47+
protobuf compatibility; SDK/configuration compatibility and migration review
48+
remain separate qualification work.
49+
50+
Fetch the target and tags to check committed branch changes locally, replacing
51+
`origin/main` for another target:
52+
53+
```shell
54+
git fetch origin main --tags
55+
nix run .#check-protobuf-compatibility -- origin/main
56+
```
57+
58+
The same command accepts a release tag to qualify it against the previous stable
59+
release. Branch names and commit SHAs select the branch comparison instead:
60+
61+
```shell
62+
nix run .#check-protobuf-compatibility -- refs/tags/v0.2.0-pre.1
63+
```
64+
65+
For an intentional minor-train incompatibility, record the Buf finding,
66+
linked issue, consumer impact, and migration plan in the PR. Keep the finding
67+
visible; do not disable the job or add a broad Buf ignore rule.
68+
2069
Windows PR checks are opt-in: add `test:windows`, then select **Re-run all jobs**
2170
on the current Windows MSVC run. Subsequent mirrored commits run them automatically.
2271
Windows checks are not required for merging and do not run in merge queues.
@@ -182,7 +231,7 @@ jobs:
182231
```
183232
184233
Set `needs: security` on a downstream promotion job to require successful scans.
185-
The tagged release workflow records security and integration outcomes in a
234+
The tagged release workflow records protobuf, security, and integration outcomes in a
186235
qualification job after publishing its commit-addressed OCI images. A failed
187236
check remains visible in the workflow, but pre-release artifact assembly and
188237
publication continue. Stable publication currently requires the implemented
@@ -441,7 +490,7 @@ These workflows run after merge to publish dev/tagged artifacts and verify them.
441490
| File | Role |
442491
|---|---|
443492
| `.github/workflows/release-dev.yml` | Publishes the rolling `dev` build on every push to `main`. Builds gateway, sandbox, and supervisor images and binaries, packages, wheels, and pushes the Helm chart as `oci://ghcr.io/nvidia/openshell/helm-chart:0.0.0-dev` (plus an immutable `0.0.0-dev.<sha>` pin). Also dispatchable manually. |
444-
| `.github/workflows/release-tag.yml` | Publishes tagged stable releases and manually dispatched pre-releases. Its automatic tag trigger excludes `-pre.*`. Security and integration failures do not block pre-release artifact publication. Stable publication requires the currently implemented qualification profile to pass; the summary identifies the remaining RFC 0014 coverage. |
493+
| `.github/workflows/release-tag.yml` | Publishes tagged stable releases and manually dispatched pre-releases. Its automatic tag trigger excludes `-pre.*`. Protobuf, security, and integration failures do not block pre-release artifact publication. Stable publication requires the currently implemented qualification profile to pass; the summary identifies the remaining RFC 0014 coverage. |
445494
| `.github/workflows/release-canary.yml` | Smoke-tests published dev artifacts in the `macos`, `ubuntu-deb`, `ubuntu-snap-system-docker`, `fedora`, and `kubernetes` (kind + Helm) jobs. Each job reaches its gateway and creates, exercises, and deletes a sandbox. The Snap lanes verify a compatible system Docker lifecycle and `ubuntu-snap-docker-preflight` tests fail-fast behavior when Docker is absent or supplied by the Docker snap. It runs automatically after `Release Dev` succeeds and supports manual dispatch (`gh workflow run release-canary.yml --ref <branch>`). See the `test-release-canary` skill for the playbook and local kind reproduction. |
446495

447496
## Required status contexts

‎flake.nix‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@
6060
pkg-config
6161
# Coverage.
6262
lcov
63+
# mise dependencies
64+
mise
65+
cmakeMinimal
66+
zlib
67+
openssl_3_5
68+
xz
69+
gh
6370
kubernetes-helm
6471
syft
6572
trivy
@@ -125,9 +132,23 @@
125132
firmwarePkgs = tmachineRuntimePkgs;
126133
};
127134
artifacts = pkgs.callPackage ./tests/artifacts.nix { inherit rustToolchain toolchains; };
135+
checkProtobufCompatibility = pkgs.writeShellApplication {
136+
name = "check-protobuf-compatibility";
137+
runtimeInputs = [
138+
pkgs.buf
139+
pkgs.git
140+
];
141+
text = ''
142+
exec ${pkgs.python3}/bin/python3 ${./tasks/scripts}/check_proto_compatibility.py "$@"
143+
'';
144+
};
128145
in
129146
{
130147
apps = {
148+
check-protobuf-compatibility = {
149+
type = "app";
150+
program = "${checkProtobufCompatibility}/bin/check-protobuf-compatibility";
151+
};
131152
build-artifacts = {
132153
type = "app";
133154
program = "${artifacts.all}/bin/build-artifacts";

0 commit comments

Comments
 (0)