Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
1695ac0
Add repo-init and repo-update CI commands
tristanpoland Apr 14, 2026
c80277f
Add commit/no-commit options to init
tristanpoland Apr 14, 2026
540bbfd
Improve pipeline status order and repo CI parsing
tristanpoland Apr 14, 2026
413ad8f
Include referenced envs; regex & minor fixes
tristanpoland Apr 14, 2026
87c2d87
Safely handle globs and empty pipeline
tristanpoland Apr 14, 2026
3d5a964
Support ci: in .genesis/config (inline CI config)
tristanpoland Apr 14, 2026
a2e86dc
Add genesis repo-init command
dennisjbell Apr 14, 2026
6a65625
Add CI provider scaffold to repo-init
dennisjbell Apr 14, 2026
500d6c5
Nest CI provider config under provider.type
dennisjbell Apr 14, 2026
565768a
Only embed genesis when CI provider is set
dennisjbell Apr 14, 2026
b62c593
Refactor repo-init validation and test fixtures
dennisjbell Apr 15, 2026
0da5714
Simplify repo-init success report
dennisjbell Apr 15, 2026
a51deda
Clean up execute phase input handling
dennisjbell Apr 15, 2026
dd6bfde
Improve repo-init validation ordering and kit caching
dennisjbell Apr 15, 2026
1716dfb
Add ci_control_branch accessor and constant
dennisjbell Apr 16, 2026
e10ea48
Refine repo-init options and error flow
dennisjbell Apr 16, 2026
3711015
Fix repo-init post-merge issues
dennisjbell Apr 17, 2026
8bebc76
Add CI provider abstraction and options system
tristanpoland Apr 17, 2026
014ec17
Add pipeline options and metadata injection
tristanpoland Apr 17, 2026
d9de0c0
Add CI provider prerequisite checks
tristanpoland Apr 17, 2026
2c62d3a
Exit with code 86 on CI prereq failure
tristanpoland Apr 17, 2026
21f08da
Prefill CI provider interactive wizards
tristanpoland Apr 17, 2026
2897d74
Use 'type -p' to locate fly; tidy comments
tristanpoland Apr 17, 2026
91763f2
Add extended_handlers framework to Commands
dennisjbell Apr 17, 2026
548691c
Improve Concourse wizard and fix UI bugs
dennisjbell Apr 17, 2026
ddcae86
Fix new_prompt_for_choice and add strict to UI
dennisjbell Apr 17, 2026
b70c6b1
Implement Concourse CI provider wizard and opts
dennisjbell Apr 17, 2026
f2ecbf7
Restore check_prereqs and wizard pre-fill
Apr 17, 2026
0fb3c31
Skip commit when only metadata changed
dennisjbell Apr 17, 2026
78da531
Make genesis new pipeline-aware
dennisjbell Apr 19, 2026
f4e8a93
Add config validation to CI providers
tristanpoland Apr 21, 2026
d0ac344
Concourse: add fly prereq checks; minor fixes
tristanpoland Apr 21, 2026
babc5a6
Normalize CI provider CLI options and Concourse
tristanpoland Apr 21, 2026
3cb0171
Add config v3 schema with CI section
dennisjbell Apr 21, 2026
7d47e1a
Move add_secrets out of Env::create
dennisjbell Apr 21, 2026
9d81500
Use env vars for vault in ui_prompt_for
dennisjbell Apr 21, 2026
7e30ba9
Graceful fallback when parent BOSH undeployed
dennisjbell Apr 21, 2026
42c274b
Fix from_environment missing env arg
dennisjbell Apr 21, 2026
1c32f18
Drop legacy scaffold checks from CI validation
dennisjbell Apr 21, 2026
052b25c
Update Concourse.pm
tristanpoland Apr 21, 2026
fb04cae
Update Concourse.pm
tristanpoland Apr 21, 2026
896d8f0
Add url option to Concourse provider schema
dennisjbell Apr 22, 2026
08f898c
Move/refactor pipeline commands into Pipelines module
tristanpoland Apr 21, 2026
5107bed
Concourse: rename pause to pause_after_set
tristanpoland Apr 21, 2026
cb2a166
Concourse provider: handle insecure and normalize opts
tristanpoland Apr 22, 2026
7da14e2
Add ci-provider option to repo-init
dennisjbell Apr 22, 2026
6214fc5
Accept flat ci.* integrations; refine validation
tristanpoland Apr 22, 2026
7ce7146
Update ci-compiler.t
tristanpoland Apr 22, 2026
244d3f2
Remove targets and integrations validation
dennisjbell Apr 22, 2026
989a961
Use CI_PIPELINE_CONTROL_KEY for control branch
tristanpoland Apr 22, 2026
9d92f47
Update ci-compiler.t
tristanpoland Apr 22, 2026
2dbb398
Replace --ci-provider with --with-ci on repo-init
dennisjbell Apr 22, 2026
2bbbfe3
Skip compiler validation for manual provider
dennisjbell Apr 22, 2026
115944a
Add env-file topology to pipeline-describe/graph
dennisjbell Apr 22, 2026
18cee86
Harden envs command against repo errors
dennisjbell Apr 22, 2026
f4c21df
WIP: genesis propagate command
dennisjbell Apr 22, 2026
bd770df
Extract propagation decision logic with tests
dennisjbell Apr 22, 2026
c8f65bd
Refine genesis propagate command
dennisjbell Apr 23, 2026
6f279ca
Add prune_branch and pipeline rebuild hook
dennisjbell Apr 23, 2026
ac7627d
Push propagated branches to remote
dennisjbell Apr 23, 2026
84a558a
Add Service::Git abstraction
dennisjbell Apr 23, 2026
a9c8a4e
Add flyweight caching to Service::Git
dennisjbell Apr 23, 2026
3aaa807
Add sha method to Service::Git
dennisjbell Apr 23, 2026
1e289ed
Wire Service::Git across propagate, prune, new, init
dennisjbell Apr 23, 2026
a4b8e82
Add pipeline-status command
dennisjbell Apr 23, 2026
1992fc4
Align pipeline-status columns
dennisjbell Apr 23, 2026
f73a887
Auto-checkout env branch on deploy when CI enabled
dennisjbell Apr 23, 2026
671cbf4
Deploy verification and branch auto-checkout
dennisjbell Apr 23, 2026
2e135e4
Allow dry-run for create-env deploys
dennisjbell Apr 23, 2026
425c927
Refine create-env dry-run output
dennisjbell Apr 23, 2026
bc31735
Fix non-OCFP environment display issues
dennisjbell Apr 23, 2026
b740a57
FWT-944 PR-based propagation via Service::Github
tristanpoland Apr 24, 2026
cccbec0
FWT-947 - Per-env redeploy lane in pipeline compiler
tristanpoland Apr 24, 2026
4ecd36b
Add required_files for propagation dependencies
dennisjbell Apr 24, 2026
fa7fa23
FWY-948 - Deployment status signal abstraction
tristanpoland Apr 24, 2026
f7c6842
Merge branch 'v3.2.x-dev' of https://github.com/tristanpoland/genesis…
tristanpoland Apr 24, 2026
9532397
FWT-949 - Auto-generate BOSH dual-lock pattern
tristanpoland Apr 24, 2026
d6c4c0e
FWT-952 - Formalize pipeline notification styles
tristanpoland Apr 24, 2026
7206d3d
FWT-950 - External task library support in pipelines
tristanpoland Apr 24, 2026
1cd296a
FWT-953 - Implement auto-update-assets job in v2 compiler
tristanpoland Apr 24, 2026
e7db423
Deploy-driven reason and cascade for manual pipelines
dennisjbell Apr 24, 2026
1940a43
Fix non-OCFP environment compatibility issues
dennisjbell Apr 24, 2026
de2629f
Strengthen cascade safety in propagate
dennisjbell Apr 24, 2026
f06f1a9
Refine deploy-driven propagation flow
dennisjbell Apr 25, 2026
d530217
Invalidate credhub cache on set when value is redacted
dennisjbell Apr 26, 2026
7a9ada5
Validate SSH keys via owner-only fifo, not /dev/stdin
dennisjbell Apr 26, 2026
5a130a3
Fix two bugs in genesis new git operations
dennisjbell Apr 26, 2026
a32bc3c
Add color-coded glyphs to pipeline-status
dennisjbell Apr 27, 2026
7b1baca
Short-circuit pipeline-apply on manual provider
dennisjbell Apr 27, 2026
afaccea
Add BOSH config drift tracking
tristanpoland Apr 28, 2026
643661e
Surface load_env failure reason in pipeline-status
dennisjbell Apr 29, 2026
ccc9c5b
Add Perl genesis_config_block and write_manifest
dennisjbell Apr 29, 2026
2fe389c
Reconcile env branches via prepare_branch
dennisjbell Apr 29, 2026
81393d9
Scope derived deploy reason to env-relevant commits
dennisjbell Apr 29, 2026
8122ecd
Pull before deploy, commit/push manifest artifacts after
dennisjbell May 1, 2026
04e5242
Move deploy git lifecycle into Env pre/post hooks
dennisjbell May 1, 2026
12fdd3c
Add --pull support for pipeline propagation
tristanpoland May 1, 2026
1dd1905
Polish deploy git lifecycle: ordering, fixes, UX
dennisjbell May 1, 2026
6283cb7
List propagated files in propagate output
dennisjbell May 1, 2026
dd874ca
Update Pipelines.pm
tristanpoland May 1, 2026
59688bf
Update Pipelines.pm
tristanpoland May 1, 2026
13b7b88
Batch fetch branches to reduce credential prompts
tristanpoland May 1, 2026
d848ef2
Add --no-fetch flag and bulk env fetch
tristanpoland May 1, 2026
aac09e9
Update Env.pm
tristanpoland May 1, 2026
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
261 changes: 237 additions & 24 deletions bin/genesis
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,37 @@ define_command("create", {
"repository for the environment.",

"force|f" =>
"Create a new environment file even if it already exists."
"Create a new environment file even if it already exists.",

"prior-env=s" =>
"Name of the prior environment in the pipeline chain (the environment ".
"that must succeed before this one deploys). Only used when a CI ".
"provider is configured in #C{.genesis/config}. Omit or leave blank ".
"to designate this environment as a pipeline entrypoint.",

"require-pr" =>
"Require a pull-request gate before this environment deploys. ".
"Only used when a CI provider is configured in #C{.genesis/config}.",

"manual" =>
"Require a manual CI trigger before this environment deploys. ".
"Only used when a CI provider is configured in #C{.genesis/config}.",

"no-commit" =>
"Stage the new environment file but skip the git commit and ".
"environment branch creation. Only applies when a CI ".
"provider is configured.",

"reason=s" =>
"Commit message for the environment commit. Defaults to ".
"#C{Add environment <name>}. Only applies when a CI ".
"provider is configured and #C{--no-commit} is not set.",

"no-fetch" =>
"Skip the pre-create refresh of pipeline environment branches from ".
"remote. By default all env branches are fetched in one round-trip ".
"before checking for existing branches. Use this flag when working ".
"offline or when the remote is temporarily unavailable.",
],
deprecated_options => [
"^prefix=s" =>
Expand Down Expand Up @@ -466,11 +496,34 @@ define_command("deploy", {
"specifically in the case of a failed partial deployments.\n\n".
"This option will allow you to specify a specfic state file to use for ".
"the deploy. You can use the `info` command to retrieve the state file",

'no-propagate' =>
"On manual-provider pipelines, `genesis deploy` automatically runs ".
"`genesis propagate <env>` after a successful deploy to push the ".
"freshly certified state to downstream environments. Use this ".
"flag to skip that propagation. Non-manual providers (concourse, ".
"github-actions) own their own propagation and are unaffected by ".
"this flag.",

'pull!' =>
"Pull propagated files from the prior environment's last successful ".
"deploy (or control HEAD for pipeline entry points) onto this ".
"environment branch before deploying. No-op when the environment ".
"is already current. Implied by #y{-F}/#y{--fix-checks}; use ".
"#y{--no-pull} to opt out. No-op for non-pipeline repositories.",

'no-fetch' =>
"Skip the pre-deploy refresh of pipeline environment branches from ".
"remote. By default all env branches are fetched in one round-trip ".
"before reading branch state. Use this flag when working offline or ".
"when the remote is temporarily unavailable.",
],
args => {
'reason' =>
"An optional reason for deploying the environment. This will be ".
"recorded in the exodus data for the deployment."
"recorded in the exodus data for the deployment. When omitted and ".
"the env is on a pipeline-managed branch, genesis derives the reason ".
"from the control commit range being deployed."
}
});

Expand Down Expand Up @@ -1191,13 +1244,15 @@ define_command("remove-secrets", {

### Repository Management commands {{{
# genesis init - initialize a new Genesis repository {{{
define_command("init", {
define_command("repo-init", {
summary => "Initialize a new Genesis deployment repository.",
usage => "init [-k KIT/VERSION|-l path/to/local/kit] [-d directory] [--vault target] [name]",
usage => "repo-init [-k KIT] [<options...>] [name]",
alias => 'init',
description =>
"Create a new Genesis deployment repository, specific to the given kit type.",
function_group => Genesis::Commands::REPOSITORY,
scope => 'empty',
no_vault => 1,
option_group => Genesis::Commands::REPO_OPTIONS,
options => [
"kit|k=s" =>
Expand Down Expand Up @@ -1234,17 +1289,41 @@ define_command("init", {
"the '-deployments' suffix, but the option is still available for ".
"backward compatibility by setting the #Y{legacy_repo_suffix} option in ".
"the Genesis configuration file \$HOME/.genesis/config.yml to true.",

"no-commit" =>
"Stage the new repository contents but skip the initial commit. ".
"By default, #C{repo-init} commits the new repository automatically.",

"reason=s" =>
"Commit message for the initial commit. Defaults to a message ".
"describing the new Genesis deployment. Ignored if #C{--no-commit} ".
"is set.",

'force|f' =>
"If the target directory already exists, remove it and recreate ".
"(without this flag, you will be prompted to confirm ".
"replacement). Also bypasses the check that the enclosing git ".
"repository is clean when creating the new repo as a ".
"subdirectory; use with care.",

'skip-vault' =>
"Defer vault configuration. The repo will be created without a ".
"secrets provider. You must configure one via #C{genesis secrets-provider} ".
"before creating environments.",

'with-ci' =>
"Enable CI pipeline support. Sets up the control branch and ".
"configures the repo for branch-based pipeline topology. ".
"Environments created with #C{genesis new} will be prompted ".
"for pipeline metadata (prior_env, gates). Connect an ".
"automated provider later with #C{genesis repo config ci}.",
],
option_passthrough => 1,
extended_handlers => ['Genesis::Kit::Provider'],
arguments => [
"name?" =>
"If the name argument is not specified, it will default to the same ".
"name as the kit. You must specify either name or kit."
],
extended_usage => sub {
require Genesis::Kit::Provider;
Genesis::Kit::Provider->opts_help();
}
});

# }}}
Expand Down Expand Up @@ -1302,12 +1381,86 @@ define_command("kit-provider", {
"export-config" =>
"Export the current kit provider information."
],
extended_usage => sub {
require Genesis::Kit::Provider;
Genesis::Kit::Provider->opts_help();
}
extended_handlers => ['Genesis::Kit::Provider'],
});

# }}}
# PARKED: Tristan's CI-only repo-init define_command block -- kept
# verbatim here for the upcoming merge meeting, but commented out so
# it does NOT override our phased repo-init definition earlier in this
# file. The handler sub has been renamed in lib/Genesis/Commands/Repo.pm
# to repo_configure_ci. If this block is ever re-enabled, the final
# dispatcher arg below must be updated to match that new name.
#
# genesis repo-init - one-time CI provider setup {{{
# define_command("repo-init", {
# summary => "Initialize CI configuration for this Genesis deployment repository.",
# usage => "repo-init [--ci-provider PROVIDER] [--git-uri URI] [--git-branch BRANCH] [--vault-url URL] [--pipeline-name NAME]",
# description =>
# "One-time setup that writes a #C{ci:} section to #C{.genesis/config} and ".
# "generates the #C{.genesis/ci/} scaffold files required by the pipeline ".
# "compiler.\n".
# "\n".
# "Errors if CI is already configured for this repository. Use ".
# "#C{genesis repo-update} to modify an existing configuration.\n".
# "\n".
# "When required flags are omitted an interactive wizard collects them.",
# function_group => Genesis::Commands::REPOSITORY,
# scope => 'repo',
# option_group => Genesis::Commands::REPO_OPTIONS,
# options => [
# 'ci-provider|P=s' =>
# "CI provider to configure: #C{concourse} (default), ".
# "#C{github-actions}, or #C{none}.",
#
# 'git-uri|g=s' =>
# "Git repository URI (e.g. #C{git\@github.com:org/repo.git}).",
#
# 'git-branch|b=s' =>
# "Default branch for the source-control integration. Defaults to #C{main}.",
#
# 'vault-url|V=s' =>
# "Vault URL for the secrets integration ".
# "(e.g. #C{https://vault.example.com:8200}).",
#
# 'pipeline-name|n=s' =>
# "Name written into #C{pipeline.yml} metadata. Defaults to the ".
# "deployment type.",
# ],
# }, 'Genesis::Commands::Repo::repo_configure_ci');
# }}}
# genesis repo-update - idempotent CI config update {{{
define_command("repo-update", {
summary => "Update CI configuration for this Genesis deployment repository.",
usage => "repo-update [--ci-provider PROVIDER] [--git-uri URI] [--git-branch BRANCH] [--vault-url URL] [--pipeline-name NAME]",
description =>
"Idempotent counterpart to #C{genesis repo-init}. Updates the CI ".
"configuration in #C{.genesis/config} and regenerates missing scaffold ".
"files in #C{.genesis/ci/}.\n".
"\n".
"When called with flags, only the specified values are changed; ".
"everything else is left as-is. A bare invocation (no flags) launches ".
"an interactive wizard pre-populated with the current configuration.",
function_group => Genesis::Commands::REPOSITORY,
scope => 'repo',
option_group => Genesis::Commands::REPO_OPTIONS,
options => [
'ci-provider|P=s' =>
"CI provider to configure: #C{concourse}, #C{github-actions}, or #C{none}.",

'git-uri|g=s' =>
"Git repository URI.",

'git-branch|b=s' =>
"Default branch for the source-control integration.",

'vault-url|V=s' =>
"Vault URL for the secrets integration.",

'pipeline-name|n=s' =>
"Name written into #C{pipeline.yml} metadata.",
],
}, 'Genesis::Commands::Repo::repo_update');
# }}}
# }}}

Expand Down Expand Up @@ -1904,7 +2057,7 @@ define_command("pipeline-apply", {
'debug-dir=s' =>
"Write intermediate compiler artifacts to this directory.",
],
}, 'Genesis::Commands::Pipeline::apply');
}, 'Genesis::Commands::Pipelines::apply');
# }}}
# genesis pipeline-graph - write Mermaid pipeline.md {{{
define_command("pipeline-graph", {
Expand All @@ -1923,7 +2076,67 @@ define_command("pipeline-graph", {
'platform|provider|p=s' =>
"CI provider: 'concourse' (default) or 'github-actions'.",
],
}, 'Genesis::Commands::Pipeline::graph');
}, 'Genesis::Commands::Pipelines::pipeline_graph');
# }}}
# genesis pipeline-status - show propagation state across all environments {{{
define_command("pipeline-status", {
summary => "Show propagation status for all pipeline environments.",
usage => "pipeline-status",
description =>
"Displays the propagation state of each environment in the pipeline ".
"DAG: last sync point, number of pending changes, and whether the ".
"environment is blocked by an ancestor that needs propagation first.",
function_group => Genesis::Commands::PIPELINE,
scope => 'repo',
option_group => Genesis::Commands::REPO_OPTIONS,
options => [
'no-fetch' =>
"Skip the pre-status refresh of pipeline environment branches from ".
"remote. By default all env branches are fetched in one round-trip ".
"before reading branch state. Use this flag when working offline or ".
"when the remote is temporarily unavailable.",
],
}, 'Genesis::Commands::Pipelines::pipeline_status');
# }}}
# genesis propagate - propagate control branch changes to environment branches {{{
define_command("propagate", {
summary => "Propagate changes from the control branch to environment branches.",
usage => "propagate [options] [env]",
description =>
"Must be run from the control branch. Identifies files that have ".
"changed since each environment branch was last synced, and copies ".
"them to the appropriate environment branches.\n\n".
"Without arguments, determines entry points by walking the DAG and ".
"finding the first environment that uses each changed file.\n\n".
"With an environment name, scopes propagation to that environment's ".
"children, sourced from the named env's last-deployed control commit.",
function_group => Genesis::Commands::PIPELINE,
scope => 'repo',
option_group => Genesis::Commands::REPO_OPTIONS,
options => [
'dry-run|n' =>
"Show what would be propagated without making changes.",

'commit=s' =>
"Control branch commit SHA to propagate from. Defaults to ".
"HEAD of the control branch.",

'no-push' =>
"Skip pushing control and env branches to the remote after ".
"propagation. By default, propagated branches are pushed.",

'no-fetch' =>
"Skip the pre-propagate refresh of pipeline environment branches ".
"from remote. By default all env branches are fetched in one ".
"round-trip before computing diffs. Use this flag when working ".
"offline or when the remote is temporarily unavailable.",
],
arguments => [
'env?' =>
"Environment that was just deployed. Scopes propagation to ".
"its downstream children only.",
],
}, 'Genesis::Commands::Pipelines::propagate');
# }}}
# genesis pipeline-describe - human-readable pipeline description {{{
define_command("pipeline-describe", {
Expand All @@ -1942,7 +2155,7 @@ define_command("pipeline-describe", {
'platform|provider|p=s' =>
"CI provider: 'concourse' (default) or 'github-actions'.",
],
}, 'Genesis::Commands::Pipeline::describe');
}, 'Genesis::Commands::Pipelines::pipeline_describe');
# }}}
# genesis pipeline-diff - show compiled vs live pipeline delta {{{
define_command("pipeline-diff", {
Expand All @@ -1968,12 +2181,12 @@ define_command("pipeline-diff", {
'skip-vault' =>
"Skip vault connectivity when compiling.",
],
}, 'Genesis::Commands::Pipeline::diff');
}, 'Genesis::Commands::Pipelines::diff');
# }}}
# genesis pipeline-status - show per-environment job health {{{
define_command("pipeline-status", {
summary => "Show per-environment pipeline job health.",
usage => "pipeline-status [<env>]",
# genesis pipeline-jobs - show per-environment job health (Concourse) {{{
define_command("pipeline-jobs", {
summary => "Show per-environment pipeline job health (Concourse).",
usage => "pipeline-jobs [<env>]",
description =>
"Queries `fly jobs` and displays the status of each environment's ".
"deployment job. Pass an environment name to filter to a single job.",
Expand All @@ -1996,7 +2209,7 @@ define_command("pipeline-status", {
'skip-vault' =>
"Skip vault connectivity when compiling.",
],
}, 'Genesis::Commands::Pipeline::status');
}, 'Genesis::Commands::Pipelines::status');
# }}}
# genesis pipeline-pause - pause an environment job or entire pipeline {{{
define_command("pipeline-pause", {
Expand Down Expand Up @@ -2024,7 +2237,7 @@ define_command("pipeline-pause", {
'skip-vault' =>
"Skip vault connectivity when compiling.",
],
}, 'Genesis::Commands::Pipeline::pause');
}, 'Genesis::Commands::Pipelines::pause');
# }}}
# genesis pipeline-resume - resume an environment job or entire pipeline {{{
define_command("pipeline-resume", {
Expand Down Expand Up @@ -2052,7 +2265,7 @@ define_command("pipeline-resume", {
'skip-vault' =>
"Skip vault connectivity when compiling.",
],
}, 'Genesis::Commands::Pipeline::resume');
}, 'Genesis::Commands::Pipelines::resume');
# }}}
# }}}

Expand Down
Loading