IMPORTANT: Developer documentation for the current development branch. This content is unreleased, may change without notice, and must not be treated as Buildish release documentation.
Direct Release
Direct Release
The direct lifecycle turns one exact source revision into the final tag and final GitHub Release in one manually dispatched workflow. It does not create a candidate, require a vote, or introduce a candidate-shaped placeholder in final release state.
“One click” means one workflow dispatch. The workflow still separates resolution, source checks, tag creation, staging, verification, publication, and manifest attachment so a component can place policy boundaries between those jobs.
Minimal configuration
1component:
2 id: example
3 display_name: Example
4versioning:
5 scheme: semver
6 final_tag_template: "v{version}"
7source:
8 selection: explicit-ref-or-default-branch
9 default_branch: main
10 snapshot:
11 mode: platform-generated
12 checks:
13 platform: github
14 required:
15 - Required Checks
16lifecycle:
17 mode: direct
18artifacts:
19 produced: []
20 checksums: []
21publication:
22 authoritative:
23 kind: github-release
24 repository: example/example
25tags:
26 final_mode: exact-source-commit
27 moving: []
28policy_profiles: {}
This example treats GitHub as authoritative and relies on the source archives GitHub generates from the immutable final tag. It publishes no separately built source artifact.
Dispatch
Run .github/workflows/release-direct.yml with:
version: the exact final version, for example1.2.3;source_ref: an optional exact branch, tag, or commit allowed by the configured source-selection policy.
When source_ref is omitted, the example configuration resolves main. Resolution records the
exact commit; later jobs use that commit identity rather than re-resolving a moving branch.
Workflow phases
resolvecreatesDirectReleaseStatewith the release identity, exact source commit, final tag, and artifact policy.verify-sourcechecks the configured GitHub check-run/status requirement on that exact commit.create-final-tagcreates or revalidates the immutable final tag.stagecreates or completes the draft final GitHub Release.verify-finalcompares the observed tag, release metadata, and assets with the resolved state.publishmakes the exact release public or confirms that an identical publication already exists.manifestcreatesrelease-manifest-v1.json, validates both workflow handoff digests, attaches the manifest without clobbering an existing asset, and revalidates the release.
Same-run JSON files move through GitHub workflow artifacts. Every privilege-bearing consumer checks the SHA-256 emitted by the producing job before acting.
Reruns and conflicts
The mutation commands are convergent for identical state:
- an identical tag, draft release, public release, or manifest attachment reports an
already-completeoutcome where applicable; - an existing tag at another commit, mismatched release body, unexpected asset, size mismatch, or digest mismatch fails closed;
- asset upload never uses clobber behavior.
The workflow uses non-canceling concurrency keyed by repository and version. A second run waits instead of cancelling a run that may already have changed external release state.
Variations
- Use a separately built and signed source artifact when the hosting-platform snapshot is not sufficient.
- Add
environment:to the jobs selected by project policy; see Workflow composition. - Create a release branch separately with
create-release-branchwhen a component needs maintained release lines. The direct lifecycle itself does not require one. - Use the candidate lifecycle when publication must wait for an external approval or vote over an exact candidate.