Release Process Documentation
March 1, 2026 · View on GitHub
This document describes the automated release process for the Azure DevOps Integration extension.
Overview
The release process is fully automated using GitHub Actions workflows. When code is merged to the main branch, the following happens automatically:
- Version Bumping: Analyzes commit messages and bumps the version
- Changelog Update: Automatically updates CHANGELOG.md
- Tag Creation: Creates a git tag for the new version
- Release Creation: Creates a GitHub release with VSIX package
- Marketplace Publishing: Publishes to VS Code Marketplace (if configured)
Automated Workflows
1. CI Workflow (.github/workflows/ci.yml)
Trigger: Push to main branch or Pull Request
Jobs:
- build-and-test: Runs linting, builds, and tests
- release-check: Validates release readiness (scoring system)
- integration-tests: Runs integration tests
- version-bump-and-tag: Automatically bumps version and creates tags
Version Bumping Logic
The automation follows Conventional Commits to determine version bumps:
| Commit Type | Version Bump | Example |
|---|---|---|
feat: or feat(scope): | Minor (x.Y.0) | feat: add new feature |
fix: or fix(scope): | Patch (x.y.Z) | fix: resolve bug |
BREAKING CHANGE: in body or ! in type | Major (X.0.0) | feat!: breaking change |
docs:, chore:, style:, etc. | Patch (x.y.Z) | docs: update readme |
Special Rules:
- VS Code Convention: Minor versions are always even numbers for releases
- If bump would result in odd minor version, it's incremented to next even number
- Example:
1.3.0→1.4.0instead of1.3.0
- Major Bumps: Only applied if current version >= 1.0.0 and explicit BREAKING CHANGE marker present
- Pre-1.0.0: BREAKING CHANGE bumps minor version, not major
Release Readiness Scoring
The release-check job validates quality with a 100-point scoring system:
| Category | Points | Requirement |
|---|---|---|
| Unit Tests | 20 | All tests must pass |
| Code Coverage | 50 | Lines: 85%, Branches: 80%, Functions: 80% |
| Linting | 10 | No linting errors |
| Type Checking | 5 | No TypeScript errors |
| Documentation | 5 | README, CHANGELOG, CONTRIBUTING exist |
| Security | 10 | No critical/high vulnerabilities |
Minimum Score: 30/100 to proceed with release
2. Release Workflow (.github/workflows/release.yml)
Trigger: Push of version tags (e.g., v3.0.6)
Jobs:
- verify-release: Ensures tag is on main branch
- build-package-and-publish: Builds, packages, and publishes
Steps:
- Checkout code at tagged commit
- Install dependencies (
npm ci) - Build extension (
npm run build) - Create VSIX package (
npm run package:vsix) - Create GitHub Release with:
- Release title:
Release v{version} - Release body: Link to CHANGELOG.md
- Attached file:
azuredevops-integration-extension-{version}.vsix
- Release title:
- Publish to VS Code Marketplace (if
VSCE_TOKENsecret exists)
3. Fix Missing Tag Workflow (.github/workflows/fix-missing-tag.yml)
Trigger: Manual workflow dispatch
Purpose: Recovery mechanism for when automated tagging fails
Inputs:
version: Version tag to create (e.g.,3.0.6)commit_sha: Commit SHA to tag
Use Case: If the CI workflow creates a release commit but tag push fails
How to Release
Normal Release (Automated)
-
Create Feature Branch:
git checkout -b feature/my-feature -
Make Changes: Implement your feature/fix
-
Commit with Conventional Commits:
# For new features (minor bump) git commit -m "feat: add new time tracking feature" # For bug fixes (patch bump) git commit -m "fix: resolve timer sync issue" # For breaking changes (major bump, if version >= 1.0.0) git commit -m "feat!: redesign API BREAKING CHANGE: The old API is no longer supported" -
Push and Create PR:
git push origin feature/my-feature -
Merge PR: When PR is merged to
main, automation takes over:- CI runs build, tests, and quality checks
- Version is bumped based on commits
- CHANGELOG.md is updated
- Release commit is created
- Tag is created and pushed
- Release workflow is triggered
- GitHub release is created
- Extension is published to marketplace
Emergency/Manual Release
If automated release fails, use the manual recovery workflow:
-
Identify the Release Commit:
git log --oneline | grep "chore(release)" -
Run Manual Workflow:
- Go to Actions → "Fix Missing Release Tag"
- Click "Run workflow"
- Enter version (e.g.,
3.0.6) - Enter commit SHA
- Click "Run workflow"
-
Verify: Check that release is created
Required Secrets
For full automation, configure these GitHub secrets:
| Secret | Required | Purpose |
|---|---|---|
GITHUB_TOKEN | Yes (auto-provided) | Creating releases, pushing tags |
VSCE_TOKEN | No | Publishing to VS Code Marketplace |
Getting VSCE_TOKEN
To publish to VS Code Marketplace:
- Create a Personal Access Token at https://dev.azure.com
- Organization: Select your publisher organization
- Expiration: Set appropriate expiration
- Scopes: Select "Marketplace (Publish)"
- Add token to GitHub Secrets as
VSCE_TOKEN
Workflow Permissions
The workflows require these GitHub permissions (configured in workflow files):
permissions:
contents: write # For creating tags and releases
id-token: write # For OIDC token authentication (package publishing)
issues: write # For creating failure notifications
packages: write # For publishing to GitHub Packages
Changelog Management
CHANGELOG.md is automatically updated by the update-changelog.js script:
Commit Categories:
feat:→ "### Added"fix:→ "### Fixed"refactor:,style:→ "### Changed"docs:→ "### Documentation"test:,chore:→ "### Developer Experience"- Others → "### Other"
Format:
## [version] - YYYY-MM-DD
### Added
- New feature description
### Fixed
- Bug fix description
Troubleshooting
Release Not Created
Symptom: Commit merged but no release appeared
Checks:
-
Check if release commit was created:
git log --oneline | grep "chore(release)" -
Check if tag exists:
git tag -l | grep v3.0 -
Check GitHub Actions logs
Solution: Use the "Fix Missing Tag" workflow
Tag Exists But No Release
Symptom: Tag exists but GitHub release missing
Checks:
- Check Release workflow logs
- Verify tag is on main branch:
git branch --contains <tag-name>
Solution: Delete and recreate tag (if not on main), or manually create release
Marketplace Publish Failed
Symptom: GitHub release created but not on marketplace
Checks:
- Verify
VSCE_TOKENsecret exists and is valid - Check Release workflow logs for publish step
- Verify publisher name matches in package.json
Solution:
- Update VSCE_TOKEN if expired
- Manually publish:
vsce publish --packagePath <vsix-file> --pat <token>
Version Strategy
Current version: 3.0.6
Versioning Scheme: MAJOR.MINOR.PATCH
- MAJOR (3): Incremented for breaking changes (rare, currently frozen at 3)
- MINOR (0, 2, 4, ...): New features (always even for releases)
- PATCH (0-9): Bug fixes and minor improvements
Example Progression:
3.0.6→3.0.7(patch: bug fix)3.0.7→3.2.0(minor: new feature, skipping odd 1)3.2.0→4.0.0(major: breaking change, only if version >= 1.0.0)
Testing the Release Process
To test without triggering a real release:
-
Test Build Locally:
npm run build npm run package:vsix -
Test Release Check:
npm run release-check -
Test in Fork: Create a fork and test full workflow there
Monitoring
Monitor releases through:
- GitHub Actions: https://github.com/plures/azuredevops-integration-extension/actions
- Releases Page: https://github.com/plures/azuredevops-integration-extension/releases
- Marketplace: Search for "Azure DevOps Integration" in VS Code
Best Practices
- Always use conventional commits for clear version bumping
- Keep CHANGELOG manually curated for major releases
- Test VSIX locally before expecting marketplace publish
- Monitor first few automated releases after setup changes
- Document breaking changes clearly in commit messages
- Use PR descriptions to document changes for CHANGELOG
Related Documentation
- MISSING_RELEASE_FIX.md - Recovery from failed releases
- CONTRIBUTING.md - Contribution guidelines
- CHANGELOG.md - Version history