Skip to content

Commit 2984d05

Browse files
authored
Merge pull request #4467 from nhsuk/release_note_creation
Automated release note creation
2 parents 9c38574 + 352757e commit 2984d05

3 files changed

Lines changed: 107 additions & 0 deletions

File tree

.github/pull_request_template.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
## Screenshots
2+
3+
## Pre-release tasks
4+
5+
- ...
6+
7+
## Post-release tasks
8+
9+
- ...
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Draft new release
2+
run-name: Draft release notes for ${{ inputs.release_tag }}
3+
permissions:
4+
contents: write
5+
6+
on:
7+
workflow_dispatch:
8+
inputs:
9+
release_tag:
10+
required: true
11+
description: Release tag
12+
13+
jobs:
14+
create-release-notes:
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: Checkout repository
18+
uses: actions/checkout@v5
19+
with:
20+
fetch-depth: 0
21+
- name: Generate release notes
22+
env:
23+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24+
run: script/draft_new_release.sh ${{ inputs.release_tag }}
25+
- name: Create GitHub Release
26+
env:
27+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
28+
run: |
29+
gh release create "${{ inputs.release_tag }}" \
30+
--title "Draft release ${{ inputs.release_tag }}" \
31+
--notes-file release_notes.md \
32+
--draft
33+

script/draft_new_release.sh

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/usr/bin/env bash
2+
3+
# This script creates draft release notes for a release.
4+
# It extracts pre-release and post-release tasks from pull request descriptions.
5+
# The required syntax is:
6+
# ## Pre-release tasks
7+
# - Task 1
8+
# - Task 2
9+
# ## Post-release tasks
10+
# - Task 3
11+
12+
set -e
13+
14+
if [ "$#" -ne 1 ]; then
15+
echo "Usage: $0 <release_tag>"
16+
exit 1
17+
fi
18+
19+
release_tag=$1
20+
latest_release=$(gh release list --json name,isLatest --jq '.[] | select(.isLatest)|.name')
21+
22+
merge_base=$(git merge-base origin/main origin/next)
23+
pr_numbers=$(git log --pretty=format:"%s" $merge_base..origin/next | grep -oE 'Merge pull request #([0-9]+)' | grep -oE '[0-9]+')
24+
25+
pre_release_tasks=""
26+
post_release_tasks=""
27+
28+
for pr in $pr_numbers; do
29+
echo "Processing PR #$pr"
30+
pr_body=$(gh pr view "$pr" --json body -q '.body')
31+
32+
pre=$(echo "$pr_body" | sed -n '/## Pre-release tasks/,/## Post-release tasks/p' | grep '^[*-]' | grep -v '^- \.\.\.' || true)
33+
post=$(echo "$pr_body" | sed -n '/## Post-release tasks/,$p' | grep '^[*-]' | grep -v '^- \.\.\.' || true)
34+
35+
if [ -n "$pre" ]; then
36+
pre_release_tasks+="
37+
PR #$pr:
38+
$pre
39+
"
40+
fi
41+
if [ -n "$post" ]; then
42+
post_release_tasks+="
43+
PR #$pr:
44+
$post
45+
"
46+
fi
47+
done
48+
49+
release_body="**Full Changelog**: https://github.com/nhsuk/manage-vaccinations-in-schools/compare/$latest_release...$release_tag
50+
"
51+
52+
if [ -n "$pre_release_tasks" ]; then
53+
release_body+="
54+
## Pre-release tasks
55+
${pre_release_tasks}
56+
"
57+
fi
58+
if [ -n "$post_release_tasks" ]; then
59+
release_body+="
60+
## Post-release tasks
61+
${post_release_tasks}
62+
"
63+
fi
64+
65+
echo "$release_body" > release_notes.md

0 commit comments

Comments
 (0)