Skip to content

ci(release): tag-triggered release.yaml orchestrator + draft-release capstone#36

Merged
monsieurleberre merged 7 commits into
mainfrom
feat/release-orchestrator
Jul 21, 2026
Merged

ci(release): tag-triggered release.yaml orchestrator + draft-release capstone#36
monsieurleberre merged 7 commits into
mainfrom
feat/release-orchestrator

Conversation

@monsieurleberre

Copy link
Copy Markdown
Contributor

Pre-open

  • pre-open review
  • Skipped intentionally: an equivalent, superior review already ran while this branch was built — a spec+quality review after each of the 7 tasks plus a full whole-branch integration review on the most capable model. No code fixes are outstanding; the two follow-ups below are documented, not defects.

Summary

Implements the tag-triggered release orchestrator (S4 of the release-orchestration umbrella). A thin release.yaml resolves one version and assembles a complete draft GitHub Release — runtime NuGets, the dpm-codegen-cs OCI image, Splice + Daml.Finance DAR NuGets — via one ordered needs:-chain, then stops. Publishing the Release is a separate, human-gated button.

Changes

  • release.yaml (new)on: push tags v* + workflow_dispatch{version,dry_run,…}; resolves one version and chains draft-bootstrap → runtime-publish → oci-build → (splice ‖ daml-finance) → complete via needs:/workflow_call. Stops at a COMPLETE DRAFT.
  • finalize-release.yaml (new) — human workflow_dispatch publish button (draft → published). NEVER auto-runs.
  • _release-lifecycle.yaml (new) — reusable owning draft bootstrap + finalize (gh CLI); de-dups the two inline gh release create blocks.
  • publish.yaml — gains workflow_call{version,dry_run} + outputs and a dry-run pack-only path; drops its own push: tags (the orchestrator owns tag triggering); attach is upload-only.
  • _publish-dar-packages.yaml + both thin callers (publish-splice.yaml, publish-daml-finance.yaml) — gain a release_tag seam; DAR attach now runs in dry-run too (nuget push + counter write-back stay gated).
  • build-oci-codegen-cs.yaml — drops push: tags; attach is upload-only (bootstrap owns creation).

Behaviour (blessed decisions)

  1. Runtime dry-run = inline pack-only (no push; shared csharp-publish action untouched).
  2. DAR attach decoupled from the pulled image version via release_tag.
  3. OCI is validated separately via the OCI_PUBLISH_ENABLED dispatch dance, not the rehearsal. The rehearsal draft carries runtime + Splice + Daml.Finance.
  4. A real v* tag push publishes packages to nuget.org + bumps counters immediately, and pushes the OCI image to GHCR; ONLY the GitHub Release stays a draft until a human runs Finalize.

Validation

  • actionlint clean across the whole tree (one pre-existing, unrelated SC2129 style note in build-oci's untouched validate-inputs job remains). Because every uses: is a local reusable, actionlint resolves each callee and checks the orchestrator's with:/secrets: against each callee's declared inputs — the integration wiring is machine-verified.
  • yq structural assertions per file.
  • Post-merge acceptance (documented runbook): a dry_run=true rehearsal on a throwaway tag → complete draft, no nuget push, no counter bump; the OCI leg via the OCI_PUBLISH_ENABLED dispatch.

Operational preconditions (public repo)

  • Repo vars SPLICE_VERSION / DAML_FINANCE_VERSION (unattended tag-push path; workflow_dispatch passes them as inputs). Daml.Finance further falls back to 2.10.0.
  • OCI_PUBLISH_ENABLED='true' — the Splice/Daml.Finance legs needs: oci-build, and the whole OCI workflow is gated by this var. It is 'true' on this repo by design (public owns OCI publishing); documented here so it isn't silently a hole.

Deferred (documented, non-blocking)

  • release.yaml resolve: codegen_cs_version is documented "dry_run only" but applied unconditionally. Safe on the tag-push path (no such input is passed). Optional fast-follow guard: [ "$DRY" = "true" ] || CGV="${VERSION}".
  • The dry_run rehearsal exercises the pack-only attach path, not the real csharp-publish attach path — confirm runtime nupkgs land on the first real finalize.

Topology recorded in internal ADR 0018.

@github-actions

Copy link
Copy Markdown
Contributor

Scala coverage

Code Coverage

Package Line Rate Branch Rate Health
studio.peaceful.daml.codegen.helper 97% 95%
Summary 97% (642 / 663) 95% (145 / 152)

@github-actions

Copy link
Copy Markdown
Contributor

C# coverage

Code Coverage

Package Line Rate Branch Rate Complexity Health
Daml.Codegen.CSharp 98% 97% 1195
Daml.Codegen.CSharp.Cli 100% 100% 3
Daml.Codegen.Testing.Conformance 78% 98% 73
Daml.Ledger.Abstractions 73% 89% 21
Daml.Ledger.Abstractions.Testing.Conformance 59% 50% 16
Daml.Runtime 94% 84% 538
Summary 96% (4136 / 4330) 93% (1623 / 1743) 1846

@github-actions

Copy link
Copy Markdown
Contributor

C# build matrix

shard result duration
macos-amd64 ✅ success 1m 52s
macos-arm64 ✅ success 1m 10s
ubuntu-amd64 ✅ success 1m 13s
ubuntu-arm64 ✅ success 1m 02s
windows-amd64 ✅ success 1m 37s
windows-arm64 ✅ success 1m 54s

@github-actions

Copy link
Copy Markdown
Contributor

Scala build matrix

shard result duration
macos-amd64 ✅ success 2m 48s
macos-arm64 ✅ success 1m 15s
ubuntu-amd64 ✅ success 52s
ubuntu-arm64 ✅ success 1m 05s
windows-amd64 ✅ success 1m 18s

@monsieurleberre
monsieurleberre merged commit 14df619 into main Jul 21, 2026
24 checks passed
@monsieurleberre
monsieurleberre deleted the feat/release-orchestrator branch July 21, 2026 10:12
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.

1 participant