mirror of
https://github.com/mue/mue.git
synced 2026-06-05 23:45:53 +02:00
- Add version-bump workflow for semantic versioning across all files - Add beta-release workflow for automated pre-release testing - Add production-release workflow with manual approval gates - Add hotfix-release workflow for emergency patches - Create comprehensive CONTRIBUTING.md with workflow guide - Create detailed RELEASE_PROCESS.md for maintainers - Add PR template with release checklists - Update CODEOWNERS to protect workflow files - Update README with contribution links - Remove /docs from .gitignore to allow documentation This implements a dev beta main branching strategy with: - Automated version management across 6 files - Changelog generation from conventional commits - GitHub Releases with build artifacts - Environment-based approvals for production - Back-merge support for hotfixes
188 lines
7.6 KiB
YAML
188 lines
7.6 KiB
YAML
name: Production Release
|
|
|
|
on:
|
|
pull_request:
|
|
branches:
|
|
- main
|
|
types:
|
|
- closed
|
|
|
|
permissions:
|
|
contents: write
|
|
|
|
jobs:
|
|
# Only run if PR was merged (not just closed)
|
|
check-merge:
|
|
if: github.event.pull_request.merged == true && github.event.pull_request.head.ref == 'beta'
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
should_release: ${{ steps.check.outputs.should_release }}
|
|
steps:
|
|
- name: Check if this is a beta to main merge
|
|
id: check
|
|
run: |
|
|
echo "should_release=true" >> $GITHUB_OUTPUT
|
|
echo "✅ This is a beta → main merge, proceeding with production release" >> $GITHUB_STEP_SUMMARY
|
|
|
|
build-and-release:
|
|
needs: check-merge
|
|
if: needs.check-merge.outputs.should_release == 'true'
|
|
runs-on: ubuntu-latest
|
|
environment: production # Requires manual approval from maintainers
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
ref: main
|
|
fetch-depth: 0
|
|
|
|
- name: Setup Bun
|
|
uses: oven-sh/setup-bun@v2
|
|
with:
|
|
bun-version: '1.3.1'
|
|
|
|
- name: Install dependencies
|
|
run: bun install
|
|
|
|
- name: Build extension
|
|
run: bun run build
|
|
env:
|
|
NODE_ENV: production
|
|
|
|
- name: Get version from package.json
|
|
id: version
|
|
run: |
|
|
VERSION=$(node -p "require('./package.json').version")
|
|
# Remove any pre-release suffix for production
|
|
STABLE_VERSION=$(echo $VERSION | sed 's/-.*$//')
|
|
echo "version=$STABLE_VERSION" >> $GITHUB_OUTPUT
|
|
echo "full_version=$VERSION" >> $GITHUB_OUTPUT
|
|
echo "Building production version: $STABLE_VERSION"
|
|
|
|
- name: Generate production changelog
|
|
id: changelog
|
|
run: |
|
|
# Get the latest production (non-beta) tag
|
|
PREVIOUS_TAG=$(git tag -l 'v*' --sort=-v:refname | grep -v 'beta\|alpha\|rc' | head -n 1 || echo "")
|
|
|
|
if [ -z "$PREVIOUS_TAG" ]; then
|
|
echo "No previous production tag found, using all commits"
|
|
COMMITS=$(git log --pretty=format:"- %s (%h)" main)
|
|
else
|
|
echo "Generating changelog from $PREVIOUS_TAG to main"
|
|
COMMITS=$(git log --pretty=format:"- %s (%h)" ${PREVIOUS_TAG}..main)
|
|
fi
|
|
|
|
# Categorize commits
|
|
FEATURES=$(echo "$COMMITS" | grep -i "^- feat" || echo "")
|
|
FIXES=$(echo "$COMMITS" | grep -i "^- fix" || echo "")
|
|
PERFORMANCE=$(echo "$COMMITS" | grep -i "^- perf" || echo "")
|
|
BREAKING=$(echo "$COMMITS" | grep -i "BREAKING CHANGE" || echo "")
|
|
|
|
{
|
|
echo "changelog<<EOF"
|
|
if [ -n "$BREAKING" ]; then
|
|
echo "### ⚠️ Breaking Changes"
|
|
echo "$BREAKING"
|
|
echo ""
|
|
fi
|
|
if [ -n "$FEATURES" ]; then
|
|
echo "### ✨ New Features"
|
|
echo "$FEATURES"
|
|
echo ""
|
|
fi
|
|
if [ -n "$FIXES" ]; then
|
|
echo "### 🐛 Bug Fixes"
|
|
echo "$FIXES"
|
|
echo ""
|
|
fi
|
|
if [ -n "$PERFORMANCE" ]; then
|
|
echo "### ⚡ Performance Improvements"
|
|
echo "$PERFORMANCE"
|
|
fi
|
|
echo "EOF"
|
|
} >> $GITHUB_OUTPUT
|
|
|
|
- name: Check if tag exists
|
|
id: check_tag
|
|
run: |
|
|
if git rev-parse "v${{ steps.version.outputs.version }}" >/dev/null 2>&1; then
|
|
echo "exists=true" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "exists=false" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Create production tag
|
|
if: steps.check_tag.outputs.exists == 'false'
|
|
run: |
|
|
git config user.name "github-actions[bot]"
|
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
git tag -a "v${{ steps.version.outputs.version }}" -m "Release v${{ steps.version.outputs.version }}"
|
|
git push origin "v${{ steps.version.outputs.version }}"
|
|
|
|
- name: Create GitHub Release
|
|
run: |
|
|
RELEASE_NOTES=$(cat <<EOF
|
|
## 🎉 Mue v${{ steps.version.outputs.version }}
|
|
|
|
${{ steps.changelog.outputs.changelog }}
|
|
|
|
### 📦 Installation
|
|
|
|
**Browser Extensions:**
|
|
- **Chrome**: [Chrome Web Store](https://chromewebstore.google.com/detail/mue/bngmbednanpcfochchhgbkookpiaiaid)
|
|
- **Edge**: [Edge Add-ons](https://microsoftedge.microsoft.com/addons/detail/mue/aepnglgjfokepefimhbnibfjekidhmja)
|
|
- **Firefox**: [Firefox Add-ons](https://addons.mozilla.org/en-GB/firefox/addon/mue/)
|
|
|
|
**Manual Installation:**
|
|
- Download the appropriate ZIP file below
|
|
- Chrome/Edge: Load unpacked extension from extracted folder
|
|
- Firefox: Install from about:debugging → Load Temporary Add-on
|
|
|
|
### 🔗 Links
|
|
- **Demo**: [demo.muetab.com](https://demo.muetab.com)
|
|
- **Changelog**: [muetab.com/blog/changelog](https://muetab.com/blog/changelog)
|
|
- **Documentation**: [github.com/mue/mue](https://github.com/mue/mue)
|
|
|
|
---
|
|
|
|
### 📝 Build Information
|
|
- **Version**: ${{ steps.version.outputs.version }}
|
|
- **Build Date**: $(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
|
- **Commit**: ${{ github.sha }}
|
|
EOF
|
|
)
|
|
|
|
gh release create "v${{ steps.version.outputs.version }}" \
|
|
"build/chrome-${{ steps.version.outputs.version }}.zip" \
|
|
"build/firefox-${{ steps.version.outputs.version }}.zip" \
|
|
--title "Mue v${{ steps.version.outputs.version }}" \
|
|
--notes "$RELEASE_NOTES" \
|
|
--latest
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
|
|
- name: Output success summary
|
|
run: |
|
|
echo "## 🚀 Production Release Published!" >> $GITHUB_STEP_SUMMARY
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "**Version**: v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
|
echo "**Release URL**: https://github.com/${{ github.repository }}/releases/tag/v${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "### 📦 Build Artifacts" >> $GITHUB_STEP_SUMMARY
|
|
echo "- Chrome/Edge: \`chrome-${{ steps.version.outputs.version }}.zip\`" >> $GITHUB_STEP_SUMMARY
|
|
echo "- Firefox: \`firefox-${{ steps.version.outputs.version }}.zip\`" >> $GITHUB_STEP_SUMMARY
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "### ⚠️ Manual Steps Required" >> $GITHUB_STEP_SUMMARY
|
|
echo "1. Go to [GitHub Actions](https://github.com/${{ github.repository }}/actions/workflows/submit.yml)" >> $GITHUB_STEP_SUMMARY
|
|
echo "2. Click 'Run workflow'" >> $GITHUB_STEP_SUMMARY
|
|
echo "3. Enter tag: \`${{ steps.version.outputs.version }}\`" >> $GITHUB_STEP_SUMMARY
|
|
echo "4. Click 'Run workflow' to submit to Chrome/Firefox/Edge stores" >> $GITHUB_STEP_SUMMARY
|
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
echo "### 📢 Post-Release Checklist" >> $GITHUB_STEP_SUMMARY
|
|
echo "- [ ] Submit to browser stores (see manual steps above)" >> $GITHUB_STEP_SUMMARY
|
|
echo "- [ ] Update [muetab.com/blog/changelog](https://muetab.com/blog/changelog)" >> $GITHUB_STEP_SUMMARY
|
|
echo "- [ ] Announce release on Discord/social media" >> $GITHUB_STEP_SUMMARY
|
|
echo "- [ ] Monitor issue tracker for bug reports" >> $GITHUB_STEP_SUMMARY
|
|
echo "- [ ] Merge \`main\` back to \`beta\` and \`dev\` to sync version" >> $GITHUB_STEP_SUMMARY
|