Skip to content

Commit e7656b0

Browse files
authored
chore(ci): 🤖 improve changelog parsing (#947)
* chore: 🤖 make extract-changelog as a separate process to allow local extract output testing * refactor: 💡 extract changelog with fallbacks * fix: 🐛 all extract changelog error messages now redirect to stder * chore: 🤖 remove redundant filter
1 parent 1023cb4 commit e7656b0

File tree

2 files changed

+59
-9
lines changed

2 files changed

+59
-9
lines changed

.github/workflows/release-publisher.yml

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,20 +158,23 @@ jobs:
158158
id: changelog
159159
run: |
160160
VERSION="${{ steps.verify-merge.outputs.version }}"
161+
CHANGELOG_PATH="CHANGELOG.md"
162+
CHANGELOG_OUTPUT_TEMP_PATH="/tmp/changelog.txt"
163+
FALLBACK_MSG="📝 See [CHANGELOG.md](./CHANGELOG.md) for details."
161164
162-
if [[ -f CHANGELOG.md ]]; then
163-
CHANGELOG=$(awk "/## $VERSION/,/## [0-9]/" CHANGELOG.md | sed '1d;$d' | sed '/^$/d')
165+
CHANGELOG=""
166+
if [[ -f "$CHANGELOG_PATH" ]]; then
167+
CHANGELOG=$(.scripts/bash/extract-changelog "$VERSION" "$CHANGELOG_PATH")
168+
fi
164169
165-
if [[ -z "$CHANGELOG" ]]; then
166-
CHANGELOG="📝 See [CHANGELOG.md](./CHANGELOG.md) for details."
167-
fi
170+
if [[ -n "$CHANGELOG" ]]; then
171+
echo "$CHANGELOG" > "$CHANGELOG_OUTPUT_TEMP_PATH"
168172
else
169-
CHANGELOG="No changelog available."
173+
echo "No changelog available for version $VERSION." > "$CHANGELOG_OUTPUT_TEMP_PATH"
174+
echo "" >> "$CHANGELOG_OUTPUT_TEMP_PATH"
175+
echo "$FALLBACK_MSG" >> "$CHANGELOG_OUTPUT_TEMP_PATH"
170176
fi
171177
172-
# Try persist multiple lines
173-
echo "$CHANGELOG" > /tmp/changelog.txt
174-
175178
- name: Create GitHub Release
176179
if: steps.verify-merge.outputs.is_release == 'true'
177180
uses: softprops/action-gh-release@v1

.scripts/bash/extract-changelog

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/bin/bash
2+
3+
if [[ $# -lt 1 ]]; then
4+
echo "👹 Oops! Usage is extract-changelog <version> [changelog_file]" >&2
5+
exit 1
6+
fi
7+
8+
VERSION="$1"
9+
CHANGELOG_FILE="${2:-CHANGELOG.md}"
10+
11+
if [[ -z "$VERSION" ]]; then
12+
echo "👹 Oops! Version is empty" >&2
13+
exit 1
14+
fi
15+
16+
if [[ ! -f "$CHANGELOG_FILE" ]]; then
17+
echo "👹 Oops! Changelog file not found: $CHANGELOG_FILE" >&2
18+
exit 1
19+
fi
20+
21+
# NOTE: Extract content between "## <version>" and the next "## <version>" header
22+
FOUND=false
23+
CHANGELOG=""
24+
25+
while IFS= read -r line; do
26+
if [[ "$line" == "## $VERSION" ]]; then
27+
FOUND=true
28+
continue
29+
fi
30+
31+
if $FOUND; then
32+
if [[ "$line" =~ ^##\ [0-9] ]]; then
33+
break
34+
fi
35+
CHANGELOG+="$line"$'\n'
36+
fi
37+
done < "$CHANGELOG_FILE"
38+
39+
CHANGELOG="${CHANGELOG%$'\n'}"
40+
41+
if [[ -z "$CHANGELOG" ]]; then
42+
echo "No changelog content found for version $VERSION" >&2
43+
exit 1
44+
fi
45+
46+
# NOTE: Prevent GitHub mentioning user by replacing @username with `@username`
47+
echo "$CHANGELOG" | sed 's/@\([a-zA-Z0-9][a-zA-Z0-9-]*\)/`@\1`/g'

0 commit comments

Comments
 (0)