This document describes how to create a new release of the Deploy Forge plugin using the automated GitHub Actions workflow.
To release version 1.2.0:
# 1. Update version in plugin file
# Edit deploy-forge.php: Version: 1.2.0
# 2. Update CHANGELOG.md
# Add section: ## [1.2.0] - 2024-11-21
# 3. Commit changes
git add deploy-forge.php CHANGELOG.md
git commit -m "Bump version to 1.2.0"
git push origin main
# 4. Create and push tag (THIS triggers the release)
git tag v1.2.0
git push origin v1.2.0That's it! GitHub Actions will automatically:
- ✅ Build the production ZIP
- ✅ Create a GitHub Release
- ✅ Attach the ZIP as a downloadable asset
- ✅ Notify the update server
- ✅ Make the update available to WordPress sites
We follow Semantic Versioning: MAJOR.MINOR.PATCH
MAJOR version (1.0.0 → 2.0.0):
- Breaking changes that affect existing functionality
- Removed features or public APIs
- Changed behavior that requires user action
- Incompatible API changes
Examples:
- Removing a hook that other plugins depend on
- Changing database schema in incompatible way
- Requiring higher PHP/WordPress version
- Restructuring plugin files/classes
MINOR version (1.0.0 → 1.1.0):
- New features added (backwards-compatible)
- Enhanced existing functionality
- New hooks/filters/APIs added
- Deprecated features (but not removed)
Examples:
- Adding new admin settings page
- New deployment options
- Additional GitHub integrations
- Performance improvements
PATCH version (1.0.0 → 1.0.1):
- Bug fixes
- Security patches
- Small improvements
- Documentation updates
Examples:
- Fixed webhook signature validation bug
- Corrected typos in admin interface
- Improved error messages
- Updated translations
Edit deploy-forge.php:
/**
* Plugin Name: Deploy Forge
* Plugin URI: https://getdeployforge.com
* Description: Automates theme deployment from GitHub repositories using GitHub Actions
* Version: 1.2.0 ← UPDATE THIS
* Author: Deploy Forge
* Author URI: https://getdeployforge.com
*/Add a new section for your version:
## [1.2.0] - 2024-11-21
### Added
- New feature: Scheduled deployments
- Support for deployment notifications via email
### Fixed
- Bug where webhook timeouts caused failed deployments
- Memory leak in deployment status polling
### Changed
- Improved admin UI performance
- Updated dependencies to latest versions
Changelog Tips:
- Use categories: Added, Changed, Deprecated, Removed, Fixed, Security
- Write from user perspective (not technical implementation)
- Link issues/PRs if applicable
- Be concise but descriptive
Before releasing, ensure:
- Plugin works correctly with updated version
- No console errors or PHP warnings
- All features work as expected
- Database migrations run successfully (if any)
- Settings are preserved (if structure changed)
# Stage the version changes
git add deploy-forge.php CHANGELOG.md
# Commit with clear message
git commit -m "chore: bump version to 1.2.0"
# Push to main branch
git push origin mainNote: This push does NOT trigger a release. Only the tag does.
# Create annotated tag (recommended)
git tag -a v1.2.0 -m "Release version 1.2.0"
# Or lightweight tag (simpler)
git tag v1.2.0
# Push the tag (THIS TRIGGERS THE RELEASE)
git push origin v1.2.0Important:
- Tag must start with
v(e.g.,v1.2.0, not1.2.0) - Tag must match version in plugin file exactly
- Tag must follow semantic versioning format
Once you push the tag, GitHub Actions will:
- Validate the tag format
- Verify version in plugin file matches tag
- Build the production ZIP (excluding dev files)
- Extract changelog for this version
- Create GitHub Release
- Upload ZIP as release asset
- Notify update server (if configured)
Monitor the workflow:
- Go to the repository's Actions tab
- Click on the "Release Plugin" workflow
- Watch the progress in real-time
After the workflow completes:
-
Check GitHub Releases:
- Go to the repository's Releases page
- Verify your release appears with:
- Correct version number
- ZIP file attached
- Changelog displayed
- Release notes generated
-
Verify R2 Manifest:
# Check R2 manifest has the new version curl https://updates.getdeployforge.com/manifest.json | jq .
Should return:
{ "version": "1.2.0", "download_url": "https://updates.getdeployforge.com/deploy-forge-1.2.0.zip", ... }
See .distignore for the complete list. Key exclusions:
.gitand.githubdirectories- Development tools (
.vscode,.claude, etc.) - Build artifacts (
build/,dist/,node_modules/) - Documentation (
spec/,TESTING-*.md, etc.) - CI/CD files
- Test files
The workflow performs these validations:
- Tag Format: Must be
v*.*.*(e.g., v1.0.0) - Version Match: Tag must match version in
deploy-forge.php - No Pre-release Tags: Ignores tags like
v1.0.0-beta,v1.0.0-rc1
If any validation fails, the workflow stops and shows an error.
The workflow automatically extracts changelog from CHANGELOG.md:
- Looks for section:
## [1.2.0] - Extracts content until next version header
- Includes in GitHub Release description
- Falls back to generic message if not found
Problem: Version in deploy-forge.php doesn't match git tag.
Solution:
# Fix the version in deploy-forge.php
# Then update the tag:
git add deploy-forge.php
git commit -m "Fix version to 1.2.0"
git push origin main
# Move the tag
git tag -f v1.2.0
git push -f origin v1.2.0Problem: Tag doesn't follow semantic versioning.
Solution: Delete and recreate tag with correct format:
# Delete incorrect tag
git tag -d 1.2.0 # wrong format
git push origin :refs/tags/1.2.0
# Create correct tag
git tag v1.2.0 # correct format (with v prefix)
git push origin v1.2.0Problem: Pushed tag but no workflow ran.
Check:
- Did you push the tag?
git push origin v1.2.0 - Is tag format correct? Must be
v*.*.* - Is it a pre-release tag? (
-beta,-rcare ignored) - Check GitHub Actions tab for errors
Problem: Build script failed.
Solution:
- Check workflow logs in GitHub Actions
- Test build locally:
bash build.sh - Fix any errors
- Commit fixes and re-tag
Problem: WordPress sites not seeing update.
Check:
- Verify manifest is updated:
curl https://updates.getdeployforge.com/manifest.json | jq .version - Are R2 secrets configured in GitHub? (
CLOUDFLARE_R2_ACCESS_KEY_ID, etc.) - Check the GitHub Actions release workflow logs for R2 upload errors
- WordPress caches update checks — sites will pick up new versions within 6 hours
- To test immediately, delete the
deploy_forge_plugin_updatetransient from the site's database
For beta/RC releases, use tags with suffixes:
# Beta releases
git tag v1.2.0-beta.1
git push origin v1.2.0-beta.1
# Release candidates
git tag v1.2.0-rc.1
git push origin v1.2.0-rc.1
# Alpha releases
git tag v1.2.0-alpha.1
git push origin v1.2.0-alpha.1Note: These will NOT trigger the automated release workflow (intentionally ignored).
To release a pre-release version, you would need to:
- Manually create the release in GitHub UI
- Or modify the workflow to include pre-release tags
If you need to create a release manually:
# 1. Build the plugin
bash build.sh
# 2. Create GitHub Release via CLI
gh release create v1.2.0 \
dist/deploy-forge-1.2.0.zip \
--title "Version 1.2.0" \
--notes "See CHANGELOG.md for details"- Always update CHANGELOG.md before releasing
- Test locally before tagging
- Use semantic versioning consistently
- Write clear commit messages for version bumps
- Monitor GitHub Actions for workflow success
- Verify downloads work after release
- Keep version numbers in sync across all files
- Tag from main branch only
- Never force push tags to main (creates confusion)
- Document breaking changes prominently in CHANGELOG
If a release has issues:
# Fix the issue
# Bump to next patch version (e.g., 1.2.0 → 1.2.1)
# Follow normal release process- Go to Releases page
- Click "Edit" on problematic release
- Click "Delete this release"
- Delete the tag:
git push origin :refs/tags/v1.2.0
Note: WordPress sites that already downloaded won't rollback automatically.
- Check the GitHub Actions workflow
- Review the build script
- See CHANGELOG.md for examples