362 lines
9.6 KiB
Markdown
362 lines
9.6 KiB
Markdown
<!-- Moved from docs/05-operations/workflow.md to docs/working/archive/operations/workflow.md on 2026-06-16 (docs reorg Phase 2) -->
|
|
# StarForth CI/CD Workflow
|
|
|
|
## Overview
|
|
|
|
This document describes the **trunk-based development workflow** for StarForth's formal verification pipeline.
|
|
|
|
```
|
|
Developer commits → devl → test → qual → prod → master (Release)
|
|
(5m) (20m) (25m) (2m)
|
|
```
|
|
|
|
## Branch Strategy
|
|
|
|
| Branch | Purpose | Duration | Failure Behavior |
|
|
|--------|---------|----------|------------------|
|
|
| **master** | Production releases (immutable) | N/A | Protected - no direct commits |
|
|
| **prod** | Release staging | 2 min | Manual PM approval required |
|
|
| **qual** | Formal verification gate | 25 min | Auto-rejects to devl with CAPA |
|
|
| **test** | Full test suite | 20 min | Auto-rejects to devl with CAPA |
|
|
| **devl** | Development (where code lives) | 5 min | Quick feedback to developer |
|
|
|
|
## Workflow Flow
|
|
|
|
### 1. Developer Creates Feature/Fix on devl
|
|
|
|
```bash
|
|
git checkout devl
|
|
git checkout -b feature/my-fix
|
|
# ... make changes ...
|
|
git commit -m "Fix stack push error (DEFECT-001)"
|
|
git push origin feature/my-fix
|
|
# Open PR to devl branch
|
|
```
|
|
|
|
**Jenkins triggers:** `starforth-devl` pipeline
|
|
- **Time:** 5 minutes
|
|
- **Stages:** Build + Smoke Test only
|
|
- **Outcome:**
|
|
- ✅ PASS → PR approved, merge to devl
|
|
- ❌ FAIL → Auto-generate CAPA, request review
|
|
|
|
### 2. Code Merges to devl, Auto-flows to test
|
|
|
|
Once PR merges to devl:
|
|
```bash
|
|
# Automatic (Jenkins webhook)
|
|
git merge feature/my-fix → devl
|
|
git fetch origin
|
|
git reset --hard origin/devl # test auto-syncs
|
|
```
|
|
|
|
**Jenkins triggers:** `starforth-test` pipeline
|
|
- **Time:** 20 minutes
|
|
- **Stages:** Full test suite, benchmarks, stress tests
|
|
- **Outcome:**
|
|
- ✅ PASS → Auto-merge to qual
|
|
- ❌ FAIL → Auto-generate CAPA, revert test branch
|
|
|
|
### 3. Code in test Auto-flows to qual
|
|
|
|
```bash
|
|
# Automatic
|
|
git merge test → qual
|
|
```
|
|
|
|
**Jenkins triggers:** `starforth-qual` pipeline
|
|
- **Time:** 25 minutes
|
|
- **Stages:** Isabelle/HOL formal verification + per-defect CAPA generation
|
|
- **Outcome:**
|
|
- ✅ PASS → Notify PM "Ready for release"
|
|
- ❌ FAIL → Auto-generate CAPA per defect, revert qual branch
|
|
|
|
### 4. PM Reviews qual Results, Approves for Release
|
|
|
|
PM receives email/Slack notification:
|
|
> "StarForth QUAL PASSED - Ready for release v2.0.0"
|
|
|
|
PM reviews CAPA documents in `docs/internal/capa/`:
|
|
- CAPA-DEFECT-001-timestamp.adoc
|
|
- CAPA-DEFECT-002-timestamp.adoc
|
|
- etc.
|
|
|
|
PM clicks "Approve for Release" in Jenkins UI (input step).
|
|
|
|
**Jenkins triggers:** `starforth-prod` pipeline
|
|
- **Time:** 2 minutes
|
|
- **Stages:** Version artifacts, tag git, release
|
|
- **Outcome:**
|
|
- Creates: `starforth-amd64-fastest-2.0.0`
|
|
- Tags: `v2.0.0` in git
|
|
- Artifacts: Immutable release in GitHub Releases
|
|
|
|
### 5. Master Auto-updates (or Manual)
|
|
|
|
```bash
|
|
# Option A: Manual merge by PM
|
|
git checkout master
|
|
git merge prod
|
|
git push origin master
|
|
|
|
# Option B: Automatic via GitHub Actions/Jenkins
|
|
# (configured to auto-merge prod → master after release)
|
|
```
|
|
|
|
**MASTER STAYS CLEAN & RELEASABLE**
|
|
- Only receives merges from prod
|
|
- Protected branch - no direct commits
|
|
- Always reflects latest released version
|
|
|
|
---
|
|
|
|
## Nightly Baseline (Separate)
|
|
|
|
**Independent of PR workflow** - runs on schedule:
|
|
```
|
|
2 AM UTC daily: Jenkins nightly baseline
|
|
├─ Clones master branch
|
|
├─ Runs comprehensive: full tests, benchmarks, stress tests (1 hour)
|
|
└─ Email results to PM (rajames440@gmail.com)
|
|
```
|
|
|
|
Purpose: Trending, performance regression detection, non-blocking feedback.
|
|
|
|
---
|
|
|
|
## CAPA Process
|
|
|
|
### What is a CAPA?
|
|
|
|
**CAPA = Corrective Action & Preventive Action**
|
|
|
|
Each **CAPA represents ONE DEFECT** (code bug OR theory defect OR both).
|
|
|
|
### CAPA Lifecycle
|
|
|
|
```
|
|
Defect found in TEST or QUAL stage
|
|
↓
|
|
Auto-generate CAPA-{DEFECT-ID}-{timestamp}.adoc
|
|
↓
|
|
CAPA filed as GitHub Issue in Kanban
|
|
↓
|
|
Developer fixes defect, creates new PR
|
|
↓
|
|
New PR flows through devl → test → qual → prod → master
|
|
↓
|
|
CAPA closed when fix is proven in QUAL stage
|
|
```
|
|
|
|
### CAPA Format
|
|
|
|
```adoc
|
|
= CAPA-DEFECT-001-20250130-143000
|
|
:toc:
|
|
|
|
== Defect Metadata
|
|
- **Defect ID:** DEFECT-001
|
|
- **Found in Stage:** TEST
|
|
- **Severity:** HIGH
|
|
- **Category:** Code defect (Stack implementation)
|
|
|
|
== Description
|
|
Stack push operation fails when memory is near limit.
|
|
Causes segmentation fault on systems with <1GB free RAM.
|
|
|
|
== Impact
|
|
Any computation involving large data structures on memory-constrained systems fails.
|
|
|
|
== Root Cause
|
|
Buffer overflow in `stack_push()` at src/stack.c:142
|
|
Missing bounds check before memory allocation.
|
|
|
|
== Evidence
|
|
Build: https://jenkins.example.com/job/starforth-test/build-123
|
|
Log: [test-123-stack-overflow.log]
|
|
|
|
== Corrective Action Required
|
|
Fix bounds checking in stack_push() function.
|
|
Add integration test for memory-constrained systems.
|
|
|
|
== References
|
|
- Code: src/stack.c:142
|
|
- Theory: docs/src/internal/formal/Stack.thy (line 45)
|
|
- Test: tests/test_stack_limits.c
|
|
|
|
== Status
|
|
OPEN - Awaiting fix from devl branch
|
|
```
|
|
|
|
---
|
|
|
|
## GitHub Issue (Kanban) Integration
|
|
|
|
Each CAPA auto-creates a GitHub Issue:
|
|
|
|
```
|
|
Title: [CAPA-DEFECT-001] Stack push buffer overflow
|
|
Labels: defect, high-priority, stack
|
|
Assignee: (auto-assign to dev who triggered it)
|
|
Body: (CAPA document content)
|
|
```
|
|
|
|
PM reviews in GitHub Kanban board:
|
|
```
|
|
[To Do] → [In Progress] → [In Review] → [Done]
|
|
↑
|
|
CAPAs appear here automatically
|
|
```
|
|
|
|
---
|
|
|
|
## Jenkins Jobs Configuration
|
|
|
|
### Job: starforth-devl
|
|
**Trigger:** PR opened/updated on devl branch
|
|
**Jenkinsfile:** `jenkinsfiles/devl/Jenkinsfile`
|
|
**Timeout:** 10 minutes
|
|
**On Success:** Merge PR
|
|
**On Failure:** Request code review, auto-generate CAPA
|
|
|
|
### Job: starforth-test
|
|
**Trigger:** Push to devl (auto-sync to test)
|
|
**Jenkinsfile:** `jenkinsfiles/test/Jenkinsfile`
|
|
**Timeout:** 30 minutes
|
|
**On Success:** Auto-merge test → qual
|
|
**On Failure:** Revert test branch, auto-generate CAPA
|
|
|
|
### Job: starforth-qual
|
|
**Trigger:** Push to test (auto-sync to qual)
|
|
**Jenkinsfile:** `jenkinsfiles/qual/Jenkinsfile`
|
|
**Timeout:** 45 minutes
|
|
**On Success:** Email PM "Ready for release"
|
|
**On Failure:** Revert qual branch, auto-generate CAPA
|
|
|
|
### Job: starforth-prod
|
|
**Trigger:** Manual Jenkins input step (PM approval)
|
|
**Jenkinsfile:** `jenkinsfiles/prod/Jenkinsfile`
|
|
**Timeout:** 5 minutes
|
|
**On Success:** Tag git (v2.0.0), create GitHub Release
|
|
**On Failure:** Alert PM, don't touch master
|
|
|
|
### Job: starforth-nightly
|
|
**Trigger:** Cron `0 2 * * *` (2 AM UTC daily)
|
|
**Jenkinsfile:** `Jenkinsfile` (baseline)
|
|
**Timeout:** 2 hours
|
|
**On Complete:** Email results (success/failure)
|
|
|
|
---
|
|
|
|
## Quick Reference: Developer Workflow
|
|
|
|
```bash
|
|
# 1. Create feature branch
|
|
git checkout devl
|
|
git pull origin devl
|
|
git checkout -b feature/fix-defect-001
|
|
|
|
# 2. Make changes
|
|
vim src/stack.c
|
|
# ... edit code ...
|
|
|
|
# 3. Test locally
|
|
make test
|
|
make smoke
|
|
|
|
# 4. Commit with reference to defect
|
|
git add src/stack.c
|
|
git commit -m "Fix stack push bounds check (DEFECT-001)"
|
|
|
|
# 5. Push and create PR
|
|
git push origin feature/fix-defect-001
|
|
# Open PR on GitHub (devl ← feature/fix-defect-001)
|
|
|
|
# 6. Jenkins runs starforth-devl (5 min)
|
|
# [Watch in Jenkins UI or GitHub PR status]
|
|
|
|
# 7. If PASS → PR approved, merge
|
|
# If FAIL → Fix issues, push again
|
|
|
|
# 8. Once merged to devl:
|
|
# - Auto-syncs to test (starforth-test runs, 20 min)
|
|
# - If test PASS → Auto-syncs to qual (starforth-qual runs, 25 min)
|
|
# - If qual PASS → PM notified, manually approves for release
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### "My PR failed in devl stage - what do I do?"
|
|
|
|
1. Check Jenkins log: Build → Console Output
|
|
2. Fix the issue locally
|
|
3. `git push origin feature/my-fix` again
|
|
4. Jenkins re-runs automatically
|
|
5. Repeat until it passes
|
|
|
|
### "Test branch failed - how do I fix?"
|
|
|
|
1. Check what failed: `starforth-test` Jenkins job
|
|
2. Issue is likely a regression in devl code
|
|
3. Create new PR on devl to fix it
|
|
4. Once fixed, test will auto-sync and pass
|
|
|
|
### "Qual found defects - how do I respond?"
|
|
|
|
1. PM receives email with list of CAPAs
|
|
2. Each CAPA is a separate GitHub Issue
|
|
3. Assign them to yourself or team
|
|
4. Create PR on devl to fix each one
|
|
5. Each fix goes through the full workflow again
|
|
6. Once all fixed, qual will pass and ready for release
|
|
|
|
### "I need to rollback a release"
|
|
|
|
```bash
|
|
git checkout master
|
|
git revert v2.0.0 # Creates a new commit that undoes v2.0.0
|
|
git tag v2.0.1
|
|
git push origin master v2.0.1
|
|
# New release becomes v2.0.1 (fix of v2.0.0)
|
|
```
|
|
|
|
---
|
|
|
|
## Key Principles
|
|
|
|
1. **Devl is the source of truth** - all code goes here first
|
|
2. **Automatic flow** - code auto-merges devl → test → qual (unless it fails)
|
|
3. **Manual release gate** - only PM approves qual → prod
|
|
4. **One defect = one CAPA** - atomic tracking and fixing
|
|
5. **Master stays clean** - always releasable, only updated from prod
|
|
6. **Immutable artifacts** - released binaries tagged and archived forever
|
|
|
|
---
|
|
|
|
## Timeline Example: Releasing v2.0.0
|
|
|
|
```
|
|
Monday 9 AM: Dev commits to devl (feature/fix-defect-001)
|
|
Monday 9:05: devl pipeline runs (PASS) → merged
|
|
Monday 9:10: test pipeline auto-starts
|
|
Monday 9:30: test passes → auto-merges to qual
|
|
Monday 9:35: qual pipeline auto-starts
|
|
Monday 10:00: qual passes → PM gets email "Ready for release"
|
|
Monday 10:15: PM reviews CAPAs, clicks "Approve for Release"
|
|
Monday 10:17: prod pipeline runs
|
|
Monday 10:19: ✅ v2.0.0 tagged in git, released
|
|
Monday 10:20: master branch auto-updated
|
|
Monday 10:30: Release notes emailed to stakeholders
|
|
```
|
|
|
|
**Total time from commit to release:** ~1.5 hours (mostly waiting for pipelines)
|
|
|
|
---
|
|
|
|
## Questions?
|
|
|
|
See: `JENKINS_SETUP.md` for how to configure Jenkins
|
|
See: `CAPA_PROCESS.md` for detailed CAPA handling
|
|
See: Individual `Jenkinsfile` comments for stage details |