Skip to content

Commit 0c7fe10

Browse files
lweberruCopilot
andauthored
feat(configurator): allow Dev releases without live Assistant qualification (#123)
Model Serving outages currently block every Configurator release. Add an explicit `release_mode=dev-skip-assistant-qualification` choice to the manual GitHub UI workflow so Dev can advance without the live Assistant qualification job. `LZC_ASSISTANT_ENABLED` retains its existing environment value: the Assistant stays enabled when configured. Runtime behavior, UI and API are unchanged. The default `qualified` release still requires the complete repeated source-bound Assistant qualification. The exception is limited to fresh `main` builds and the existing protected Dev destination. Every other build, database, browser, packaging, publication, migration and runtime check remains required. The source-bound manifest records Dev scope and `assistantQualified=false`; the distinct build job and manifest guards prevent either qualified or unqualified promotion using `release_run_id`. Skipped qualification is never reported as successful, and earlier failed receipts remain evidence. Existing conversations/proposals and runtime validation/authorization are untouched. Model availability still determines whether inference works. After merge, use Actions → Configurator Release → Run workflow → `main`, `release_mode=dev-skip-assistant-qualification`, `build_only=false`, empty `release_run_id`, `runner_pool_size=1`. Review the exact source/run and approve `lzc-dev-release` after applicable checks. English/German workflow, operator and knowledge-contract documentation describe the explicit Dev exception. A deployment-only failure requires inspection and a fresh run; these unqualified artifacts cannot subsequently be promoted. Validation of the final implementation: - Pinned Node 24.21.0 / npm 11.19.0 `npm run check`: 977 passed, 69 existing default-gated skips. - Release preparation, artifact, buildpack and image-staging guards: 33 passed, including preservation of both runtime Assistant opt-in and opt-out, main-only scope, and rejection of unqualified promotion/cross-mode manifests. - actionlint v1.7.7: passed (shellcheck unavailable and disabled); `git diff --check`: passed. - The final diff contains no app/UI/API changes. GitHub application CI reruns the complete integration/browser flow on the updated source. No live-model qualification is claimed for this Dev mode. No Dev deployment, production operation or customer infrastructure Apply has been performed. Hosted exact-source verification, including warm Runner handoff/replacement with pool size 1, remains required after deployment. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d0fc3d3 commit 0c7fe10

12 files changed

Lines changed: 398 additions & 34 deletions

File tree

‎.github/workflows/configurator-release.yml‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ name: Configurator Release
33
on:
44
workflow_dispatch:
55
inputs:
6+
release_mode:
7+
description: Qualified release (default) or Dev only without live Assistant qualification
8+
type: choice
9+
default: qualified
10+
options: ['qualified', 'dev-skip-assistant-qualification']
611
build_only:
712
description: Build and publish the immutable release and buildpack tag without deploying
813
type: boolean
@@ -21,23 +26,27 @@ permissions:
2126
actions: read
2227
contents: read
2328

29+
env:
30+
LZC_RELEASE_MODE: ${{ inputs.release_mode || 'qualified' }}
31+
2432
concurrency:
2533
group: configurator-lzc-dev-mutation
2634
cancel-in-progress: false
2735

2836
jobs:
2937
assistant:
3038
name: assistant
31-
if: vars.LZC_RELEASE_CI_ENABLED == 'true' && github.event_name == 'workflow_dispatch' && github.run_attempt == 1 && !inputs.release_run_id && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/feature/landing-zone-configurator')
39+
if: vars.LZC_RELEASE_CI_ENABLED == 'true' && github.event_name == 'workflow_dispatch' && github.run_attempt == 1 && inputs.release_mode != 'dev-skip-assistant-qualification' && !inputs.release_run_id && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/feature/landing-zone-configurator')
3240
uses: ./.github/workflows/assistant-live.yml
3341
with:
3442
topic: all
3543
repetitions: 2
3644
secrets: inherit
3745

3846
build:
47+
name: ${{ inputs.release_mode == 'dev-skip-assistant-qualification' && 'build-dev-skip-assistant-qualification' || 'build' }}
3948
needs: assistant
40-
if: vars.LZC_RELEASE_CI_ENABLED == 'true' && github.event_name == 'workflow_dispatch' && github.run_attempt == 1 && !inputs.release_run_id && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/feature/landing-zone-configurator')
49+
if: always() && !cancelled() && ((inputs.release_mode == 'dev-skip-assistant-qualification' && github.ref == 'refs/heads/main' && needs.assistant.result == 'skipped') || (inputs.release_mode != 'dev-skip-assistant-qualification' && needs.assistant.result == 'success')) && vars.LZC_RELEASE_CI_ENABLED == 'true' && github.event_name == 'workflow_dispatch' && github.run_attempt == 1 && !inputs.release_run_id && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/feature/landing-zone-configurator')
4150
runs-on: ubuntu-latest
4251
timeout-minutes: 25
4352
services:
@@ -123,6 +132,10 @@ jobs:
123132
- name: Assemble immutable stage-neutral release
124133
run: |
125134
node ../infra/ci/release-artifact.mjs create ../.local
135+
echo "Release mode: $LZC_RELEASE_MODE" >> "$GITHUB_STEP_SUMMARY"
136+
if [ "$LZC_RELEASE_MODE" = dev-skip-assistant-qualification ]; then
137+
echo 'Dev only; live Assistant qualification NOT performed; runtime Assistant setting unchanged. Promotion is prohibited.' >> "$GITHUB_STEP_SUMMARY"
138+
fi
126139
tar -czf ../.local/configurator-release.tar.gz -C ../.local release.tar.gz release.sha256 runner.tar.gz runner.sha256 release-manifest.json
127140
(cd ../.local && sha256sum configurator-release.tar.gz > configurator-release.sha256)
128141
- uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4

‎docs/workflows.de.md‎

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,36 @@ Bereitstellungsjob freizugeben.
2929
| Konfigurierte Maschinen-Flavors mit dem aktuellen STACKIT-Katalog vergleichen | **Validate STACKIT Flavors** |
3030

3131
<a id="current-repository-workflows"></a>
32+
### Dev-Release ohne Live-Qualifikation des Assistant
33+
34+
Bei Model-Serving-Ausfällen unter
35+
**Actions > Configurator Release > Run workflow** auf Branch **main** ausdrücklich
36+
**release_mode=dev-skip-assistant-qualification** wählen. **build_only** nicht
37+
anhaken, **release_run_id** leer lassen und **runner_pool_size=1** setzen.
38+
Den genauen Quellstand/Lauf prüfen und nach allen anwendbaren Build-/
39+
Veröffentlichungsprüfungen die bestehende Umgebung **lzc-dev-release** freigeben.
40+
Diese ausdrückliche Dev-Ausnahme überspringt nur den Live-Qualifikationsjob des
41+
Assistant. `LZC_ASSISTANT_ENABLED` übernimmt weiterhin die bestehende
42+
Umgebungseinstellung; ein konfigurierter Assistant bleibt aktiviert, ohne neuen
43+
Live-Qualifikationsnachweis für diesen Release. Ob Inferenz funktioniert, hängt
44+
weiterhin von der Modellverfügbarkeit ab. Dies gilt nicht als erfolgreiche
45+
Qualifikation und löscht keine früheren fehlgeschlagenen Nachweise. Alle übrigen
46+
Prüfungen, Migrationen, geschützten Tags und Dev-Zielprüfungen bleiben erhalten.
47+
Gespräche und Vorschläge bleiben gespeichert; bestehende Laufzeitvalidierung,
48+
Autorisierung und Revisionsprüfungen bleiben unverändert. Der Modus autorisiert
49+
weder Produktion noch Kunden-Infrastruktur-Apply.
50+
51+
Das Manifest vermerkt die Beschränkung auf Dev und `assistantQualified=false`;
52+
der Build-Job heißt `build-dev-skip-assistant-qualification`. Diese Artefakte
53+
können nicht mit `release_run_id` übernommen werden, auch nicht als qualifizierter
54+
Release. Nach einem Deploymentfehler sind Untersuchung und ein neuer manueller
55+
Lauf nötig. `build_only=true` erlaubt einen Build zur Prüfung, dessen Artefakt
56+
anschließend nicht übernommen werden kann. Ein qualifizierter Release erfordert
57+
weiterhin einen neuen Lauf mit **release_mode=qualified** und vollständiger
58+
quellstandsgebundener Live-Qualifikation. Der Standardpfad **qualified** und dessen
59+
Übernahmebedingungen bleiben unverändert.
60+
61+
3262
## Aktuelle Repository-Workflows
3363

3464
**Automatisch** beschreibt Repository-Ereignisse, keinen manuellen Klick.
@@ -85,7 +115,7 @@ Pflichtprüfung, ohne sicherzustellen, dass er für jeden relevanten PR ein Erge
85115
| Configurator Bootstrap | Standardmäßig `root=bootstrap` oder `backend`; standardmäßig `apply=false`. Apply verwendet `lzc-dev-bootstrap-apply`. |
86116
| Configurator Platform | `root=platform`; standardmäßig `apply=false`. Benötigt den obigen Plattform-Operatorschalter; Apply verwendet `lzc-dev-platform-apply`. |
87117
| Configurator Runtime | `root=runtime`; standardmäßig `apply=false`. Benötigt den obigen Laufzeit-Operatorschalter; Apply verwendet `lzc-dev-runtime-apply`. |
88-
| Configurator Release | Standardmäßig `build_only=false`; leere `release_run_id` bedeutet neue Qualifikation/neuer Build. Setzen Sie `build_only=true` für einen Build ohne CF-Bereitstellung; echte Modellaufrufe und Veröffentlichung des geschützten Tags erfolgen trotzdem. Um einen bestehenden qualifizierten Build zu übernehmen, lassen Sie Build-only deaktiviert und geben Sie dessen numerische Run-ID an; das aufbewahrte Artefakt/Tag muss weiterhin gültig sein. |
118+
| Configurator Release | Standardmäßig `release_mode=qualified` und `build_only=false`; leere `release_run_id` bedeutet einen neuen Build im gewählten Modus. Setzen Sie `build_only=true` für einen Build ohne CF-Bereitstellung; die Veröffentlichung des geschützten Tags erfolgt trotzdem; echte Modellaufrufe laufen im Modus `qualified`. Um einen bestehenden qualifizierten Build zu übernehmen, lassen Sie Build-only deaktiviert und geben Sie dessen numerische Run-ID an; das aufbewahrte Artefakt/Tag muss weiterhin gültig sein. |
89119

90120
Für die normale Configurator-Bereitstellung: Wählen Sie **Configurator Release**,
91121
**runner_pool_size=1** für einen vorbereiteten Einmal-Runner in Dev

‎docs/workflows.md‎

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,34 @@ Starting a workflow is not the same as approving its protected deployment job.
2424
| Publish an Accelerator GitHub release after real deployment verification | **Publish Release** |
2525
| Compare configured machine flavors with the live STACKIT catalogue | **Validate STACKIT Flavors** |
2626

27+
### Dev release without live Assistant qualification
28+
29+
During Model Serving outages, select
30+
**release_mode=dev-skip-assistant-qualification** in
31+
**Actions > Configurator Release > Run workflow**, branch **main**.
32+
Leave **build_only** unchecked and **release_run_id** empty; set
33+
**runner_pool_size=1**. Review the exact source/run and approve the existing
34+
**lzc-dev-release** environment after all applicable build/publication checks.
35+
This explicit Dev exception skips only the live Assistant qualification job.
36+
`LZC_ASSISTANT_ENABLED` continues to use the existing environment setting;
37+
the Assistant remains enabled when configured, without a new live qualification
38+
receipt for this release. Model availability still determines whether inference
39+
works. This is not a successful qualification and does not erase earlier failed
40+
receipts. All non-Assistant checks, migrations, protected tags and Dev destination
41+
guards remain in force. Conversations and proposals are preserved; existing
42+
runtime validation, authorization and revision checks remain unchanged. No
43+
production deployment or customer infrastructure Apply is authorized by this mode.
44+
45+
The manifest records Dev-only scope and `assistantQualified=false`; the build
46+
job is named `build-dev-skip-assistant-qualification`. These artifacts cannot be
47+
promoted using `release_run_id`, including as a qualified release. A deployment
48+
failure requires inspection and a fresh manual run. `build_only=true` may build
49+
this mode for inspection, but its artifact cannot subsequently be promoted.
50+
A qualified release still requires a fresh **release_mode=qualified** run with
51+
the complete source-bound live qualification. The default **qualified** path
52+
and its promotion requirements are unchanged.
53+
54+
2755
## Current repository workflows
2856

2957
**Automatic** describes repository events, not a manual click. **Reusable** means
@@ -42,7 +70,7 @@ branch restrictions, operator switches and environment protection still apply.
4270
| [Configurator Bootstrap](https://github.com/stackitcloud/stackit-landing-zone/actions/workflows/configurator-bootstrap.yml) · [source](../.github/workflows/configurator-bootstrap.yml) | Plan the workload-state bucket/access (`bootstrap`) or its versioning (`backend`) | None | **Run workflow** on `main`; choose root and optionally Apply | Real backend/credential access for Plan; `apply=true` enables cloud changes after protected environment approval |
4371
| [Configurator Platform](https://github.com/stackitcloud/stackit-landing-zone/actions/workflows/configurator-platform.yml) · [source](../.github/workflows/configurator-platform.yml) | Plan shared Configurator services: CF organization, database, Secrets Manager, artifact storage and model token | None | **Run workflow** on `main`; optionally Apply; requires `LZC_PLATFORM_CI_ENABLED=true` | Real backend/credential access for Plan; optional approved cloud Apply |
4472
| [Configurator Runtime](https://github.com/stackitcloud/stackit-landing-zone/actions/workflows/configurator-runtime.yml) · [source](../.github/workflows/configurator-runtime.yml) | Plan CF space/roles and database/Secrets runtime users | None | **Run workflow** on `main`; optionally Apply; requires `LZC_RUNTIME_CI_ENABLED=true` | Real backend/credential access for Plan; optional approved cloud Apply. Does not publish application code. |
45-
| [Configurator Release](https://github.com/stackitcloud/stackit-landing-zone/actions/workflows/configurator-release.yml) · [source](../.github/workflows/configurator-release.yml) | Qualify, build and package API/UI and Runner together, or promote an existing qualified build | None; a merge does not start it | **Run workflow** on `main`; choose build-only, new release or promotion; requires `LZC_RELEASE_CI_ENABLED=true` | Fresh builds call **Assistant live regression** and publish a protected buildpack tag. Unless build-only, deploys development after `lzc-dev-release` approval, including migrations and runtime checks. |
73+
| [Configurator Release](https://github.com/stackitcloud/stackit-landing-zone/actions/workflows/configurator-release.yml) · [source](../.github/workflows/configurator-release.yml) | Qualify, build and package API/UI and Runner together, or promote an existing qualified build | None; a merge does not start it | **Run workflow** on `main`; choose build-only, new release or promotion; requires `LZC_RELEASE_CI_ENABLED=true` | Fresh `qualified` builds call **Assistant live regression** and publish a protected buildpack tag. Unless build-only, deploys development after `lzc-dev-release` approval, including migrations and runtime checks. |
4674

4775
The exact Configurator path filter is in the linked YAML. A skipped
4876
Accelerator-only job on a Configurator PR is intentional, not a deployment.
@@ -76,7 +104,7 @@ it reports a result for every relevant PR.
76104
| Configurator Bootstrap | `root=bootstrap` by default, or `backend`; `apply=false` by default. Apply uses `lzc-dev-bootstrap-apply`. |
77105
| Configurator Platform | `root=platform`; `apply=false` by default. Requires the platform operator switch above; Apply uses `lzc-dev-platform-apply`. |
78106
| Configurator Runtime | `root=runtime`; `apply=false` by default. Requires the runtime operator switch above; Apply uses `lzc-dev-runtime-apply`. |
79-
| Configurator Release | `build_only=false` by default; `release_run_id` empty means fresh qualification/build. Set `build_only=true` to build without CF deployment; real-model calls and protected tag publication still occur. To promote an existing qualified build, leave build-only unchecked and enter its numeric run ID; the retained artifact/tag must remain valid. |
107+
| Configurator Release | `release_mode=qualified` and `build_only=false` by default; `release_run_id` empty means a fresh build under the selected mode. Set `build_only=true` to build without CF deployment; protected tag publication still occurs; live-model calls run in `qualified` mode. To promote an existing qualified build, leave build-only unchecked and enter its numeric run ID; the retained artifact/tag must remain valid. |
80108

81109
For the normal Configurator deployment: select **Configurator Release**, `main`,
82110
choose **runner_pool_size=1** to maintain one prepared one-shot Dev Runner

‎landing-zone-configurator/deploy/cloud-foundry/README.de.md‎

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ des Repositorys **Configurator Release** und dann **Run workflow** auswählen:
2929
auf `0` zum Deaktivieren/Abbauen des Pools setzen. Standard ist `0`; zulässig
3030
sind `0`–`4`. Jede Reserve benötigt zusätzlich zu aktiven Aufträgen 1 GiB RAM
3131
und ein Disk-Budget von 4 GiB.
32-
5. Workflow starten. Er qualifiziert den echten Assistant, baut und testet beide
32+
5. Für normale Releases **release_mode=qualified** beibehalten und den Workflow
33+
starten. Er qualifiziert den echten Assistant, baut und testet beide
3334
Pakete und erstellt anschließend den geschützten, quellgebundenen Buildpack-Tag.
3435
6. Wenn **deploy** auf Prüfung wartet, über **Review deployments** das
3536
Environment **lzc-dev-release** mit einem autorisierten Prüferkonto freigeben.
@@ -47,7 +48,7 @@ Ein überholter Branch-HEAD wird abgelehnt, statt stillschweigend eine andere
4748
Revision zu deployen. Bei einem gewöhnlichen neuen Release weder Repository-Token-Rechte
4849
erweitern noch Tags manuell erstellen.
4950

50-
Für „jetzt bauen, später deployen“ **build_only** anhaken. Qualifizierung, Paketierung und Tag-
51+
Für qualifiziertes „jetzt bauen, später deployen“ **release_mode=qualified** beibehalten und **build_only** anhaken. Qualifizierung, Paketierung und Tag-
5152
Veröffentlichung laufen weiterhin, aber es findet kein Cloud-Deployment statt. Später einen **neuen**
5253
manuellen Lauf auf `main` starten, **build_only** nicht anhaken und die ursprüngliche
5354
numerische Build-Run-ID unter **release_run_id** eintragen. Damit wird exakt das qualifizierte
@@ -300,6 +301,36 @@ Task-Status, bereinigte Diagnosen und öffentliche Health Checks liefern Release
300301

301302
<a id="immutable-release-and-promotion"></a>
302303

304+
### Dev-Release ohne Live-Qualifikation des Assistant
305+
306+
Bei Model-Serving-Ausfällen unter
307+
**Actions > Configurator Release > Run workflow** auf Branch **main** ausdrücklich
308+
**release_mode=dev-skip-assistant-qualification** wählen. **build_only** nicht
309+
anhaken, **release_run_id** leer lassen und **runner_pool_size=1** setzen.
310+
Den genauen Quellstand/Lauf prüfen und nach allen anwendbaren Build-/
311+
Veröffentlichungsprüfungen die bestehende Umgebung **lzc-dev-release** freigeben.
312+
Diese ausdrückliche Dev-Ausnahme überspringt nur den Live-Qualifikationsjob des
313+
Assistant. `LZC_ASSISTANT_ENABLED` übernimmt weiterhin die bestehende
314+
Umgebungseinstellung; ein konfigurierter Assistant bleibt aktiviert, ohne neuen
315+
Live-Qualifikationsnachweis für diesen Release. Ob Inferenz funktioniert, hängt
316+
weiterhin von der Modellverfügbarkeit ab. Dies gilt nicht als erfolgreiche
317+
Qualifikation und löscht keine früheren fehlgeschlagenen Nachweise. Alle übrigen
318+
Prüfungen, Migrationen, geschützten Tags und Dev-Zielprüfungen bleiben erhalten.
319+
Gespräche und Vorschläge bleiben gespeichert; bestehende Laufzeitvalidierung,
320+
Autorisierung und Revisionsprüfungen bleiben unverändert. Der Modus autorisiert
321+
weder Produktion noch Kunden-Infrastruktur-Apply.
322+
323+
Das Manifest vermerkt die Beschränkung auf Dev und `assistantQualified=false`;
324+
der Build-Job heißt `build-dev-skip-assistant-qualification`. Diese Artefakte
325+
können nicht mit `release_run_id` übernommen werden, auch nicht als qualifizierter
326+
Release. Nach einem Deploymentfehler sind Untersuchung und ein neuer manueller
327+
Lauf nötig. `build_only=true` erlaubt einen Build zur Prüfung, dessen Artefakt
328+
anschließend nicht übernommen werden kann. Ein qualifizierter Release erfordert
329+
weiterhin einen neuen Lauf mit **release_mode=qualified** und vollständiger
330+
quellstandsgebundener Live-Qualifikation. Der Standardpfad **qualified** und dessen
331+
Übernahmebedingungen bleiben unverändert.
332+
333+
303334
## Unveränderlicher Release und Promotion
304335

305336
Einmal bauen; dieselben Bytes deployen. Der Workflow veröffentlicht ein unveränderliches GitHub-

0 commit comments

Comments
 (0)