Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: CI
name: Validate organization catalog and profile
# Validate the catalog and generated profile, then request the member-profile refresh.
on: [push, pull_request, workflow_dispatch]
permissions: { contents: read }
jobs:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
name: Verify
name: Reusable build, test and package verification
# Reusable manifest-driven build, test, formatting and native-package verification.
on:
workflow_call:
permissions:
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ path is included because that workflow is delivered here.

## Shared Verify

`.github/workflows/verify.yml` remains `workflow_call`-only and read-only. The
`.github/workflows/verify-project.yml` remains `workflow_call`-only and read-only. The
manifest is the single authority for build options; the catalog holds identity.
Preparation validates the manifest before selecting the C++ container or native
Python matrix. The canonical caller uses only `workflow_dispatch`: full
Expand Down Expand Up @@ -116,7 +116,7 @@ files against existing repository formatting policies. Documentation and present

### Shared Verify updates

The five product callers and `templates/ci.yml` use `verify.yml@main`, following the API-verified default branch of this control repository. A merged shared-workflow change is used by their next manually started CI runs; it does not start those runs. Callers pass no secrets unless Verify actually reads one (currently none). Product CI remains `workflow_dispatch`-only, independent of version-tag package pipelines.
The five product callers and `templates/build-and-test.yml` use `verify-project.yml@main`, following the API-verified default branch of this control repository. A merged shared-workflow change is used by their next manually started CI runs; it does not start those runs. Callers pass no secrets unless Verify actually reads one (currently none). Product CI remains `workflow_dispatch`-only, independent of version-tag package pipelines.

Existing tags are historical snapshots and are never moved. Page-header, menu and profile generation are separate from build CI; documentation changes require neither a Verify release nor caller updates. `docs-audit` is optional local/PR review tooling and is never a build, signing or publication gate.

Expand Down
8 changes: 4 additions & 4 deletions profile/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ SNodeC builds event-driven networking in C++. At its centre is [SNode.C](https:/

| Project | What it is for | Status |
| --- | --- | --- |
| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT<br>[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [![CI](https://github.com/SNodeC/snode.c/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/snode.c/actions/workflows/ci.yml) |
| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages<br>[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [![CI](https://github.com/SNodeC/mqttsuite/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/mqttsuite/actions/workflows/ci.yml) |
| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript<br>[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [![CI](https://github.com/SNodeC/AISuite/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/AISuite/actions/workflows/ci.yml) |
| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace<br>[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [![CI](https://github.com/SNodeC/CodexUI/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/SNodeC/CodexUI/actions/workflows/ci.yml) |
| **[SNode.C](https://github.com/SNodeC/snode.c#project-overview)** | Write networked programs and your own protocols in C++: event-driven, with HTTP, WebSocket, SSE and MQTT<br>[Quick start](https://github.com/SNodeC/snode.c#quick-start) · [Install](https://github.com/SNodeC/snode.c#install) · [Releases](https://github.com/SNodeC/snode.c/releases) | [![CI](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/snode.c/actions/workflows/build-and-test.yml) |
| **[MQTTSuite](https://github.com/SNodeC/mqttsuite#project-overview)** | Run an MQTT broker, translate topics, bridge brokers and store messages<br>[Quick start](https://github.com/SNodeC/mqttsuite#quick-start) · [Install](https://github.com/SNodeC/mqttsuite#install) · [Releases](https://github.com/SNodeC/mqttsuite/releases) | [![CI](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/mqttsuite/actions/workflows/build-and-test.yml) |
| **[AISuite](https://github.com/SNodeC/AISuite#project-overview)** | Connect applications to coding agents: asynchronous C++ and TypeScript<br>[Quick start](https://github.com/SNodeC/AISuite#quick-start) · [Install](https://github.com/SNodeC/AISuite#install) | [![CI](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml/badge.svg?branch=master)](https://github.com/SNodeC/AISuite/actions/workflows/build-and-test.yml) |
| **[Codex(W)UI](https://github.com/SNodeC/CodexUI#project-overview)** | Follow a coding agent's work in a native Qt or browser workspace<br>[Quick start](https://github.com/SNodeC/CodexUI#quick-start) · [Install](https://github.com/SNodeC/CodexUI#install) | [![CI](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml/badge.svg?branch=master)](https://github.com/SNodeC/CodexUI/actions/workflows/build-and-qualify.yml) |
| **[SNode.C-idp](https://github.com/SNodeC/snode.c-idp)** | SNode.C Identity Provider: OAuth2 and OpenID Connect with TOTP multi-factor authentication | |

## Install
Expand Down
26 changes: 13 additions & 13 deletions profile/github-metadata.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{
".github": {
"default_branch": "main",
"workflow": ".github/workflows/ci.yml"
"workflow": ".github/workflows/validate-organization.yml"
},
"AISuite": {
"default_branch": "master",
"readme_anchor": "project-overview",
"source_commit": "2ca800516b45eba7f5fb2c055adebfe7c53ee51f",
"workflow": ".github/workflows/ci.yml"
"source_commit": "45bbc477546bca8055575c17cebbb16db7bb24be",
"workflow": ".github/workflows/build-and-test.yml"
},
"AutoTalk": {
"default_branch": "main",
"source_commit": "36ab5fb80b029e6ecaf292353c0b6ff9f9ca6671",
"workflow": ".github/workflows/ci.yml"
"source_commit": "cef28ba531e25116ed7b5557886b9d88867f61d2",
"workflow": ".github/workflows/test-and-package.yml"
},
"CLI11": {
"default_branch": "main",
Expand All @@ -22,13 +22,13 @@
"CodexUI": {
"default_branch": "master",
"readme_anchor": "project-overview",
"source_commit": "292d45a616daabc32a58fc4742dfb82657d0d107",
"workflow": ".github/workflows/ci.yml"
"source_commit": "33a5357bee5978ecaa31a2b7dab55b858843e9f7",
"workflow": ".github/workflows/build-and-qualify.yml"
},
"DistributionPackages": {
"default_branch": "main",
"source_commit": "40d7a9638125de8e384150693cf3328d6afaed72",
"workflow": ".github/workflows/release.yml"
"source_commit": "f941021a88953cf962ac2b926e456cb25d2fda18",
"workflow": ".github/workflows/sign-and-publish-packages.yml"
},
"GpsdOsmViewer": {
"default_branch": "master",
Expand Down Expand Up @@ -116,8 +116,8 @@
"prerelease": false,
"tag": "v1.0.2"
},
"source_commit": "af349df3a418a046796c80debe1a960e5243793d",
"workflow": ".github/workflows/ci.yml"
"source_commit": "3cfaa5dde4af54970ef3f5132d2cd26c4d5277a8",
"workflow": ".github/workflows/build-and-test.yml"
},
"mqttsuite-doc": {
"default_branch": "main",
Expand All @@ -139,8 +139,8 @@
"prerelease": false,
"tag": "v2.0.0"
},
"source_commit": "692c914dd8bcfa2cc070cfb589f5b645185efad5",
"workflow": ".github/workflows/ci.yml"
"source_commit": "2ab5974153f7e36641e77791a888debd575b897f",
"workflow": ".github/workflows/build-and-test.yml"
},
"snode.c-doc": {
"default_branch": "main",
Expand Down
6 changes: 6 additions & 0 deletions templates/build-and-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
name: Build and test project
on: [workflow_dispatch]
permissions: { contents: read }
jobs:
snodec:
uses: SNodeC/.github/.github/workflows/verify-project.yml@main
6 changes: 0 additions & 6 deletions templates/ci.yml

This file was deleted.

12 changes: 6 additions & 6 deletions tests/test_verify.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import yaml

ROOT = Path(__file__).resolve().parents[1]
WORKFLOW = yaml.load((ROOT / ".github/workflows/verify.yml").read_text(), Loader=yaml.BaseLoader)
WORKFLOW = yaml.load((ROOT / ".github/workflows/verify-project.yml").read_text(), Loader=yaml.BaseLoader)


def script(job, name):
Expand Down Expand Up @@ -141,18 +141,18 @@ def test_jobs_have_bounded_timeouts_fixed_linux_and_full_action_pins(self):
for step in job["steps"]:
if "uses" in step:
self.assertRegex(step["uses"], r"^actions/(checkout|setup-python|upload-artifact)@[0-9a-f]{40}$")
text = (ROOT / ".github/workflows/verify.yml").read_text()
text = (ROOT / ".github/workflows/verify-project.yml").read_text()
for line in text.splitlines():
if "uses:" in line:
self.assertRegex(line, r"@[0-9a-f]{40} # v[0-9]+\.[0-9]+\.[0-9]+$")


def test_template_exact_and_control_checks_independent(self):
self.assertEqual((ROOT / "templates/ci.yml").read_text(),
"name: CI\non: [workflow_dispatch]\n"
self.assertEqual((ROOT / "templates/build-and-test.yml").read_text(),
"name: Build and test project\non: [workflow_dispatch]\n"
"permissions: { contents: read }\njobs:\n snodec:\n"
" uses: SNodeC/.github/.github/workflows/verify.yml@main\n")
ci = yaml.load((ROOT / ".github/workflows/ci.yml").read_text(), Loader=yaml.BaseLoader)
" uses: SNodeC/.github/.github/workflows/verify-project.yml@main\n")
ci = yaml.load((ROOT / ".github/workflows/validate-organization.yml").read_text(), Loader=yaml.BaseLoader)
steps = ci["jobs"]["control"]["steps"]
self.assertEqual(ci["on"], ["push", "pull_request", "workflow_dispatch"])
self.assertEqual(ci["jobs"]["control"]["runs-on"], "ubuntu-24.04")
Expand Down