diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2f27113e..f9dfe29e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -136,6 +136,59 @@ jobs: name: ReleaseArtifacts path: artifacts/** + - name: Write release notes + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG_NAME: ${{ inputs.tag_name || github.ref_name }} + run: | + set -euo pipefail + + if [[ ! "${TAG_NAME}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]]; then + echo "Release tag must be a v-prefixed SemVer version, got: ${TAG_NAME}" >&2 + exit 1 + fi + + previous_tag="$( + gh api --paginate --slurp \ + "/repos/${GITHUB_REPOSITORY}/releases?per_page=100" \ + | jq -r --arg current "${TAG_NAME}" ' + flatten + | map( + select( + .draft == false + and .prerelease == false + and .published_at != null + and .tag_name != $current + and (.tag_name | test("^v[0-9]+\\.[0-9]+\\.[0-9]+$")) + ) + ) + | max_by(.published_at).tag_name // empty + ' + )" + if [ -z "${previous_tag}" ]; then + echo "No previous non-draft, non-prerelease GitHub release was found before ${TAG_NAME}." >&2 + exit 1 + fi + if [[ ! "${previous_tag}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Latest GitHub release tag is not a stable v-prefixed SemVer version: ${previous_tag}" >&2 + exit 1 + fi + + cat > release-notes.md <