[skip ci]Workflow source: .github/workflows/deploy-and-release.yml
| Layer | Technology | Version / Pin | Role |
|---|---|---|---|
| CI Orchestration | GitHub Actions | Hosted | Runs 5-job pipeline on push to main |
| Runtime | Node.js | 20 | Build and deploy runtime in workflow |
| Build Tooling | actions/setup-node, npm, Angular CLI |
v4 / npm install |
Installs dependencies and runs npm run build:prod |
| Cloud Auth | Workload Identity Federation + OIDC | google-github-actions/auth@v2 |
Provides short-lived Google access token without key files |
| Deployment | Firebase CLI | firebase-tools@13.15.2 (pinned) |
Deploys Hosting, Firestore rules/indexes, and Functions |
| Release Notes | Anthropic Messages API via curl |
claude-sonnet-4-6 |
Generates categorized release notes with grep/sed fallback |
| Release Publishing | GitHub CLI (gh) |
runner-provided | Creates tag and publishes GitHub Release |
BREAKING CHANGE → major, feat: → minor, anything else → patchnew_version, new_tag, previous_tag, and commit_log as job outputs for downstream jobsecho "export const appVersion = '...';" > src/environments/version.tsnpm install (not npm ci — see Quick Reference for why)npm run build:prod — optimized production Angular builddist/dora-tma/browser/) with 1-day retention for the deploy jobcd functions && npm install && npm run buildv13.15.2 (must not upgrade — see Quick Reference)NODE_TLS_REJECT_UNAUTHORIZED=0 and FIREBASE_TOKEN from WIF access tokenhosting (dial-app + docs targets), firestore rules, functionscurl with the commit log as inputclaude-sonnet-4-6 — generates categorized markdown release notesgrep/sed pipeline that categorizes commits by prefix — same section structure, no AIANTHROPIC_API_KEY used here is a separate GitHub Actions secret — used only in CI, never deployed to any runtime. The Cloud Functions use their own key set via gcloud run services update.
vMAJOR.MINOR.PATCHrelease-notes.mdgh release create using the release notes file| Commit Prefix | Version Bump | Example |
|---|---|---|
| BREAKING CHANGE or [major] | Major (x.0.0) | API redesign, data model change |
| feat: or [minor] | Minor (0.x.0) | New capability, new user-facing feature |
| fix:, docs:, refactor:, chore: | Patch (0.0.x) | Bug fix, documentation update, cleanup |
All commits since the previous tag are evaluated. The highest-priority bump wins — a release with one feat: and ten fix: commits bumps the minor version.
feat:, fix:, docs:, refactor: prefixes — ensuring consistent style and accurate version bumping.main triggers a full pipeline run. There is no separate release step — versioning and deployment are automatic from the commit log.| Concern | Approach |
|---|---|
| CI Authentication | Workload Identity Federation (WIF) — no stored service account keys. GitHub Actions OIDC token exchanged for a short-lived Google access token. |
| ANTHROPIC_API_KEY (runtime) | Set directly on Cloud Run services via gcloud run services update --update-env-vars. Never in firebase.json or source control. |
| ANTHROPIC_API_KEY (CI) | Stored as GitHub Actions secret. Used only in the release-notes job. Never deployed to any runtime. |
| Firestore Access | Security rules enforce org-scoped access. Users can only read/write data within their own organization. |
| Pipeline Concurrency | concurrency: group: deploy-$ref, cancel-in-progress: false — concurrent runs queue rather than cancel to prevent lost deploys. |