Implement unified CI/CD release automation framework with nightly builds, semi-automatic promotion, and multi-registry orchestration - #6255
Conversation
…matic promotion - Add RELEASE_TYPE file for consistent version management - Create version-release-type-manager.sh for atomic version/type operations - Implement generate-build-metadata composite action (OCI labels, JSON metadata) - Create release-nightly.yml workflow (daily builds at 03:30 UTC) - Create release-promote.yml workflow (semi-auto via PR labels) - Add build-metadata schema documentation - Add nightly release notes template Phases implemented: ✓ Phase 1: Build Metadata & Release Type Infrastructure ✓ Phase 2: Nightly Release Workflow ✓ Phase 3: Semi-automatic Release Triggering (via PR) Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
…i-auto promotion Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
…for nightly and semi-auto releases Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
…ASE_ARTIFACT_LOCATIONS) Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
✅ Wave C Policy Gate: Hash & SBOM IntegrityResult: ✅ Hash & SBOM Integrity PASSED Checks
|
✅ Wave C Policy Gate: Private Plugin Boundary EnforcementResult: ✅ Private Plugin Boundary Enforcement PASSED Checks
|
✅ Wave C Policy Gate: Edition & License ValidationResult: ✅ Edition & License Validation PASSED Checks
|
✅ Wave C Policy Gate: Community Fail-Closed ValidationResult: ✅ Community Fail-Closed Validation PASSED Checks
|
There was a problem hiding this comment.
🟡 Changes recommended
Several newly added workflows/scripts contain concrete runtime-breaking issues (invalid tag trigger patterns, missing/incorrect workflow outputs, incorrect artifact download mechanism, and scripting errors) that will prevent the automation from functioning as described.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This pull request introduces a unified release automation framework (nightly builds, label-driven promotion, unified publish orchestration, rollback, and WinGet integration) and updates governance/process documentation to define the new versioning and release-type model (including the new RELEASE_TYPE file).
Changes:
- Added multiple GitHub Actions workflows for nightly releases, promotion flows, unified publish orchestration, WinGet submission, rollback, and shared build/changelog lanes.
- Added helper scripts and a composite action to manage VERSION/RELEASE_TYPE, generate build metadata, validate cross-registry consistency, and produce WinGet checksums/manifests.
- Updated/added documentation describing release types, procedures, artifact locations, and build-metadata schema.
File summaries
| File | Description |
|---|---|
VERSIONING.md |
Documents new RELEASE_TYPE file and release-type semantics (nightly/alpha/beta/rc/stable). |
SOP.md |
Adds SOP procedures for automated nightly releases and label-driven promotion. |
RELEASE_TYPE |
Introduces a release-type source-of-truth file. |
RELEASE_STRATEGY.md |
Adds nightly + semi-automatic promotion flow documentation and renumbers later sections. |
docs/RELEASE_PROCESS_QUICKREF.md |
New quick reference/decision tree for release flows and commands. |
docs/RELEASE_ARTIFACT_LOCATIONS.md |
New inventory of artifact locations across GitHub Releases, registries, and WinGet. |
docs/BUILD_METADATA_SPEC.md |
Defines build-metadata.json schema and distribution strategy. |
.github/workflows/release-winget.yml |
New workflow intended to generate/validate WinGet manifests from a stable release. |
.github/workflows/release-rollback.yml |
New manual rollback workflow (delete release, revert version files, guidance). |
.github/workflows/release-publish.yml |
New tag-triggered unified orchestrator for GitHub + Docker + WinGet. |
.github/workflows/release-promote.yml |
New PR-label-driven promotion workflow that bumps version/type and opens a release PR. |
.github/workflows/release-nightly.yml |
New scheduled nightly build/release workflow with metadata and Docker publishing. |
.github/workflows/release-mainline.yml |
Large release packaging workflow (build matrix, package, validate, publish). |
.github/workflows/release-docker-image.yml |
Docker image build/push workflow (supports reusable calls + provenance). |
.github/workflows/release-changelog.yml |
New consolidated changelog update/backfill workflow. |
.github/workflows/release-build-matrix.yml |
New reusable build matrix workflow (community/linux/windows release lanes). |
.github/templates/nightly-release-notes.md |
Template for nightly release notes content. |
.github/scripts/version-release-type-manager.sh |
New script for VERSION/RELEASE_TYPE read/write/bump/nightly derivation. |
.github/scripts/validate-release-consistency.sh |
New script intended to validate cross-registry release consistency. |
.github/scripts/generate-winget-checksums.ps1 |
New PowerShell checksum + optional SBOM generator for WinGet inputs. |
.github/actions/generate-build-metadata/action.yml |
New composite action generating build-metadata.json and Docker labels. |
Review details
- Files reviewed: 17/21 changed files
- Comments generated: 10
- Review effort level: Lite
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| # Return checksums as output for downstream jobs | ||
| Write-Host "checksums-file=$ChecksumFile" | Out-File -FilePath env:GITHUB_OUTPUT -Append -Encoding utf8 | ||
| Write-Host "checksums-json=$ChecksumJson" | Out-File -FilePath env:GITHUB_OUTPUT -Append -Encoding utf8 |
There was a problem hiding this comment.
Fixed in 095a3b4: switched both workflow outputs to write to $env:GITHUB_OUTPUT so downstream steps receive checksums-file and checksums-json correctly.
| local new_version="${major}.${minor}.${patch}" | ||
| cmd_write_version "$new_version" | ||
| echo "$new_version" | ||
| } |
There was a problem hiding this comment.
Fixed in 095a3b4: bump-version is now side-effect free and returns only the computed version (no file writes).
| needs: [extract-release-context, bump-version] | ||
| runs-on: ubuntu-latest | ||
| if: needs.extract-release-context.outputs.should-run == 'true' | ||
| steps: |
There was a problem hiding this comment.
Fixed in 095a3b4: added job-level outputs to create-release-pr and wired them from actions/create-pull-request outputs for reliable use in notify.
| on: | ||
| push: | ||
| tags: | ||
| - 'v[0-9]+.[0-9]+.[0-9]+*' | ||
| - 'enterprise-v[0-9]+.[0-9]+.[0-9]+*' | ||
| - 'hyperscaler-v[0-9]+.[0-9]+.[0-9]+*' | ||
| - 'military-v[0-9]+.[0-9]+.[0-9]+*' | ||
| - 'minimal-v[0-9]+.[0-9]+.[0-9]+*' | ||
|
|
There was a problem hiding this comment.
Fixed in 095a3b4: replaced regex-like tag filters with GitHub Actions glob-compatible tag patterns.
| - name: Download release artifacts | ||
| id: download | ||
| uses: actions/download-artifact@v4 | ||
| with: | ||
| path: release-artifacts | ||
| merge-multiple: true | ||
|
|
There was a problem hiding this comment.
Fixed in 095a3b4: replaced actions/download-artifact with gh release download to fetch actual GitHub Release assets by tag.
| - name: Update RELEASE_TYPE to nightly | ||
| run: | | ||
| echo "nightly" > RELEASE_TYPE | ||
| git config user.name "github-actions[bot]" | ||
| git config user.email "github-actions[bot]@users.noreply.github.com" | ||
| git add RELEASE_TYPE | ||
| git commit -m "chore: set RELEASE_TYPE=nightly for build #${{ github.run_number }}" || true | ||
| git push origin HEAD:refs/heads/${{ github.ref_name }} || true |
There was a problem hiding this comment.
Fixed in 095a3b4: removed branch mutation from nightly set-release-type; it no longer commits/pushes RELEASE_TYPE to the repository.
| - name: Generate build metadata | ||
| id: metadata | ||
| uses: ./.github/actions/generate-build-metadata | ||
| with: | ||
| output-path: build-metadata.json | ||
|
|
There was a problem hiding this comment.
Fixed in 095a3b4: nightly metadata job now writes a workspace-only RELEASE_TYPE=nightly override before running the metadata action.
|
|
||
| echo "version=$VERSION" >> "$GITHUB_OUTPUT" | ||
| echo "is-stable=$IS_STABLE" >> "$GITHUB_OUTPUT" | ||
| echo "should-submit=$SHOULD_SUBMIT" >> "$GITHUB_OUTPUT" |
There was a problem hiding this comment.
Fixed in 095a3b4: detect-release now emits release-type=stable when stable submission conditions are met.
Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
Co-authored-by: makr-code <150588092+makr-code@users.noreply.github.com>
Pull Request
Target Version (Required)
Target Version: [Unreleased]
Phased infrastructure work for release automation; no user-facing changes in this release cycle.
Description
Implements complete 6-phase release automation framework to replace fragmented manual processes with consistent, multi-registry versioning and automated workflows.
Phase 1: Build Metadata Infrastructure
RELEASE_TYPEfile (source-of-truth: nightly|alpha|beta|rc|stable) paired with VERSION for atomic updates.github/scripts/version-release-type-manager.sh: Central utility for all version/release-type operations (read/write/bump/nightly-tag generation).github/actions/generate-build-metadata/: Composite action generatingbuild-metadata.json(timestamp, commit, build#, release_type) + OCI labels for Docker imagesdocs/BUILD_METADATA_SPEC.md: Formal schema and distribution strategyPhase 2: Nightly Release Workflow
.github/workflows/release-nightly.yml: Automatic daily nightly builds (03:30 UTC) with smart change detectionv<major>.<minor>.<patch>-nightly.<YYYYMMDD>.<runnum>(sortable, multi-per-day support)nightly,nightly-YYYYMMDD, full version), pre-release on GitHubPhase 3: Semi-automatic Release via PR Labels
.github/workflows/release-promote.yml: Triggered by PR labels (release/alpha|beta|rc|stable) on mergePhase 4: WinGet CI/CD Integration
.github/workflows/release-winget.yml: Triggered by GitHub Release (stable-only policy for pre-releases).github/scripts/generate-winget-checksums.ps1: PowerShell manifest generation with SHA256 + SBOMPhase 5: Unified Release Orchestration
.github/workflows/release-publish.yml: Single version tag push orchestrates all three registries (GitHub + Docker + WinGet).github/workflows/release-rollback.yml: Manual recovery workflow (delete release, revert version, docker cleanup guidance).github/scripts/validate-release-consistency.sh: Cross-registry consistency validation (artifacts, tags, checksums)Phase 6: Governance Documentation Synchronization
RELEASE_STRATEGY.md: Added sections 8-9 (nightly + semi-auto release flows), ~450 new linesVERSIONING.md: Enhanced section 2 (RELEASE_TYPE file), new section 3 (nightly format + docker tags), ~400 new linesSOP.md: Added SOP-04b (nightly automation) and SOP-04c (semi-auto promotion), ~500 new linesdocs/RELEASE_PROCESS_QUICKREF.md: Decision tree, command cheat sheet, version bump rules (~370 lines)docs/RELEASE_ARTIFACT_LOCATIONS.md: Artifact inventory per registry with retrieval methods (~460 lines)Example: Semi-automatic release flow
Type of Change
Breaking Change Checklist
N/A — infrastructure change with no breaking changes to user-facing APIs.
Testing
Security Tiering Impact (Required for Runtime Changes)
📚 Research & Knowledge (wenn applicable)
AI-Generated Code (KI-generierter Code)
AI Review Workflow (Required for AI-assisted PRs)
High-Finding Exception Record (only if High is accepted)
N/A
Release Readiness Gate (Required for release-scoped changes)
BRANCHING_STRATEGY.mdandRELEASE_STRATEGY.mdVERSIONING.mdandCHANGELOG.mdChecklist
[Unreleased]Scanner and IntelliSense Gates
criticalfindings in CI automation or documentation