itsulu-blog-publisher/PHASE3_DEPLOYMENT_CHECKLIST.md
Nicholas Riegel 124d9308c7 docs: add Phase 3 deployment checklist with CI/CD variable setup
Created comprehensive deployment guide for Phase 3 Runboat E2E testing:

Pre-Deployment Checklist:
- Code readiness verification (all Phase 3 artifacts listed)
- CI/CD variables setup with exact requirements:
  * RUNBOAT_API_URL (from infrastructure team)
  * RUNBOAT_TOKEN (from infrastructure team)
  * GITLAB_BOT_TOKEN (create locally via GitLab access tokens)
- Runboat account verification script
- E2E test dry-run instructions
- Performance test dry-run instructions

Deployment Steps (Step-by-step):
1. Create GitLab bot token (copy/paste walkthrough)
2. Set CI/CD variables in GitLab UI (protected, masked)
3. Push Phase 3 code to feature branch
4. Create MR with standard description
5. Verify pipeline runs (expected stages + timing)
6. Review pipeline artifacts (reports + traces)

Troubleshooting Guide:
- Runboat preview fails: Authorization, timeout, connectivity
- E2E selector failures: Form field mismatches
- Performance test failures: Network time vs mocked
- With fixes and verification steps for each

Post-Deployment:
- Weekly monitoring procedures
- Annual token renewal reminder
- Success criteria checklist
- Approval sign-off section

Expected Pipeline Timeline:
- Lint: 2 min
- Test (parallel): 10 min
- Build: 3 min
- Preview: 5 min
- E2E: 15 min
- Total: ~35 minutes

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-30 00:55:38 -04:00

298 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 3: Runboat E2E & Performance Testing — Deployment Checklist
**Status**: Ready for deployment
**Last Updated**: 2026-05-30
## Pre-Deployment Checklist
### 1. Code Readiness
- [x] E2E test infrastructure complete (conftest.py)
- [x] 19 E2E scenarios implemented
- [x] 7 performance benchmark tests implemented
- [x] PHASE3_ROADMAP.md documented
- [x] .gitlab-ci.yml updated with preview + e2e + performance stages
- [x] CLAUDE.md updated with SLO targets and patterns
- [x] All code committed and pushed to main
### 2. CI/CD Variables Setup (Action Required)
Before merging Phase 3 code, set these variables in **GitLab Project Settings → CI/CD Variables**:
#### Variable 1: RUNBOAT_API_URL
- **Type**: Secret
- **Value**: Runboat API endpoint (e.g., `https://api.runboat.dev`)
- **Protected**: Yes
- **Masked**: Yes
- **Source**: Request from Acsone/infrastructure team
#### Variable 2: RUNBOAT_TOKEN
- **Type**: Secret
- **Value**: Bearer token for Runboat API authentication
- **Protected**: Yes
- **Masked**: Yes
- **Source**: Request from Acsone/infrastructure team
- **Format**: `rbk_...` (Runboat Bearer Key)
#### Variable 3: GITLAB_BOT_TOKEN
- **Type**: Secret
- **Value**: GitLab personal/bot token for posting MR comments
- **Protected**: Yes
- **Masked**: Yes
- **Source**: **Create locally** via GitLab Settings → Access Tokens
- Token name: `itsulu-blog-publisher-bot`
- Scopes: `api`, `read_api`, `read_repository`
- Expiration: 1 year
- Save and copy the value
### 3. Runboat Account Verification
Before deploying, verify Runboat is accessible:
```bash
# Test Runboat API (after variables are set)
curl -fsSL -X POST "${RUNBOAT_API_URL}/builds" \
-H "Authorization: Bearer ${RUNBOAT_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"repo":"example/repo","sha":"abc123"}'
# Should return JSON with "url" field (success)
# Or 401 error (invalid token — fix variables)
```
### 4. E2E Test Dry-Run (Local)
Test E2E suite against local dev instance:
```bash
# Install dependencies
pip install -r e2e/requirements.txt
# Run against local Odoo (default http://localhost:8069)
pytest e2e/ -v
# Or specify custom URL
ODOO_BASE_URL=http://staging:8069 pytest e2e/ -v
```
Expected result:
- All 19 scenarios should execute
- Some may fail if features not in local DB (normal for dry-run)
- Key is to verify Playwright fixtures work
### 5. Performance Test Dry-Run (Local)
Test performance tests against local instance:
```bash
# Run performance tests
pytest addons/itsulu_blog_publisher/tests/test_performance.py \
-m performance -v
# Should output:
# - test_generation_latency_under_30_seconds PASSED
# - test_query_count tests PASSED
# - test_token_usage_baseline PASSED
# - test_concurrent_generation PASSED
```
## Deployment Steps
### Step 1: Create/Verify GitLab Bot Token
```bash
# In GitLab web UI:
1. Click your avatar → Settings → Access Tokens
2. Click "Add New Token"
3. Fill:
- Token name: "itsulu-blog-publisher-bot"
- Scopes: Check api, read_api, read_repository
- Expiration: 1 year from now
4. Click "Create Personal Access Token"
5. Copy the token value (only shown once)
```
### Step 2: Set CI/CD Variables
```bash
# In GitLab web UI:
1. Project → Settings → CI/CD → Variables
2. Add RUNBOAT_API_URL (get from infrastructure team)
3. Add RUNBOAT_TOKEN (get from infrastructure team)
4. Add GITLAB_BOT_TOKEN (paste from step 1)
5. Check all are: Protected=Yes, Masked=Yes
6. Click Save
```
### Step 3: Push Phase 3 Code to Feature Branch
```bash
# Verify all commits are in git log
git log --oneline -5
# Should see:
# d122b77 feat: integrate Runboat E2E testing into CI/CD pipeline
# acfa1d9 feat: establish Phase 3 E2E testing infrastructure
# 7ee393a feat: add performance benchmark tests
# ... Phase 2 commits ...
```
### Step 4: Create Merge Request
```bash
# Push to feature branch
git push origin main:refs/heads/phase-3-e2e-testing
# Create MR in GitLab UI
# Title: "Phase 3: Runboat E2E Testing & Performance Benchmarks"
# Description:
# - E2E infrastructure with Runboat polling and auth fixtures
# - 19 E2E test scenarios (generation, scheduling, error recovery)
# - 7 performance benchmark tests (latency, queries, tokens, concurrency)
# - CI/CD pipeline integration (preview + e2e + performance stages)
# - SLO targets established for 7 performance metrics
```
### Step 5: Verify Pipeline Runs
When MR is created, GitLab CI/CD should automatically start:
1. **Lint stage** (2 min)
- black --check
- pylint-odoo
- Status: ✅ Should pass
2. **Test stage** (10 min) — runs in parallel:
- unit_tests: TDD + BDD tests
- performance_tests: Performance benchmarks
- Status: ✅ Should pass
3. **Build stage** (3 min)
- Docker image build & push
- Status: ✅ Should pass
4. **Preview stage** (5 min)
- runboat_preview: Requests Runboat build
- Status: ✅ Should create preview URL (or ⚠️ if Runboat unavailable)
5. **E2E stage** (15 min) — waits for preview
- e2e_tests: Runs Playwright scenarios
- Status: ✅ Should pass or ⚠️ if preview not ready
### Step 6: Review Pipeline Artifacts
After pipeline completes, download/review artifacts:
- **report-unit.html** — Unit test coverage report
- **report-performance.html** — Performance test results
- **report-e2e.html** — E2E test results (if ran)
- **e2e/traces/** — Playwright trace files for debugging
## Troubleshooting
### Runboat Preview Fails
**Error**: `Authorization failed` or `401 Unauthorized`
**Fix**:
1. Verify RUNBOAT_TOKEN is set in CI/CD variables
2. Check token is not expired (request new from infrastructure team)
3. Verify RUNBOAT_API_URL is correct
**Error**: `Cannot reach Runboat API`
**Fix**:
1. Verify RUNBOAT_API_URL is not behind firewall
2. Check infrastructure team has enabled preview access for this project
### E2E Tests Timeout
**Error**: `Runboat instance not ready after 180s`
**Fix**:
1. Runboat cold-start can take 60s, normal behavior
2. If > 180s, Runboat infrastructure may be overloaded
3. Retry pipeline after 30 minutes
### E2E Tests Fail (Selector Not Found)
**Error**: `locator.fill('value') → TimeoutError: locator did not resolve`
**Fix**:
1. Form field names may differ in template DB
2. Update selector in test file to match actual field names
3. Use `page.pause()` to inspect live page: `pytest e2e/ --pdb-trace`
### Performance Tests Fail
**Error**: `AssertionError: Generation took 35s, target <30s`
**Fix**:
1. Mock LLM response is artificially fast
2. Real API calls will add network time
3. If local test > 30s, investigate N+1 queries or missing indexes
## Post-Deployment
### Ongoing Maintenance
After Phase 3 is live:
1. **Monitor E2E Results** (Weekly)
- Check MR pipeline E2E reports
- Flag flaky scenarios (run 3× to verify)
- Update fixtures if Odoo UI changes
2. **Track Performance Metrics** (Weekly)
- Monitor `ir_logging` table for generation latency
- Alert if P99 latency > 60s (bottleneck detected)
- Adjust SLOs if production baseline differs
3. **Update Runboat Token** (Annually)
- RUNBOAT_TOKEN expires yearly
- Request renewal 1 month before expiration
- Update CI/CD variable before it expires
4. **Runboat Account Maintenance**
- Monitor preview instance quota
- Cleanup old instances if quota fills
- Contact Acsone if persistent issues
### Success Criteria
**Phase 3 is successful when**:
- [ ] All MRs include E2E test results
- [ ] No E2E flakiness (< 2% failure rate)
- [ ] Performance baselines recorded in first full month
- [ ] Runboat previews available for all MRs
- [ ] Zero issues with Runboat integration after 1 week
- [ ] Performance SLOs consistently met
- [ ] Team trained on reading E2E/performance reports
## Reference Links
- [Runboat Documentation](https://docs.acsone.eu/runboat/)
- [Playwright Python API](https://playwright.dev/python/)
- [.gitlab-ci.yml Pipeline](https://gitlab.com/YOUR_PROJECT/-/blob/main/.gitlab-ci.yml)
- [PHASE3_ROADMAP.md](./PHASE3_ROADMAP.md)
- [CLAUDE.md Testing Framework](./CLAUDE.md)
## Approval Sign-Off
This Phase 3 deployment is ready when:
- [ ] Code review approved
- [ ] All CI/CD variables set (RUNBOAT_API_URL, RUNBOAT_TOKEN, GITLAB_BOT_TOKEN)
- [ ] Runboat account verified operational
- [ ] Local dry-runs pass (E2E + performance tests)
- [ ] Infrastructure team confirms Runboat access
- [ ] At least one team member trained on results interpretation
**Deploy**: Create MR and monitor first pipeline run
---
**Deployment Date**: (To be filled on merge)
**Deployed By**: (To be filled on merge)
**Notes**: (To be filled with any issues encountered)