1+ name : Create Release
2+
3+ on :
4+ push :
5+ tags :
6+ - " release/*/*/v*.*.*"
7+
8+ jobs :
9+ create-release :
10+ runs-on : ubuntu-latest
11+ permissions :
12+ contents : write
13+ pull-requests : read
14+
15+ steps :
16+ - name : Checkout code
17+ uses : actions/checkout@v4
18+ with :
19+ fetch-depth : 0
20+ persist-credentials : false
21+
22+ - name : Extract tag information
23+ id : tag_info
24+ run : |
25+ TAG=${GITHUB_REF#refs/tags/}
26+ echo "tag=$TAG" >> $GITHUB_OUTPUT
27+
28+ IFS='/' read -ra PARTS <<< "$TAG"
29+ NAMESPACE="${PARTS[1]}"
30+ MODULE="${PARTS[2]}"
31+ VERSION="${PARTS[3]}"
32+
33+ echo "namespace=$NAMESPACE" >> $GITHUB_OUTPUT
34+ echo "module=$MODULE" >> $GITHUB_OUTPUT
35+ echo "version=$VERSION" >> $GITHUB_OUTPUT
36+ echo "module_path=registry/$NAMESPACE/modules/$MODULE" >> $GITHUB_OUTPUT
37+
38+ RELEASE_TITLE="$NAMESPACE/$MODULE $VERSION"
39+ echo "release_title=$RELEASE_TITLE" >> $GITHUB_OUTPUT
40+
41+ - name : Find previous tag
42+ id : prev_tag
43+ env :
44+ NAMESPACE : ${{ steps.tag_info.outputs.namespace }}
45+ MODULE : ${{ steps.tag_info.outputs.module }}
46+ CURRENT_TAG : ${{ steps.tag_info.outputs.tag }}
47+ run : |
48+ PREV_TAG=$(git tag -l "release/$NAMESPACE/$MODULE/v*" | sort -V | grep -B1 "$CURRENT_TAG" | head -1)
49+
50+ if [ -z "$PREV_TAG" ] || [ "$PREV_TAG" = "$CURRENT_TAG" ]; then
51+ echo "No previous tag found, using initial commit"
52+ PREV_TAG=$(git rev-list --max-parents=0 HEAD)
53+ fi
54+
55+ echo "prev_tag=$PREV_TAG" >> $GITHUB_OUTPUT
56+ echo "Previous tag: $PREV_TAG"
57+
58+ - name : Generate changelog
59+ id : changelog
60+ env :
61+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
62+ MODULE_PATH : ${{ steps.tag_info.outputs.module_path }}
63+ PREV_TAG : ${{ steps.prev_tag.outputs.prev_tag }}
64+ CURRENT_TAG : ${{ steps.tag_info.outputs.tag }}
65+ run : |
66+ echo "Generating changelog for $MODULE_PATH between $PREV_TAG and $CURRENT_TAG"
67+
68+ COMMITS=$(git log --oneline --no-merges "$PREV_TAG..$CURRENT_TAG" -- "$MODULE_PATH")
69+
70+ if [ -z "$COMMITS" ]; then
71+ echo "No commits found for this module"
72+ echo "changelog=No changes found for this module." >> $GITHUB_OUTPUT
73+ exit 0
74+ fi
75+
76+ FULL_CHANGELOG=$(gh api repos/:owner/:repo/releases/generate-notes \
77+ --field tag_name="$CURRENT_TAG" \
78+ --field previous_tag_name="$PREV_TAG" \
79+ --jq '.body')
80+
81+ MODULE_COMMIT_SHAS=$(git log --format="%H" --no-merges "$PREV_TAG..$CURRENT_TAG" -- "$MODULE_PATH")
82+
83+ FILTERED_CHANGELOG="## What's Changed\n\n"
84+
85+ for sha in $MODULE_COMMIT_SHAS; do
86+ SHORT_SHA=${sha:0:7}
87+
88+ COMMIT_LINES=$(echo "$FULL_CHANGELOG" | grep -E "$SHORT_SHA|$(git log --format='%s' -n 1 $sha)" || true)
89+
90+ if [ -n "$COMMIT_LINES" ]; then
91+ FILTERED_CHANGELOG="${FILTERED_CHANGELOG}${COMMIT_LINES}\n"
92+ else
93+ COMMIT_MSG=$(git log --format="%s" -n 1 $sha)
94+ AUTHOR=$(gh api repos/:owner/:repo/commits/$sha --jq '.author.login // .commit.author.name')
95+ FILTERED_CHANGELOG="${FILTERED_CHANGELOG}* $COMMIT_MSG by @$AUTHOR\n"
96+ fi
97+ done
98+
99+ echo "changelog<<EOF" >> $GITHUB_OUTPUT
100+ echo -e "$FILTERED_CHANGELOG" >> $GITHUB_OUTPUT
101+ echo "EOF" >> $GITHUB_OUTPUT
102+
103+ - name : Create Release
104+ env :
105+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
106+ TAG_NAME : ${{ steps.tag_info.outputs.tag }}
107+ RELEASE_TITLE : ${{ steps.tag_info.outputs.release_title }}
108+ CHANGELOG : ${{ steps.changelog.outputs.changelog }}
109+ run : |
110+ gh release create "$TAG_NAME" \
111+ --title "$RELEASE_TITLE" \
112+ --notes "$CHANGELOG"
0 commit comments