Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
176 commits
Select commit Hold shift + click to select a range
8fcbc36
feat(configurator): add isolated application and infrastructure found…
lweberru Sep 29, 2026
4ca2565
Merge remote-tracking branch 'origin/main' into feature/landing-zone-…
lweberru Sep 29, 2026
75962cb
ci(configurator): enable plan-only validation on feature branch
lweberru Sep 29, 2026
59edaca
ci(configurator): allow explicitly approved feature bootstrap apply
lweberru Sep 29, 2026
171a8a3
docs(configurator): record successful bootstrap CI apply
lweberru Sep 29, 2026
d68c0a1
ci(configurator): bind feature apply approval to selected root
lweberru Sep 29, 2026
842dc95
docs(configurator): record backend apply and platform readiness
lweberru Sep 29, 2026
3d82df9
docs(configurator): remove static CF egress assumption
lweberru Sep 29, 2026
5048d0a
feat(configurator): prepare isolated platform provisioning pipeline
lweberru Sep 29, 2026
3322dd9
docs(configurator): record platform deployment authorization
lweberru Sep 29, 2026
7a6ff1e
docs(configurator): record interrupted platform deployment and recovery
lweberru Sep 29, 2026
1843069
fix(configurator): recover platform state and allow graceful apply ti…
lweberru Sep 30, 2026
44fe846
docs(configurator): record successful platform recovery and verification
lweberru Sep 30, 2026
0f45fc0
docs(configurator): confirm platform no-op acceptance
lweberru Sep 30, 2026
b49ac30
refactor(configurator): run OpenTofu directly in deployment workflows
lweberru Sep 30, 2026
8dc8c09
docs(configurator): record direct CLI plan and logging checks
lweberru Sep 30, 2026
950f517
docs(configurator): confirm direct CLI checks for all deployment roots
lweberru Sep 30, 2026
02516d7
feat(configurator): provision CF space and runtime identities via Ope…
lweberru Sep 30, 2026
02054c5
fix(configurator): assign CF org membership before space role
lweberru Sep 30, 2026
5f654d2
feat(configurator): add CF application release and service connection…
lweberru Sep 30, 2026
f4c9242
fix(configurator): diagnose CF network and separate route checks
lweberru Sep 30, 2026
6840d4e
fix(configurator): scope pipeline triggers to their deployment lifecycle
lweberru Sep 30, 2026
3384a98
fix(configurator): allow verified STACKIT network for CF service access
lweberru Sep 30, 2026
7dcef65
docs(configurator): document CF network diagnosis and rerun release c…
lweberru Sep 30, 2026
795a18a
fix(configurator): check documented Secrets API and align release layout
lweberru Sep 30, 2026
4abe60d
docs(configurator): record successful CF and service connectivity acc…
lweberru Sep 30, 2026
c5e5a7f
feat(configurator): prepare user-authorized GitHub login and portal d…
lweberru Sep 30, 2026
2bd0120
docs(configurator): capture public portal design sources reproducibly
lweberru Sep 30, 2026
76db252
feat(configurator): add Nebula-based template catalogue and standalon…
lweberru Sep 30, 2026
a3d5629
docs(configurator): record template editor release acceptance
lweberru Sep 30, 2026
b0793b0
feat(configurator): expose isolated database migration credentials
lweberru Sep 30, 2026
2363601
feat(configurator): allow approved session secret storage
lweberru Sep 30, 2026
cd9d79f
feat(configurator): add GitHub login and isolated persistent sessions
lweberru Sep 30, 2026
8737381
docs(configurator): record session migration and pending login activa…
lweberru Sep 30, 2026
8ceaa7b
docs(configurator): enable approved GitHub login release
lweberru Sep 30, 2026
5fa089a
docs(configurator): record successful GitHub login activation
lweberru Sep 30, 2026
1aca4d9
feat(configurator): save drafts in forks and support browser navigation
lweberru Sep 30, 2026
c77345a
fix(configurator): tolerate dot-prefixed repository names
lweberru Sep 30, 2026
dcfd5bd
docs(configurator): record fork and navigation release acceptance
lweberru Sep 30, 2026
c2f15e2
feat(configurator): explain fields and export native tfvars with drafts
lweberru Sep 30, 2026
c72a38c
docs(configurator): record field guidance and tfvars release acceptance
lweberru Sep 30, 2026
629fab6
feat(configurator): manage personal deployment credentials securely
lweberru Sep 30, 2026
6f80cb6
docs(configurator): record credential profile release acceptance
lweberru Sep 30, 2026
6c95098
fix(configurator): accept STACKIT Accounts service account keys
lweberru Sep 30, 2026
a256f68
docs(configurator): record STACKIT key format fix acceptance
lweberru Sep 30, 2026
366cc3c
feat(configurator): verify access and persist deployment preparations
lweberru Sep 30, 2026
e5d84e5
docs(configurator): record access check and preparation release accep…
lweberru Sep 30, 2026
a40108c
feat(configurator): establish plan-only evaluation and LZA bootstrap …
lweberru Sep 30, 2026
7d94e78
feat(configurator): isolate plan runners in a dedicated CF organisation
lweberru Sep 30, 2026
ac6f8b5
docs(configurator): record reviewed runner organisation plan
lweberru Sep 30, 2026
394aef5
feat(configurator): provision private runner space and dispatcher roles
lweberru Sep 30, 2026
9d25f2f
feat(configurator): run isolated initial OpenTofu plans from the UI
lweberru Sep 30, 2026
b5686ef
fix(configurator): package runner from repository root and measure ta…
lweberru Sep 30, 2026
21b5529
feat(configurator): resume personal workspaces and edit folder names
lweberru Sep 30, 2026
62a476f
docs(configurator): record live workspace and folder acceptance [skip…
lweberru Sep 30, 2026
55852c6
docs(configurator): define common feature model and verify Accelerato…
lweberru Sep 30, 2026
a04c972
docs(configurator): track accelerator execution limitations [skip ci]
lweberru Sep 30, 2026
e6106b9
feat(configurator): add shared accelerator configuration core [skip ci]
lweberru Sep 30, 2026
2921551
docs(configurator): record shared model validation [skip ci]
lweberru Sep 30, 2026
a2e209a
ci(configurator): allow manual release of feature branch [skip ci]
lweberru Sep 30, 2026
527bd95
feat(configurator): publish shared feature editor and fork persistence
lweberru Sep 30, 2026
2493291
docs(configurator): record live shared editor acceptance [skip ci]
lweberru Sep 30, 2026
10a6ec8
fix(configurator): clarify platform switches and valid editor defaults
lweberru Sep 30, 2026
940cab5
docs(configurator): record platform editor live checks [skip ci]
lweberru Sep 30, 2026
78d8f7c
feat(configurator): add regional network and guided VPN editor
lweberru Oct 1, 2026
817a542
feat(accelerator): prototype isolated application plan contract [skip…
lweberru Oct 1, 2026
8163169
docs(configurator): track VPN BGP support in issue 86 [skip ci]
lweberru Oct 1, 2026
21e90fe
feat(configurator): separate external login identities from internal …
lweberru Oct 1, 2026
59b0a04
feat(configurator): add organisation membership and STACKIT product c…
lweberru Oct 1, 2026
2e49f62
docs(configurator): record tenant and catalogue release checks [skip ci]
lweberru Oct 1, 2026
3532645
feat(configurator): expand product choices and manage empty workspaces
lweberru Oct 1, 2026
b5dcb6b
docs(configurator): record workspace and catalogue fixes release [ski…
lweberru Oct 1, 2026
dde3379
feat(configurator): invite workspace members through single-use links
lweberru Oct 1, 2026
faa8c3f
docs(configurator): record invitation release verification [skip ci]
lweberru Oct 1, 2026
9aa3322
feat(configurator): enable reviewed common-editor plans and track MVP…
lweberru Oct 1, 2026
762d1c3
docs(configurator): record MVP slice release and acceptance checks [s…
lweberru Oct 1, 2026
0e62c5e
feat(configurator): separate platform project templates from applicat…
lweberru Oct 1, 2026
64e33cb
fix(configurator): qualify governance plans and explain workload fede…
lweberru Oct 1, 2026
2923662
docs(configurator): record template and governance release evidence […
lweberru Oct 1, 2026
89db821
docs(configurator): define template inputs and resource bindings [ski…
lweberru Oct 1, 2026
244e936
feat(configurator): add constrained template inputs and binding previews
lweberru Oct 1, 2026
f8c6be7
fix(configurator): clear invalid template input defaults
lweberru Oct 1, 2026
497dc29
feat(configurator): add catalogue-backed choices and verified role bi…
lweberru Oct 1, 2026
9f8436f
fix(configurator): isolate keyed navigation sections
lweberru Oct 1, 2026
47dbad7
fix(configurator): persist catalogue selection and filter role choices
lweberru Oct 1, 2026
4ad9367
chore(configurator): checkpoint validated MVP foundations
lweberru Oct 5, 2026
4d15d78
refactor(application): separate immutable runner backend configuration
lweberru Oct 5, 2026
21801fd
feat(runner): qualify isolated application root and state binding
lweberru Oct 5, 2026
ad4842f
feat(applications): prepare immutable jobs and grants (#93)
lweberru Oct 5, 2026
e7cbe63
feat(applications): bind immutable PE backend approvals (#93)
lweberru Oct 5, 2026
50e0e76
feat(applications): enforce single-use PE job claims (#93)
lweberru Oct 5, 2026
c4b43c3
feat(accelerator): preserve independent CLI and provenance (#93)
lweberru Oct 5, 2026
39fd7d0
feat(applications): qualify source and release bounded credentials (#93)
lweberru Oct 5, 2026
538d79c
feat(applications): bind one-shot tickets and serialize dispatch (#93)
lweberru Oct 5, 2026
975cc94
feat(configurator): isolate application reports and runner broker (#93)
lweberru Oct 5, 2026
fb334a0
fix(configurator): bind preparations to canonical provenance labels (…
lweberru Oct 5, 2026
8e4e39c
docs(configurator): record verified provenance activation (#93)
lweberru Oct 5, 2026
5c2addd
fix(configurator): distinguish preparation revisions (#89)
lweberru Oct 5, 2026
76a22dc
fix(configurator): explain recovery plan blocker (#90)
lweberru Oct 6, 2026
cc77434
feat(configurator): reconcile reviewed bootstrap checkpoints (#90)
lweberru Oct 6, 2026
0363972
docs(configurator): record approved recovery activation (#90)
lweberru Oct 6, 2026
0fd12d0
fix(configurator): verify native HTTP to S3 migration (#90)
lweberru Oct 6, 2026
d5c6915
fix(configurator): explain checkpoint verification failures (#90)
lweberru Oct 6, 2026
056d4df
fix(configurator): preserve complete checks across state migration (#90)
lweberru Oct 6, 2026
75c5dd3
feat(applications): add tenant groups and template access (#92)
lweberru Oct 6, 2026
929f7fd
fix(configurator): expose organization proof identity and safe errors…
lweberru Oct 6, 2026
ce6db69
fix(configurator): use CLI-compatible PKCE for local STACKIT login (#91)
lweberru Oct 6, 2026
6e44e1e
docs(auth): record isolated PKCE activation (#91)
lweberru Oct 6, 2026
3e5f19c
feat(applications): bind approved contracts to applied platforms (#93)
lweberru Oct 6, 2026
26b2b2b
fix(auth): resume PKCE login in the callback return tab (#91)
lweberru Oct 6, 2026
4cd1fc3
fix(configurator): separate application catalogue and publication (#93)
lweberru Oct 6, 2026
04a2db7
fix(configurator): allow initial deployment configuration selection (…
lweberru Oct 6, 2026
baf4925
fix(configurator): explain unavailable platform contract exports (#90)
lweberru Oct 6, 2026
567288d
fix(configurator): retain reviewed recovery state provenance (#90)
lweberru Oct 6, 2026
79c483f
fix(configurator): read native platform contract outputs
lweberru Oct 6, 2026
0487531
feat(configurator): prepare explicit same-state platform contract upg…
lweberru Oct 6, 2026
55d78cc
fix(configurator): export native platform contracts after approved apply
lweberru Oct 6, 2026
a8447b6
fix(configurator): verify real organization owner evidence (#91)
lweberru Oct 6, 2026
53b806b
feat(configurator): manage groups with member email labels (#92)
lweberru Oct 6, 2026
798661a
fix(configurator): name applied runs and record publication acceptanc…
lweberru Oct 6, 2026
58c8e4d
docs(configurator): close accepted template publication gate (#92)
lweberru Oct 6, 2026
785bc69
fix(configurator): reload verified owner proof after PKCE completion …
lweberru Oct 6, 2026
8c630b9
fix(configurator): restore publication context on direct application …
lweberru Oct 6, 2026
880b2c5
chore: back up configurator progress without deployment [skip ci]
lweberru Oct 6, 2026
15c4624
fix(configurator): synchronize accelerator namespace inventory [skip ci]
lweberru Oct 7, 2026
ebe41ca
test(configurator): synchronize browser selectors and isolate backgro…
lweberru Oct 7, 2026
416abd8
test(configurator): requalify governance for current platform source …
lweberru Oct 7, 2026
5cf2b74
test(configurator): require explicit browser API mocks [skip ci]
lweberru Oct 7, 2026
27b018b
fix(configurator): patch source-map-js security advisory [skip ci]
lweberru Oct 7, 2026
110377d
feat(configurator): unify PKCE and immutable release promotion [skip ci]
lweberru Oct 7, 2026
3343523
fix(configurator): serve workspace SPA route [skip ci]
lweberru Oct 7, 2026
8814978
fix: preserve user-managed Observability ACLs
lweberru Oct 8, 2026
57ad1f6
fix(storage): bound credentials group names to API limit
lweberru Oct 8, 2026
b027d9d
feat(configurator): qualify hosted application lifecycle on suffix-fr…
lweberru Oct 9, 2026
00e8ab3
test(configurator): stabilize real database lifecycle qualification […
lweberru Oct 9, 2026
4a09889
fix(configurator): fetch exact hosted runner source pins in shallow C…
lweberru Oct 9, 2026
fb8f2a0
docs(configurator): record qualified suffix-free dev release and pend…
lweberru Oct 9, 2026
368288e
docs(configurator): preserve development handoff and sanitized chat […
lweberru Oct 9, 2026
c37b9ea
docs(configurator): record verified Ubuntu data migration [skip ci]
lweberru Oct 9, 2026
2deda89
feat(configurator): checkpoint assistant workflows and recovery harde…
lweberru Oct 13, 2026
1aabadb
feat(configurator): qualify editor assistant contracts for public OID…
lweberru Oct 14, 2026
927f20a
fix(configurator): activate authenticated assistant in protected dev …
lweberru Oct 14, 2026
2b43472
fix(configurator): expose sanitized migration failure evidence in dev…
lweberru Oct 14, 2026
255c2c3
test(configurator): await completed configuration refresh before reload
lweberru Oct 14, 2026
1f677df
fix(release): retain safe migration timeout evidence
lweberru Oct 14, 2026
ffec7b1
fix(release): give migration container sufficient disk space
lweberru Oct 14, 2026
576ad96
fix(release): align full-droplet validation task disk budgets
lweberru Oct 14, 2026
1b04566
fix(auth): separate app session lifetime from STACKIT proof expiry
lweberru Oct 14, 2026
e1c3e81
docs(configurator): record hosted Dev and session qualification
lweberru Oct 14, 2026
a031273
fix(assistant): scope template proposals and render structured values
lweberru Oct 15, 2026
cd547a1
docs(configurator): record deployed Assistant fixes and Dev qualifica…
lweberru Oct 15, 2026
d2d50bc
feat(configurator): synchronize template overview and detail editing
lweberru Oct 15, 2026
9c19327
test(configurator): assert template overview instead of stacked forms
lweberru Oct 15, 2026
9f6fd81
docs(configurator): record deployed template overview qualification
lweberru Oct 15, 2026
718ed1d
feat(configurator): qualify platform plans and clarify account state
lweberru Oct 15, 2026
b5d73ff
test(configurator): retain blocked-policy broker regression
lweberru Oct 15, 2026
277dc25
fix(configurator): shorten qualification provider socket paths
lweberru Oct 15, 2026
83a8a2a
feat(configurator): cache verified firewall image during CF staging
lweberru Oct 15, 2026
85289f7
fix(configurator): pin CF buildpacks through protected source tags
lweberru Oct 15, 2026
e6b5876
fix(configurator): surface isolated runner staging errors
lweberru Oct 15, 2026
13c1cca
fix(configurator): avoid duplicate firewall image during CF staging
lweberru Oct 15, 2026
ae729ee
fix(configurator): cache staged firewall image only in the CF droplet
lweberru Oct 15, 2026
989469e
fix(configurator): report web staging errors without router logs
lweberru Oct 15, 2026
0cee76f
fix(configurator): reserve API staging disk for the full inspection i…
lweberru Oct 15, 2026
853fe95
docs(configurator): record verified Dev release and staging budget
lweberru Oct 15, 2026
f125b54
fix(configurator): align preparations and review collection removals
lweberru Oct 15, 2026
045eeaf
fix(assistant): retain accepted entries in remaining proposals
lweberru Oct 15, 2026
d5ecc2a
docs(configurator): record compatible release and hosted acceptance
lweberru Oct 15, 2026
f9b5e60
fix(configurator): restore initial preparations and CI qualification
lweberru Oct 16, 2026
6a5014e
fix(ci): align database integration qualification limits
lweberru Oct 16, 2026
f675810
docs(configurator): record green initial-preparation release acceptance
lweberru Oct 16, 2026
d037c5c
feat(configurator): provision dedicated assistant qualification token
lweberru Oct 16, 2026
cc940da
feat(configurator): prepare MVP integration and source-bound qualific…
lweberru Oct 16, 2026
5bb9a62
test(ci): align operator fixtures with manual-only execution
lweberru Oct 16, 2026
bed0565
test(ci): exercise actual change-aware workflow decisions
lweberru Oct 16, 2026
c0e95ac
fix(ci): detect native changes without filename parsing
lweberru Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
87 changes: 87 additions & 0 deletions .github/workflows/assistant-live.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Assistant live regression

on:
workflow_dispatch:
inputs:
topic:
description: 'Knowledge topic ID, or all'
required: true
default: 'all'
type: string
repetitions:
description: 'Independent runs per case (1-3); every failure remains blocking'
required: true
default: 2
type: number
workflow_call:
inputs:
topic:
type: string
default: 'all'
repetitions:
type: number
default: 2
secrets:
LZC_MODEL_SERVING_TOKEN:
required: false

permissions:
contents: read

jobs:
assistant:
name: assistant-live-qualification
runs-on: ubuntu-latest
timeout-minutes: 60
environment: assistant-tests
concurrency:
group: configurator-assistant-model-serving
cancel-in-progress: false
defaults:
run:
working-directory: landing-zone-configurator/app
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
with:
node-version-file: landing-zone-configurator/app/.node-version
cache: npm
cache-dependency-path: landing-zone-configurator/app/package-lock.json
- name: Install pinned test toolchain
id: install
run: |
npm install --global npm@11.19.0
npm ci
- name: Check source-bound scenario catalogue
id: catalogue
run: npm run assistant:check
- name: Run synthetic cases against real Model Serving
env:
LZC_MODEL_SERVING_TOKEN: ${{ secrets.LZC_MODEL_SERVING_TOKEN }}
LZC_ASSISTANT_TEST_TOPIC: ${{ inputs.topic }}
LZC_ASSISTANT_TEST_REPETITIONS: ${{ inputs.repetitions }}
LZC_EXECUTION_ENABLED: 'false'
LZC_APPLICATION_EXECUTION_ENABLED: 'false'
run: |
set -o pipefail
node --use-system-ca --import tsx scripts/assistant-tests.ts --topic "$LZC_ASSISTANT_TEST_TOPIC" --repeat "$LZC_ASSISTANT_TEST_REPETITIONS" | tee assistant-live-results.jsonl
- name: Verify a continuous multi-topic dialogue and native export
if: ${{ !cancelled() && steps.install.outcome == 'success' && steps.catalogue.outcome == 'success' }}
env:
LZC_MODEL_SERVING_TOKEN: ${{ secrets.LZC_MODEL_SERVING_TOKEN }}
LZC_EXECUTION_ENABLED: 'false'
LZC_APPLICATION_EXECUTION_ENABLED: 'false'
run: |
set -o pipefail
node --use-system-ca --import tsx scripts/assistant-journey.ts | tee assistant-journey-results.jsonl
- name: Upload synthetic results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: assistant-live-results
path: |
landing-zone-configurator/app/assistant-live-results.jsonl
landing-zone-configurator/app/assistant-journey-results.jsonl
retention-days: 7
185 changes: 185 additions & 0 deletions .github/workflows/configurator-bootstrap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
name: Configurator Bootstrap

on:
workflow_dispatch:
inputs:
root:
description: 'First bootstrap, then backend (bucket versioning)'
type: choice
options: [bootstrap, backend]
default: bootstrap
apply:
description: 'Apply the reviewed plan after environment approval'
type: boolean
default: false

permissions:
contents: read

concurrency:
group: configurator-lzc-dev-mutation
cancel-in-progress: false

env:
LZC_ENVIRONMENT: lzc-dev
LZC_ROOT: ${{ inputs.root || vars.LZC_BOOTSTRAP_ROOT || 'bootstrap' }}

jobs:
plan:
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' && github.run_attempt == 1
runs-on: ubuntu-latest
timeout-minutes: 30
environment: lzc-dev-bootstrap-plan
defaults:
run:
working-directory: landing-zone-configurator
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
with:
node-version: '24.21.0'
- uses: opentofu/setup-opentofu@a1320f892987e89d278cc92dc5adc984fb93aca4 # v2.0.2
with:
tofu_version: '1.12.6'
tofu_wrapper: false
- name: Prepare credentials and backend configuration
id: prepare
run: node infra/ci/prepare.mjs management
env:
LZC_PROJECT_ID: ${{ vars.LZC_PROJECT_ID }}
LZC_REGION: ${{ vars.LZC_REGION }}
LZC_NAME_PREFIX: ${{ vars.LZC_NAME_PREFIX }}
LZC_MANAGEMENT_BUCKET: ${{ vars.LZC_MANAGEMENT_BUCKET }}
LZC_CREDENTIAL_EXPIRATION: ${{ vars.LZC_CREDENTIAL_EXPIRATION }}
LZC_MANAGEMENT_ACCESS_KEY: ${{ secrets.LZC_MANAGEMENT_ACCESS_KEY }}
LZC_MANAGEMENT_SECRET_KEY: ${{ secrets.LZC_MANAGEMENT_SECRET_KEY }}
LZC_SERVICE_ACCOUNT_KEY: ${{ secrets.LZC_SERVICE_ACCOUNT_KEY }}
LZC_STATE_KEY_BOOTSTRAP: ${{ secrets.LZC_STATE_KEY_BOOTSTRAP }}
LZC_STATE_KEY_BACKEND: ${{ secrets.LZC_STATE_KEY_BACKEND }}
- name: Read bootstrap backend outputs (private file)
if: env.LZC_ROOT != 'bootstrap'
timeout-minutes: 3
run: |
umask 077
export TF_DATA_DIR="$LZC_PRIVATE/bootstrap-data"
export TF_ENCRYPTION="$(cat "$LZC_PRIVATE/bootstrap.encryption.json")"
tofu -chdir=infra/bootstrap init -input=false -no-color -lockfile=readonly -backend-config="$LZC_PRIVATE/bootstrap.backend.hcl"
tofu -chdir=infra/bootstrap output -json > "$LZC_PRIVATE/bootstrap-outputs.json"
- name: Prepare workload credentials
if: env.LZC_ROOT != 'bootstrap'
run: node infra/ci/prepare.mjs workload
- name: OpenTofu init
timeout-minutes: 3
run: tofu -chdir="infra/$LZC_ROOT" init -input=false -no-color -lockfile=readonly -backend-config="$LZC_PRIVATE/$LZC_ROOT.backend.hcl"
- name: OpenTofu validate
run: tofu -chdir="infra/$LZC_ROOT" validate -no-color
- name: OpenTofu plan
run: >-
timeout --foreground --signal=INT --kill-after=2m 15m
tofu -chdir="infra/$LZC_ROOT" plan
-input=false -no-color -lock-timeout=60s
-out="$LZC_PLAN"
- name: Bind encrypted plan to commit and workflow run
run: node infra/ci/review.mjs seal
- name: Upload encrypted plan
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: bootstrap-plan-${{ github.run_id }}
path: |
landing-zone-configurator/.local/ci-plan/review.tfplan
landing-zone-configurator/.local/ci-plan/review.json
include-hidden-files: true
if-no-files-found: error
retention-days: 1
- name: Remove temporary credentials
if: always()
run: rm -rf -- "$RUNNER_TEMP/lzc-private"

apply:
needs: plan
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' && github.run_attempt == 1 && inputs.apply
runs-on: ubuntu-latest
timeout-minutes: 45
environment: lzc-dev-bootstrap-apply
defaults:
run:
working-directory: landing-zone-configurator
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6
with:
node-version: '24.21.0'
- uses: opentofu/setup-opentofu@a1320f892987e89d278cc92dc5adc984fb93aca4 # v2.0.2
with:
tofu_version: '1.12.6'
tofu_wrapper: false
- name: Prepare credentials and backend configuration
id: prepare
run: node infra/ci/prepare.mjs management
env:
LZC_PROJECT_ID: ${{ vars.LZC_PROJECT_ID }}
LZC_REGION: ${{ vars.LZC_REGION }}
LZC_NAME_PREFIX: ${{ vars.LZC_NAME_PREFIX }}
LZC_MANAGEMENT_BUCKET: ${{ vars.LZC_MANAGEMENT_BUCKET }}
LZC_CREDENTIAL_EXPIRATION: ${{ vars.LZC_CREDENTIAL_EXPIRATION }}
LZC_MANAGEMENT_ACCESS_KEY: ${{ secrets.LZC_MANAGEMENT_ACCESS_KEY }}
LZC_MANAGEMENT_SECRET_KEY: ${{ secrets.LZC_MANAGEMENT_SECRET_KEY }}
LZC_SERVICE_ACCOUNT_KEY: ${{ secrets.LZC_SERVICE_ACCOUNT_KEY }}
LZC_STATE_KEY_BOOTSTRAP: ${{ secrets.LZC_STATE_KEY_BOOTSTRAP }}
LZC_STATE_KEY_BACKEND: ${{ secrets.LZC_STATE_KEY_BACKEND }}
- name: Read bootstrap backend outputs (private file)
if: env.LZC_ROOT != 'bootstrap'
timeout-minutes: 3
run: |
umask 077
export TF_DATA_DIR="$LZC_PRIVATE/bootstrap-data"
export TF_ENCRYPTION="$(cat "$LZC_PRIVATE/bootstrap.encryption.json")"
tofu -chdir=infra/bootstrap init -input=false -no-color -lockfile=readonly -backend-config="$LZC_PRIVATE/bootstrap.backend.hcl"
tofu -chdir=infra/bootstrap output -json > "$LZC_PRIVATE/bootstrap-outputs.json"
- name: Prepare workload credentials
if: env.LZC_ROOT != 'bootstrap'
run: node infra/ci/prepare.mjs workload
- name: OpenTofu init
timeout-minutes: 3
run: tofu -chdir="infra/$LZC_ROOT" init -input=false -no-color -lockfile=readonly -backend-config="$LZC_PRIVATE/$LZC_ROOT.backend.hcl"
- name: OpenTofu validate
run: tofu -chdir="infra/$LZC_ROOT" validate -no-color
- uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
with:
name: bootstrap-plan-${{ github.run_id }}
path: landing-zone-configurator/.local/ci-plan
- name: Verify reviewed plan and apply authorization
run: node infra/ci/review.mjs verify
- name: OpenTofu apply reviewed plan
id: apply
# One SIGINT allows OpenTofu to save state before the outer job deadline.
run: >-
timeout --foreground --signal=INT --kill-after=5m 20m
tofu -chdir="infra/$LZC_ROOT" apply
-input=false -no-color -lock-timeout=60s "$LZC_PLAN"
- name: Capture and encrypt recovery state
if: always() && steps.apply.outcome != '' && steps.apply.outcome != 'skipped'
run: |
umask 077
if ! timeout --foreground --signal=INT --kill-after=10s 60s \
tofu -chdir="infra/$LZC_ROOT" state pull > "$LZC_PRIVATE/state.snapshot"; then
echo "::warning::Remote state snapshot unavailable; checking for emergency state."
rm -f -- "$LZC_PRIVATE/state.snapshot"
fi
node infra/ci/protect-state.mjs
- name: Upload encrypted recovery state
if: always() && steps.apply.outcome != '' && steps.apply.outcome != 'skipped'
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
with:
name: bootstrap-state-${{ github.run_id }}
path: landing-zone-configurator/.local/ci-recovery/*.enc.json
include-hidden-files: true
if-no-files-found: warn
retention-days: 7
- name: Remove temporary credentials
if: always()
run: rm -rf -- "$RUNNER_TEMP/lzc-private"
Loading
Loading