2626 release :
2727 name : Release
2828 runs-on : ubuntu-latest
29- timeout-minutes : 30
29+ timeout-minutes : 60
3030
3131 steps :
3232 - name : Generate bot token
@@ -52,13 +52,13 @@ jobs:
5252 GH_TOKEN : ${{ steps.generate_token.outputs.token }}
5353
5454 - name : Checkout repository
55- uses : actions/checkout@v4
55+ uses : actions/checkout@v6
5656 with :
5757 token : ${{ steps.generate_token.outputs.token }}
5858 fetch-depth : 0
5959
6060 - name : Setup Node.js
61- uses : actions/setup-node@v4
61+ uses : actions/setup-node@v6
6262 with :
6363 node-version : ' 22'
6464 cache : npm
6868 - name : Install dependencies
6969 run : npm ci
7070
71+ - name : Capture previous tag
72+ if : github.ref_name == 'main'
73+ id : previous_tag
74+ run : echo "tag=$(git describe --tags --abbrev=0 --exclude='*-*' 2>/dev/null || true)" >> "$GITHUB_OUTPUT"
75+
7176 - name : Release
7277 run : npx semantic-release
7378 env :
7681 GIT_AUTHOR_EMAIL : ${{ steps.bot_user.outputs.id }}+${{ steps.generate_token.outputs.app-slug }}[bot]@users.noreply.github.com
7782 GIT_COMMITTER_NAME : ${{ steps.generate_token.outputs.app-slug }}[bot]
7883 GIT_COMMITTER_EMAIL : ${{ steps.bot_user.outputs.id }}+${{ steps.generate_token.outputs.app-slug }}[bot]@users.noreply.github.com
84+
85+ - name : Derive release announcement
86+ if : github.ref_name == 'main'
87+ id : announcement
88+ env :
89+ PREVIOUS_TAG : ${{ steps.previous_tag.outputs.tag }}
90+ run : |
91+ git fetch --force --tags origin
92+
93+ new_tag="$(git describe --tags --abbrev=0 2>/dev/null || true)"
94+ if [ -z "${new_tag}" ] || [ "${new_tag}" = "${PREVIOUS_TAG}" ]; then
95+ echo "should_announce=false" >> "$GITHUB_OUTPUT"
96+ exit 0
97+ fi
98+
99+ package_name="$(node -p "JSON.parse(require('fs').readFileSync('package.json', 'utf8')).name")"
100+ package_version="$(node -p "JSON.parse(require('fs').readFileSync('package.json', 'utf8')).version")"
101+ release_version="${new_tag#v}"
102+
103+ package_url="https://www.npmjs.com/package/${package_name}/v/${package_version}"
104+ release_url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/tag/${new_tag}"
105+ repo_url="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}"
106+
107+ if [ -n "${PREVIOUS_TAG}" ]; then
108+ changelog="$(git log --no-merges --reverse --pretty='format:- %s (%H-%h)' "${PREVIOUS_TAG}..${new_tag}" | grep -v '^- chore(release): ' || true)"
109+ else
110+ changelog="$(git log --no-merges --reverse --pretty='format:- %s (%H-%h)' "${new_tag}" | grep -v '^- chore(release): ' || true)"
111+ fi
112+
113+ if [ -z "${changelog}" ]; then
114+ changelog='- No additional commits listed.'
115+ else
116+ changelog="$(printf '%s\n' "${changelog}" | sed -E -e 's,\(([a-f0-9]+)-([a-f0-9]+)\),([`\2`]('"${repo_url}"'/commit/\1)),g' | sed -E -e 's,\(#([0-9]+)\),([#\1]('"${repo_url}"'/pull/\1)),g')"
117+ fi
118+
119+ {
120+ echo "should_announce=true"
121+ echo "message<<EOF"
122+ echo "**Comms CLI ${new_tag} published 🚀**"
123+ echo
124+ printf '%s\n' "${changelog}"
125+ echo
126+ echo "[GitHub release](${release_url}) | [npm package](${package_url})"
127+ echo "EOF"
128+ } >> "$GITHUB_OUTPUT"
129+
130+ - name : Announce release in Comms
131+ if : github.ref_name == 'main' && steps.announcement.outputs.should_announce == 'true'
132+ uses : Doist/comms-actions/post-comment-action@main
133+ with :
134+ comms-client-id : ${{ secrets.COMMS_CLIENT_ID }}
135+ comms-client-secret : ${{ secrets.COMMS_CLIENT_SECRET }}
136+ comms-username : ${{ secrets.COMMS_USERNAME }}
137+ comms-password : ${{ secrets.COMMS_PASSWORD }}
138+ workspace-id : 69
139+ thread-id : CZECS4Yebwx7c1c8hDRmB
140+ content : ${{ steps.announcement.outputs.message }}
141+ audience : channel
142+ continue-on-error : true
0 commit comments