Implement qrun rollback command #42

Open
opened 2026-01-03 23:45:15 +00:00 by KofTwentyTwo · 0 comments
KofTwentyTwo commented 2026-01-03 23:45:15 +00:00 (Migrated from github.com)

Part of #13

User Story

As a developer, I want to quickly rollback to a previous version so that I can recover from a bad deployment without rebuilding.

Design

Command Interface

# Rollback to previous version
qrun rollback --env prod

# Rollback to specific version
qrun rollback --env prod --version 1.2.2

# Rollback with confirmation
qrun rollback --env prod --confirm

# Show rollback candidates
qrun rollback --env prod --list

Rollback Workflow

1. Query Voyage for deployment history
2. Identify rollback target (previous or specified)
3. Confirm with user (unless --confirm)
4. Create new deployment with old artifact
5. Monitor deployment
6. Report success/failure

List Output

$ qrun rollback --env prod --list

Deployment history for prod:
  v1.2.3 (current) - deployed 2h ago by james@example.com
  v1.2.2           - deployed 1d ago by james@example.com
  v1.2.1           - deployed 3d ago by ci@example.com
  v1.2.0           - deployed 7d ago by ci@example.com

Use: qrun rollback --env prod --version <version>

Confirmation Prompt

$ qrun rollback --env prod

Rolling back prod from v1.2.3 to v1.2.2

Current:  v1.2.3 (deployed 2h ago)
Target:   v1.2.2 (deployed 1d ago)
Reason:   [Enter reason or press Enter to skip]: Bug in login flow

Proceed with rollback? [y/N]: y

Rolling back...
  Creating deployment... ✓
  Waiting for pods... ✓
  Health check... ✓

Rollback complete!
  Version: 1.2.2
  Time: 45s

Voyage API

GET /v1/apps/{app}/deployments?env=prod
→ Returns deployment history

POST /v1/deployments
{
  "artifactId": "art_old",
  "environment": "prod",
  "rollbackFrom": "dep_current",
  "reason": "Bug in login flow"
}

Files to Create/Modify

File Action Description
RollbackCommand.java Create Main rollback command
DeploymentHistory.java Create Deployment history model
RollbackConfirmation.java Create Interactive confirmation
VoyageClient.java Modify Add history endpoint

Implementation Tasks

  • Create RollbackCommand with Picocli annotations
  • Implement --list to show deployment history
  • Implement --version to specify target
  • Implement automatic previous version detection
  • Create interactive confirmation prompt
  • Implement --confirm to skip prompt
  • Add --reason option for audit trail
  • Implement rollback via Voyage API
  • Monitor deployment after rollback
  • Handle rollback failures gracefully
  • Prevent rollback to non-existent version
  • Add timeout for deployment monitoring
  • Add unit tests for rollback logic

Acceptance Criteria

  • qrun rollback --env prod rolls back to previous
  • --version allows specific version selection
  • --list shows deployment history
  • Confirmation required unless --confirm
  • Reason captured for audit trail
  • Rollback completes within 2 minutes
  • Clear error if no previous version exists
  • Deployment status monitored after rollback
Part of #13 ## User Story As a **developer**, I want to quickly rollback to a previous version so that I can recover from a bad deployment without rebuilding. ## Design ### Command Interface ```bash # Rollback to previous version qrun rollback --env prod # Rollback to specific version qrun rollback --env prod --version 1.2.2 # Rollback with confirmation qrun rollback --env prod --confirm # Show rollback candidates qrun rollback --env prod --list ``` ### Rollback Workflow ``` 1. Query Voyage for deployment history 2. Identify rollback target (previous or specified) 3. Confirm with user (unless --confirm) 4. Create new deployment with old artifact 5. Monitor deployment 6. Report success/failure ``` ### List Output ```bash $ qrun rollback --env prod --list Deployment history for prod: v1.2.3 (current) - deployed 2h ago by james@example.com v1.2.2 - deployed 1d ago by james@example.com v1.2.1 - deployed 3d ago by ci@example.com v1.2.0 - deployed 7d ago by ci@example.com Use: qrun rollback --env prod --version <version> ``` ### Confirmation Prompt ```bash $ qrun rollback --env prod Rolling back prod from v1.2.3 to v1.2.2 Current: v1.2.3 (deployed 2h ago) Target: v1.2.2 (deployed 1d ago) Reason: [Enter reason or press Enter to skip]: Bug in login flow Proceed with rollback? [y/N]: y Rolling back... Creating deployment... ✓ Waiting for pods... ✓ Health check... ✓ Rollback complete! Version: 1.2.2 Time: 45s ``` ### Voyage API ``` GET /v1/apps/{app}/deployments?env=prod → Returns deployment history POST /v1/deployments { "artifactId": "art_old", "environment": "prod", "rollbackFrom": "dep_current", "reason": "Bug in login flow" } ``` ## Files to Create/Modify | File | Action | Description | |------|--------|-------------| | `RollbackCommand.java` | Create | Main rollback command | | `DeploymentHistory.java` | Create | Deployment history model | | `RollbackConfirmation.java` | Create | Interactive confirmation | | `VoyageClient.java` | Modify | Add history endpoint | ## Implementation Tasks - [ ] Create `RollbackCommand` with Picocli annotations - [ ] Implement `--list` to show deployment history - [ ] Implement `--version` to specify target - [ ] Implement automatic previous version detection - [ ] Create interactive confirmation prompt - [ ] Implement `--confirm` to skip prompt - [ ] Add `--reason` option for audit trail - [ ] Implement rollback via Voyage API - [ ] Monitor deployment after rollback - [ ] Handle rollback failures gracefully - [ ] Prevent rollback to non-existent version - [ ] Add timeout for deployment monitoring - [ ] Add unit tests for rollback logic ## Acceptance Criteria - [ ] `qrun rollback --env prod` rolls back to previous - [ ] `--version` allows specific version selection - [ ] `--list` shows deployment history - [ ] Confirmation required unless `--confirm` - [ ] Reason captured for audit trail - [ ] Rollback completes within 2 minutes - [ ] Clear error if no previous version exists - [ ] Deployment status monitored after rollback
Sign in to join this conversation.