Skip to content

Commit f3a47da

Browse files
authored
Add create-releases worlflow
- Automatically creates a GitHub Release when a new tag is pushed - Includes the relevant changelog section in the release body - Appends a “❤️ Thank You” section listing contributors for the release with clickable GitHub usernames
1 parent 058c2e6 commit f3a47da

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
name: Create GitHub Releases
2+
3+
on:
4+
push:
5+
tags:
6+
- "packages/*/v*"
7+
8+
jobs:
9+
create-release:
10+
runs-on: ubuntu-latest
11+
12+
permissions:
13+
contents: write
14+
15+
steps:
16+
- name: Checkout repository
17+
uses: actions/checkout@v5
18+
with:
19+
fetch-depth: 0
20+
21+
- name: Setup Node.js
22+
uses: actions/setup-node@v5
23+
with:
24+
node-version: "22"
25+
26+
- name: Extract package and version from tag
27+
run: |
28+
FULL_TAG="${GITHUB_REF#refs/tags/}" # packages/ui/v2.1.0
29+
30+
PACKAGE=$(echo "$FULL_TAG" | cut -d/ -f2)
31+
VERSION=$(echo "$FULL_TAG" | cut -d/ -f3 | sed 's/^v//')
32+
33+
echo "FULL_TAG=$FULL_TAG" >> $GITHUB_ENV
34+
echo "PACKAGE=$PACKAGE" >> $GITHUB_ENV
35+
echo "VERSION=$VERSION" >> $GITHUB_ENV
36+
37+
- name: Resolve package name
38+
run: |
39+
PACKAGE_DIR="packages/$PACKAGE"
40+
41+
if [ -f "$PACKAGE_DIR/package.json" ]; then
42+
PACKAGE_NAME=$(node -p "require('./$PACKAGE_DIR/package.json').name")
43+
else
44+
PACKAGE_NAME="$PACKAGE"
45+
fi
46+
47+
echo "PACKAGE_NAME=$PACKAGE_NAME" >> $GITHUB_ENV
48+
49+
- name: Extract changelog
50+
run: |
51+
PACKAGE_DIR="packages/$PACKAGE"
52+
CHANGELOG_FILE="$PACKAGE_DIR/CHANGELOG.md"
53+
54+
if [ -f "$CHANGELOG_FILE" ]; then
55+
awk "/^## \[$VERSION\]/ {flag=1; next} /^## \[/ {flag=0} flag" "$CHANGELOG_FILE" > changelog_body.txt
56+
else
57+
echo "No changelog available" > changelog_body.txt
58+
fi
59+
60+
- name: Add contributors to changelog
61+
id: contributors
62+
run: |
63+
PACKAGE_DIR="packages/$PACKAGE"
64+
CHANGELOG_FILE="$PACKAGE_DIR/CHANGELOG.md"
65+
66+
# Get previous tag for the same package
67+
PREV_TAG=$(git tag -l "packages/$PACKAGE/v*" | grep -v "$VERSION" | sort -V | tail -n1 || echo "")
68+
69+
# Get list of contributors since previous tag
70+
if [ -n "$PREV_TAG" ]; then
71+
CONTRIBUTORS=$(git log $PREV_TAG..HEAD --pretty=format:"%an" -- $PACKAGE_DIR | sort -u)
72+
else
73+
CONTRIBUTORS=$(git log --pretty=format:"%an" -- $PACKAGE_DIR | sort -u)
74+
fi
75+
76+
# Generate @contributor link with GitHub profile URL
77+
CONTRIBUTORS_MD=""
78+
for NAME in $CONTRIBUTORS; do
79+
USERNAME=$(echo $NAME | tr -d ' ')
80+
CONTRIBUTORS_MD="$CONTRIBUTORS_MD\n[@$USERNAME](https://github.com/$USERNAME)"
81+
done
82+
83+
# Add contributors to changelog body
84+
if [ -n "$CONTRIBUTORS_MD" ]; then
85+
echo -e "\n❤️ Thank You$CONTRIBUTORS_MD" >> changelog_body.txt
86+
fi
87+
88+
# Update CHANGELOG_BODY variable
89+
echo "CHANGELOG_BODY<<EOF" >> $GITHUB_ENV
90+
cat changelog_body.txt >> $GITHUB_ENV
91+
echo "EOF" >> $GITHUB_ENV
92+
93+
- name: Prepare release body
94+
run: |
95+
echo "CHANGELOG_BODY<<EOF" >> $GITHUB_ENV
96+
cat changelog_body.txt >> $GITHUB_ENV
97+
echo "EOF" >> $GITHUB_ENV
98+
99+
- name: Create GitHub Release
100+
uses: actions/create-release@v1
101+
with:
102+
tag_name: ${{ env.FULL_TAG }}
103+
release_name: "${{ env.PACKAGE_NAME }} v${{ env.VERSION }}"
104+
body: ${{ env.CHANGELOG_BODY }}
105+
draft: false
106+
prerelease: false
107+
env:
108+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)