Skip to content

Commit 046a303

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 7da3058 commit 046a303

2 files changed

Lines changed: 97 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: draft-new-release.yml
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: 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)