1+ name : Release
2+
3+ on :
4+ push :
5+ tags :
6+ - ' v*'
7+
8+ permissions :
9+ contents : write
10+
11+ jobs :
12+ release :
13+ runs-on : ubuntu-latest
14+ steps :
15+ - name : Checkout code
16+ uses : actions/checkout@v6
17+ with :
18+ fetch-depth : 0
19+
20+ - name : Extract tag name
21+ id : tag
22+ run : echo "TAG_NAME=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"
23+
24+ - name : Extract changelog for this version
25+ id : changelog
26+ run : |
27+ # Extract the current version's changelog
28+ TAG="${{ steps.tag.outputs.TAG_NAME }}"
29+ TAG_WITHOUT_V="${TAG#v}"
30+
31+ # Create a temporary file for the changelog content
32+ CHANGELOG_FILE="changelog_content.md"
33+
34+ # Extract content between the current version and the next version header
35+ # This handles different possible formats: ## [x.y.z], ## x.y.z, ### [x.y.z], ### x.y.z
36+ awk -v ver="$TAG_WITHOUT_V" '
37+ BEGIN { found = 0; }
38+ $0 ~ "^#{2,3} \\[?" ver "\\]?" { found = 1; next; }
39+ /^#{2,3} \[?[0-9]+\.[0-9]+\.[0-9]+\]?/ { if (found) exit; }
40+ found { print; }
41+ ' CHANGELOG.md > "$CHANGELOG_FILE"
42+
43+ # If no content found with version without 'v', try with 'v'
44+ if [ ! -s "$CHANGELOG_FILE" ]; then
45+ awk -v ver="$TAG" '
46+ BEGIN { found = 0; }
47+ $0 ~ "^#{2,3} \\[?" ver "\\]?" { found = 1; next; }
48+ /^#{2,3} \[?v?[0-9]+\.[0-9]+\.[0-9]+\]?/ { if (found) exit; }
49+ found { print; }
50+ ' CHANGELOG.md > "$CHANGELOG_FILE"
51+ fi
52+
53+ # If still no content, use a default message
54+ if [ ! -s "$CHANGELOG_FILE" ]; then
55+ echo "No changelog entry found for version $TAG" > "$CHANGELOG_FILE"
56+ echo ""
57+ echo "Please check CHANGELOG.md for updates." >> "$CHANGELOG_FILE"
58+ fi
59+
60+ # Set the output
61+ {
62+ echo 'CHANGELOG_CONTENT<<EOF'
63+ cat "$CHANGELOG_FILE"
64+ echo 'EOF'
65+ } >> "$GITHUB_OUTPUT"
66+
67+ - name : Create Release
68+ uses : softprops/action-gh-release@v2
69+ with :
70+ tag_name : ${{ steps.tag.outputs.TAG_NAME }}
71+ name : ${{ steps.tag.outputs.TAG_NAME }}
72+ body : ${{ steps.changelog.outputs.CHANGELOG_CONTENT }}
73+ draft : false
74+ prerelease : ${{ contains(steps.tag.outputs.TAG_NAME, '-alpha') || contains(steps.tag.outputs.TAG_NAME, '-beta') || contains(steps.tag.outputs.TAG_NAME, '-rc') }}
75+ generate_release_notes : false
76+ env :
77+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
0 commit comments