Skip to content

Commit 54f30d8

Browse files
committed
Automate draft release creation
The GitHub workflow creates a new draft release for the given tag. It collects all pre- and post-release tasks mentioned in PR descriptions of PRs that were merged into `next` since it diverged from `main`.
1 parent 4542571 commit 54f30d8

File tree

2 files changed

+94
-0
lines changed

2 files changed

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

script/draft_new_release.sh

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#!/usr/bin/env bash
2+
3+
# This script creates a new draft release and creates a template for the release notes.
4+
# It extracts pre-release and post-release tasks from pull request descriptions.
5+
# The required syntax is:
6+
# Pre-Release:
7+
# - Task 1
8+
# - Task 2
9+
# Post-Release:
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+
pre=$(echo "$pr_body" | sed -n '/Pre-Release:/,/Post-Release:/p' | grep '^[*-]' || true)
32+
post=$(echo "$pr_body" | sed -n '/Post-Release:/,$p' | grep '^[*-]' || true)
33+
34+
if [ -n "$pre" ]; then
35+
pre_release_tasks+="
36+
PR #$pr:
37+
$pre
38+
"
39+
fi
40+
if [ -n "$post" ]; then
41+
post_release_tasks+="
42+
PR #$pr:
43+
$post
44+
"
45+
fi
46+
done
47+
48+
release_body="**Full Changelog**: https://github.com/nhsuk/manage-vaccinations-in-schools/compare/$latest_release...$release_tag
49+
"
50+
51+
if [ -n "$pre_release_tasks" ]; then
52+
release_body+="
53+
## Pre-Release Tasks
54+
${pre_release_tasks}
55+
"
56+
fi
57+
if [ -n "$post_release_tasks" ]; then
58+
release_body+="
59+
## Post-Release Tasks
60+
${post_release_tasks}
61+
"
62+
fi
63+
64+
echo "$release_body" > release_notes.md

0 commit comments

Comments
 (0)