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