Compare commits
2 Commits
todo/mvp0-
...
mvp0-compl
| Author | SHA1 | Date | |
|---|---|---|---|
|
37fabad1f8
|
|||
|
637dfd2651
|
3
TODO.md
3
TODO.md
@@ -108,7 +108,7 @@ This file is the single source of truth for roadmap and delivery progress.
|
||||
### MVP0 Close-Out Checklist
|
||||
|
||||
- [~] [P1] Verify and document protected branch rules in Gitea (`main`, `staging`)
|
||||
- [ ] [P1] Run first staging deployment against a real host with deploy workflow and document result
|
||||
- [~] [P1] Run first staging deployment against a real host with deploy workflow and document result
|
||||
- [x] [P1] Replace release workflow placeholders with real release-notes and rollback execution steps
|
||||
- [x] [P1] Expose runtime version + short git hash in admin and public app footer
|
||||
- [x] [P2] Add CI build stamping for version/hash values consumed by app footers
|
||||
@@ -220,6 +220,7 @@ This file is the single source of truth for roadmap and delivery progress.
|
||||
- [2026-02-10] Delivery and release governance now include branch/PR policy checks, deploy/release workflows, and explicit versioning policy (`VERSIONING.md`).
|
||||
- [2026-02-11] Release workflow now publishes changelog-derived notes to Gitea releases and supports executable production rollback via SSH + compose tag switch.
|
||||
- [2026-02-11] Branch protection verification checklist is now documented; final UI-level verification remains environment-specific.
|
||||
- [2026-02-11] Added a staging deployment execution checklist and deployment-record template to capture first real-host rollout evidence.
|
||||
|
||||
## How We Use This File
|
||||
|
||||
|
||||
16
bun.lock
16
bun.lock
@@ -17,7 +17,7 @@
|
||||
"conventional-changelog-cli": "5.0.0",
|
||||
"jsdom": "28.0.0",
|
||||
"msw": "2.12.9",
|
||||
"turbo": "2.8.3",
|
||||
"turbo": "^2.8.6",
|
||||
"typescript": "5.9.3",
|
||||
"vite-tsconfig-paths": "6.1.0",
|
||||
"vitepress": "1.6.4",
|
||||
@@ -1451,19 +1451,19 @@
|
||||
|
||||
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
||||
|
||||
"turbo": ["turbo@2.8.3", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.3", "turbo-darwin-arm64": "2.8.3", "turbo-linux-64": "2.8.3", "turbo-linux-arm64": "2.8.3", "turbo-windows-64": "2.8.3", "turbo-windows-arm64": "2.8.3" }, "bin": { "turbo": "bin/turbo" } }, "sha512-8Osxz5Tu/Dw2kb31EAY+nhq/YZ3wzmQSmYa1nIArqxgCAldxv9TPlrAiaBUDVnKA4aiPn0OFBD1ACcpc5VFOAQ=="],
|
||||
"turbo": ["turbo@2.8.6", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.6", "turbo-darwin-arm64": "2.8.6", "turbo-linux-64": "2.8.6", "turbo-linux-arm64": "2.8.6", "turbo-windows-64": "2.8.6", "turbo-windows-arm64": "2.8.6" }, "bin": { "turbo": "bin/turbo" } }, "sha512-QMj1SQwUYehc+xJ9SxXn56UO43hfKN64/NFetVW1BwzysRqn+q0FSgrmk+IbJ+djfd8j8zXGKGeqsnUcXwQSUQ=="],
|
||||
|
||||
"turbo-darwin-64": ["turbo-darwin-64@2.8.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-4kXRLfcygLOeNcP6JquqRLmGB/ATjjfehiojL2dJkL7GFm3SPSXbq7oNj8UbD8XriYQ5hPaSuz59iF1ijPHkTw=="],
|
||||
"turbo-darwin-64": ["turbo-darwin-64@2.8.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-6QeZ/aLZizekiI6tKZN0IGP1a1WYZ9c/qDKPa0rSmj2X0O0Iw/ES4rKZV40S5n8SUJdiU01EFLygHJ2oWaYKXg=="],
|
||||
|
||||
"turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xF7uCeC0UY0Hrv/tqax0BMbFlVP1J/aRyeGQPZT4NjvIPj8gSPDgFhfkfz06DhUwDg5NgMo04uiSkAWE8WB/QQ=="],
|
||||
"turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RS4Z902vB93cQD3PJS/1IMmS0HefrB5ZXuw4ECOrxhOGz5jJVmYFJ6weDzedjoTDeYHHXGo1NoiCSHg69ngWKA=="],
|
||||
|
||||
"turbo-linux-64": ["turbo-linux-64@2.8.3", "", { "os": "linux", "cpu": "x64" }, "sha512-vxMDXwaOjweW/4etY7BxrXCSkvtwh0PbwVafyfT1Ww659SedUxd5rM3V2ZCmbwG8NiCfY7d6VtxyHx3Wh1GoZA=="],
|
||||
"turbo-linux-64": ["turbo-linux-64@2.8.6", "", { "os": "linux", "cpu": "x64" }, "sha512-hCWDnDepYbrSJdByuryKFoHAGFkvgBYXr6qdaGsYhX1Wgq8isqXCQBKOo99Y/9tXDwKGEeQ7xnkdFvSL7AQ4iQ=="],
|
||||
|
||||
"turbo-linux-arm64": ["turbo-linux-arm64@2.8.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-mQX7uYBZFkuPLLlKaNe9IjR1JIef4YvY8f21xFocvttXvdPebnq3PK1Zjzl9A1zun2BEuWNUwQIL8lgvN9Pm3Q=="],
|
||||
"turbo-linux-arm64": ["turbo-linux-arm64@2.8.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-oS15aCYEpynG/l69xs/ZnQ0dnz0pHhfHg70Zf5J+j5Cam0/RA0MpcryjneN/9G0PmP8a/6ZxnL5nZahX+wOBPA=="],
|
||||
|
||||
"turbo-windows-64": ["turbo-windows-64@2.8.3", "", { "os": "win32", "cpu": "x64" }, "sha512-YLGEfppGxZj3VWcNOVa08h6ISsVKiG85aCAWosOKNUjb6yErWEuydv6/qImRJUI+tDLvDvW7BxopAkujRnWCrw=="],
|
||||
"turbo-windows-64": ["turbo-windows-64@2.8.6", "", { "os": "win32", "cpu": "x64" }, "sha512-eqBxqJD7H/uk9V0QO10VgwY9J2BUXejsGuzChln72Yl+o8GZwsvhOekndRxccR90J8ZO+LKO24+3VzHFh4Cu/g=="],
|
||||
|
||||
"turbo-windows-arm64": ["turbo-windows-arm64@2.8.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-afTUGKBRmOJU1smQSBnFGcbq0iabAPwh1uXu2BVk7BREg30/1gMnJh9DFEQTah+UD3n3ru8V55J83RQNFfqoyw=="],
|
||||
"turbo-windows-arm64": ["turbo-windows-arm64@2.8.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-I3VEQyxIlNZ6XTg4fLKAkuhcwzIs/GD7Vs1yhelH2aUTjf08wprjBWknDqP7mjAHMpsosRrq4DtfSZEQm83Hxg=="],
|
||||
|
||||
"type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="],
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ This section covers platform and implementation documentation for engineers and
|
||||
- [CRUD Examples](/product-engineering/crud-examples)
|
||||
- [Domain Glossary](/product-engineering/domain-glossary)
|
||||
- [Environment Runbook](/product-engineering/environment-runbook)
|
||||
- [Staging Deployment Checklist](/product-engineering/staging-deployment-checklist)
|
||||
- [Delivery Pipeline](/product-engineering/delivery-pipeline)
|
||||
- [Git Flow Governance](/product-engineering/git-flow-governance)
|
||||
- [Testing Strategy Baseline](/product-engineering/testing-strategy)
|
||||
|
||||
100
docs/product-engineering/staging-deployment-checklist.md
Normal file
100
docs/product-engineering/staging-deployment-checklist.md
Normal file
@@ -0,0 +1,100 @@
|
||||
# Staging Deployment Checklist
|
||||
|
||||
## Purpose
|
||||
|
||||
Operational checklist for the first real staging deployment using `.gitea/workflows/deploy.yml`.
|
||||
|
||||
Use this once end-to-end, save the record, then mark MVP0 staging deployment as complete in `TODO.md`.
|
||||
|
||||
## Preconditions
|
||||
|
||||
- Docker host for staging is reachable via SSH.
|
||||
- Gitea repo secrets are configured:
|
||||
- `CMS_STAGING_HOST`
|
||||
- `CMS_STAGING_USER`
|
||||
- `CMS_DEPLOY_KEY`
|
||||
- `CMS_REMOTE_DEPLOY_PATH`
|
||||
- `CMS_IMAGE_REGISTRY`
|
||||
- `CMS_IMAGE_NAMESPACE`
|
||||
- `CMS_IMAGE_REGISTRY_USER`
|
||||
- `CMS_IMAGE_REGISTRY_PASSWORD`
|
||||
- Release image tag exists in registry (e.g. `v0.1.0`).
|
||||
- Remote deploy path contains:
|
||||
- `docker-compose.staging.yml`
|
||||
- staging env file(s) needed by compose
|
||||
|
||||
## Step-by-Step Execution
|
||||
|
||||
1. Verify release images exist:
|
||||
- `cms-web:<tag>`
|
||||
- `cms-admin:<tag>`
|
||||
2. In Gitea Actions, run `CMS Deploy` workflow.
|
||||
3. Inputs:
|
||||
- `environment=staging`
|
||||
- `image_tag=<tag>`
|
||||
- `rollback_tag=` (empty for normal deploy)
|
||||
4. Confirm workflow success.
|
||||
5. Validate staging endpoints:
|
||||
- web base route
|
||||
- admin login route
|
||||
6. Run smoke checks on staging:
|
||||
- auth login
|
||||
- i18n route/switch baseline
|
||||
- admin dashboard route access
|
||||
7. If failure:
|
||||
- rerun `CMS Deploy` with `rollback_tag=<previous-tag>`
|
||||
- capture root cause and remediation notes
|
||||
|
||||
## Evidence To Capture
|
||||
|
||||
- Workflow run URL
|
||||
- Deployed image tag
|
||||
- Timestamp (UTC)
|
||||
- Validation results (pass/fail)
|
||||
- Rollback performed or not
|
||||
|
||||
## Deployment Record Template
|
||||
|
||||
Copy the block below into a new file under `docs/product-engineering/staging-deployments/`.
|
||||
|
||||
```md
|
||||
# Staging Deployment Record - <YYYY-MM-DD>
|
||||
|
||||
- Date (UTC):
|
||||
- Operator:
|
||||
- Workflow run URL:
|
||||
- Target environment: staging
|
||||
- Image tag:
|
||||
- Previous tag:
|
||||
|
||||
## Preconditions
|
||||
|
||||
- [ ] Secrets configured in Gitea
|
||||
- [ ] Registry images available
|
||||
- [ ] Remote compose path verified
|
||||
|
||||
## Execution
|
||||
|
||||
1. Triggered `CMS Deploy` with `environment=staging`, `image_tag=<tag>`
|
||||
2. Workflow status: <!-- pass/fail -->
|
||||
|
||||
## Validation
|
||||
|
||||
- [ ] Web route check
|
||||
- [ ] Admin login route check
|
||||
- [ ] Auth smoke flow
|
||||
- [ ] i18n smoke flow
|
||||
- [ ] Admin dashboard access
|
||||
|
||||
## Rollback
|
||||
|
||||
- Performed: <!-- yes/no -->
|
||||
- Rollback tag:
|
||||
- Rollback workflow run URL:
|
||||
|
||||
## Outcome
|
||||
|
||||
- Result: <!-- success/failed -->
|
||||
- Notes:
|
||||
- Follow-up actions:
|
||||
```
|
||||
10
package.json
10
package.json
@@ -44,22 +44,22 @@
|
||||
"docker:production:down": "docker compose -f docker-compose.production.yml down"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.58.2",
|
||||
"@biomejs/biome": "2.3.14",
|
||||
"@commitlint/cli": "20.4.1",
|
||||
"@commitlint/config-conventional": "20.4.1",
|
||||
"@playwright/test": "1.58.2",
|
||||
"@testing-library/jest-dom": "6.9.1",
|
||||
"@testing-library/react": "16.3.2",
|
||||
"@testing-library/user-event": "14.6.1",
|
||||
"@vitejs/plugin-react": "5.1.3",
|
||||
"@vitest/coverage-istanbul": "4.0.18",
|
||||
"@biomejs/biome": "2.3.14",
|
||||
"conventional-changelog-cli": "5.0.0",
|
||||
"jsdom": "28.0.0",
|
||||
"msw": "2.12.9",
|
||||
"conventional-changelog-cli": "5.0.0",
|
||||
"turbo": "2.8.3",
|
||||
"turbo": "^2.8.6",
|
||||
"typescript": "5.9.3",
|
||||
"vitepress": "1.6.4",
|
||||
"vite-tsconfig-paths": "6.1.0",
|
||||
"vitepress": "1.6.4",
|
||||
"vitest": "4.0.18"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user