Dev/QA Iteration Workflow
Learn the recommended workflow for rapid development and QA iteration using SNAPSHOT versions
This guide explains the recommended workflow for rapid development and QA iteration using Odin's versioning system.
Workflow Overview
Odin supports two versioning strategies:
- SNAPSHOT - Mutable versions for dev/QA (e.g.,
1.0.0-SNAPSHOT) - CONCRETE - Immutable versions for production (e.g.,
1.0.0)
The typical workflow:
- Develop: Create and deploy SNAPSHOT version
- Iterate: Make changes and redeploy same SNAPSHOT version
- Test in QA: QA team tests the SNAPSHOT version
- Release: Create CONCRETE version when ready
- Deploy to Production: Deploy the immutable CONCRETE version
SNAPSHOT Versions
SNAPSHOT versions are mutable and designed for fast iteration:
{
"name": "user-api",
"version": "1.2.0-SNAPSHOT",
"team": "backend",
"components": [...]
} Characteristics:
- Can be redeployed with changes
- No versioning history kept
- Perfect for development and QA
- Not allowed in production environments
Rapid Iteration
Initial deployment:
odin deploy service --env dev \
--file service.json \
--provisioning provisioning-dev.json Make changes and redeploy:
# Edit service.json
# Then redeploy with same version
odin deploy service --env dev \
--file service.json \
--provisioning provisioning-dev.json QA Testing
Deploy to QA environment:
odin deploy service --env qa \
--file service.json \
--provisioning provisioning-qa.json QA team can test the SNAPSHOT version. If issues are found:
- Fix issues in dev environment
- Redeploy same SNAPSHOT to QA
- Repeat until stable
Releasing CONCRETE Versions
Once testing is complete, release a CONCRETE version:
# Update version in service.json
# Remove -SNAPSHOT suffix
{
"name": "user-api",
"version": "1.2.0",
...
} Deploy to production:
odin deploy service --env production \
--file service.json \
--provisioning provisioning-prod.json Best Practices
- Use SNAPSHOT for development: Fast iteration without version bumps
- Test thoroughly in QA: Multiple SNAPSHOT redeployments are fine
- Release CONCRETE for production: Guarantees reproducibility
- Semantic versioning: Follow
major.minor.patchformat - Environment-specific provisioning: Different configs for dev, QA, prod
Example Workflow
1. Develop (dev environment)
# Create service with SNAPSHOT version
odin deploy service --env dev \
--file service.json \
--provisioning provisioning-dev.json
# Make changes, redeploy
odin deploy service --env dev \
--file service.json \
--provisioning provisioning-dev.json 2. Test (QA environment)
# Deploy same SNAPSHOT to QA
odin deploy service --env qa \
--file service.json \
--provisioning provisioning-qa.json
# If bugs found, fix and redeploy to QA
odin deploy service --env qa \
--file service.json \
--provisioning provisioning-qa.json 3. Release (production)
# Change version to CONCRETE in service.json
# "version": "1.2.0-SNAPSHOT" -> "version": "1.2.0"
# Deploy to production
odin deploy service --env production \
--file service.json \
--provisioning provisioning-prod.json