1+ name : Create Release on PR Merge
2+
3+ on :
4+ pull_request :
5+ types :
6+ - closed
7+ branches :
8+ - master # Change to your default branch if different (e.g., master)
9+ workflow_dispatch :
10+
11+ jobs :
12+ create_release :
13+ # Only run when PR is merged (not when just closed)
14+ if : github.event.pull_request.merged == true
15+ runs-on : ubuntu-latest
16+ permissions :
17+ contents : write # Needed for creating releases
18+ steps :
19+ - name : Checkout code
20+ uses : actions/checkout@v3
21+ with :
22+ fetch-depth : 0 # Fetch all history for proper versioning and commit messages
23+
24+ - name : Get latest release version
25+ id : get_version
26+ run : |
27+ # Get latest tag or set to v0.0.0 if none exists
28+ LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
29+ echo "LATEST_TAG=${LATEST_TAG}" >> $GITHUB_ENV
30+
31+ # Extract version numbers
32+ MAJOR=$(echo $LATEST_TAG | sed 's/v\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/')
33+ MINOR=$(echo $LATEST_TAG | sed 's/v\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/')
34+ PATCH=$(echo $LATEST_TAG | sed 's/v\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/')
35+
36+ # Check PR labels to determine which version to increment
37+ if [[ "${{ contains(github.event.pull_request.labels.*.name, 'major') }}" == "true" ]]; then
38+ echo "Incrementing MAJOR version due to 'major' label"
39+ MAJOR=$((MAJOR + 1))
40+ MINOR=0
41+ PATCH=0
42+ elif [[ "${{ contains(github.event.pull_request.labels.*.name, 'minor') }}" == "true" ]]; then
43+ echo "Incrementing MINOR version due to 'minor' label"
44+ MINOR=$((MINOR + 1))
45+ PATCH=0
46+ else
47+ echo "Incrementing PATCH version (default)"
48+ PATCH=$((PATCH + 1))
49+ fi
50+
51+ NEW_TAG="v$MAJOR.$MINOR.$PATCH"
52+ echo "Bumping version from $LATEST_TAG to $NEW_TAG"
53+ echo "NEW_TAG=${NEW_TAG}" >> $GITHUB_ENV
54+
55+ - name : Generate Release Notes
56+ id : release_notes
57+ run : |
58+ # Get commits since last tag
59+ echo "Generating commit list since $LATEST_TAG"
60+ COMMITS=$(git log --pretty=format:"- %s (%h)" ${{ env.LATEST_TAG }}..HEAD)
61+
62+ # Extract PR details
63+ PR_TITLE="${{ github.event.pull_request.title }}"
64+ PR_NUMBER="${{ github.event.pull_request.number }}"
65+ PR_BODY="${{ github.event.pull_request.body }}"
66+ PR_USER="${{ github.event.pull_request.merged_by.login }}"
67+
68+ # Save release notes to environment variable
69+ echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
70+ echo "## Release ${{ env.NEW_TAG }}" >> $GITHUB_ENV
71+ echo "" >> $GITHUB_ENV
72+ echo "### 🔄 Pull Request" >> $GITHUB_ENV
73+ echo "- #$PR_NUMBER: $PR_TITLE" >> $GITHUB_ENV
74+ echo "- Merged by @$PR_USER" >> $GITHUB_ENV
75+ echo "" >> $GITHUB_ENV
76+
77+ if [[ -n "$PR_BODY" ]]; then
78+ echo "### 📝 Description" >> $GITHUB_ENV
79+ echo "$PR_BODY" >> $GITHUB_ENV
80+ echo "" >> $GITHUB_ENV
81+ fi
82+
83+ echo "### 📦 Changes" >> $GITHUB_ENV
84+ echo "$COMMITS" >> $GITHUB_ENV
85+ echo "EOF" >> $GITHUB_ENV
86+
87+ - name : Create Release
88+ uses : softprops/action-gh-release@v1
89+ with :
90+ tag_name : ${{ env.NEW_TAG }}
91+ name : Release ${{ env.NEW_TAG }}
92+ body : ${{ env.RELEASE_NOTES }}
93+ draft : false # Set to true if you want to review before publishing
94+ prerelease : false # Set to true for pre-releases
95+ # If you have build artifacts to include, uncomment and modify this:
96+ # files: |
97+ # dist/*.zip
98+ # dist/*.tar.gz
99+ env :
100+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
101+
102+ - name : Output Results
103+ run : |
104+ echo "::notice::🎉 Created release ${{ env.NEW_TAG }} from PR #${{ github.event.pull_request.number }}"
0 commit comments