Skip to content

Commit b91c2e5

Browse files
Add automation to create release branch and tags
1 parent 2e902db commit b91c2e5

File tree

6 files changed

+180
-112
lines changed

6 files changed

+180
-112
lines changed

.github/workflows/release.yaml

Lines changed: 85 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,96 @@
1-
name: release
1+
name: Create Release
22

33
on:
44
push:
5-
# Sequence of patterns matched against refs/tags
6-
tags:
7-
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
8-
5+
branches:
6+
- main
7+
paths:
8+
- 'CHANGELOG/*.md'
9+
910
permissions:
10-
contents: write # Allow to create a release.
11+
contents: write # Allow to push a tag, create a release branch and publish a draft release.
1112

1213
jobs:
13-
build:
14+
push_release_tags:
15+
runs-on: ubuntu-latest
16+
outputs:
17+
release_tag: ${{ steps.release-version.outputs.release_version }}
18+
steps:
19+
- name: Checkout code
20+
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # tag=v3.5.3
21+
with:
22+
fetch-depth: 0
23+
- name: Get changed files
24+
id: changed-files
25+
uses: tj-actions/changed-files@920e7b9ae1d45913fc81f86c956fee89c77d2e5e # tag=v37.5.0
26+
- name: Get release version
27+
id: release-version
28+
run: |
29+
if [[ ${{ steps.changed-files.outputs.all_changed_files_count }} != 1 ]]; then
30+
echo "1 release notes file should be changed to create a release tag, found ${{ steps.changed-files.outputs.all_changed_files_count }}"
31+
exit 1
32+
fi
33+
for changed_file in ${{ steps.changed-files.outputs.all_changed_files }}; do
34+
export RELEASE_VERSION=$(echo "${changed_file}" | grep -oP '(?<=/)[^/]+(?=\.md)')
35+
echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_ENV
36+
echo "RELEASE_VERSION=$RELEASE_VERSION" >> $GITHUB_OUTPUT
37+
if [[ "$RELEASE_VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$ ]]; then
38+
echo "Valid semver: $RELEASE_VERSION"
39+
else
40+
echo "Invalid semver: $RELEASE_VERSION"
41+
exit 1
42+
fi
43+
done
44+
- name: Determine the release branch to use
45+
run: |
46+
if [[ $RELEASE_VERSION =~ beta ]] || [[ $RELEASE_VERSION =~ alpha ]]; then
47+
export RELEASE_BRANCH=main
48+
echo "RELEASE_BRANCH=$RELEASE_BRANCH" >> $GITHUB_ENV
49+
echo "This is a beta or alpha release, will use release branch $RELEASE_BRANCH"
50+
else
51+
export RELEASE_BRANCH=release-$(echo $RELEASE_VERSION | sed -E 's/^v([0-9]+)\.([0-9]+)\..*$/\1.\2/')
52+
echo "RELEASE_BRANCH=$RELEASE_BRANCH" >> $GITHUB_ENV
53+
echo "This is not a beta or alpha release, will use release branch $RELEASE_BRANCH"
54+
fi
55+
- name: Create or checkout release branch
56+
run: |
57+
if git show-ref --verify --quiet "refs/remotes/origin/$RELEASE_BRANCH"; then
58+
echo "Branch $RELEASE_BRANCH already exists"
59+
git checkout "$RELEASE_BRANCH"
60+
else
61+
git checkout -b "$RELEASE_BRANCH"
62+
git push origin "$RELEASE_BRANCH"
63+
echo "Created branch $RELEASE_BRANCH"
64+
fi
65+
- name: Validate tag does not already exist
66+
run: |
67+
if [[ $(git tag -l $RELEASE_VERSION) ]]; then
68+
echo "Tag $RELEASE_VERSION already exists, exiting"
69+
exit 1
70+
fi
71+
- name: Create Release Tag
72+
run: |
73+
git config user.name "${GITHUB_ACTOR}"
74+
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
75+
git tag -a ${RELEASE_VERSION} -m ${RELEASE_VERSION}
76+
git tag test/${RELEASE_VERSION}
77+
git push origin ${RELEASE_VERSION}
78+
git push origin test/${RELEASE_VERSION}
79+
echo "Created tags $RELEASE_VERSION and test/${RELEASE_VERSION}"
80+
release:
1481
name: create draft release
1582
runs-on: ubuntu-latest
83+
needs: push_release_tags
1684
steps:
1785
- name: Set env
18-
run: echo "RELEASE_TAG=${GITHUB_REF:10}" >> $GITHUB_ENV
86+
run: echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV
87+
env:
88+
RELEASE_TAG: ${{needs.push_release_tags.outputs.release_tag}}
1989
- name: checkout code
2090
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # tag=v3.5.3
2191
with:
2292
fetch-depth: 0
93+
ref: ${{ env.RELEASE_TAG }}
2394
- name: Calculate go version
2495
run: echo "go_version=$(make go-version)" >> $GITHUB_ENV
2596
- name: Set up Go
@@ -29,9 +100,14 @@ jobs:
29100
- name: generate release artifacts
30101
run: |
31102
make release
103+
- name: get release notes
104+
run: |
105+
curl -L "https://raw.githubusercontent.com/${{ github.repository }}/main/CHANGELOG/${{ env.RELEASE_TAG }}.md" \
106+
-o "${{ env.RELEASE_TAG }}.md"
32107
- name: Release
33108
uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # tag=v1
34109
with:
35110
draft: true
36111
files: out/*
37-
body: "TODO: Copy release notes shared by the comms team"
112+
body_path: ${{ env.RELEASE_TAG }}.md
113+
tag_name: ${{ env.RELEASE_TAG }}

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ _artifacts
7676

7777
# release artifacts
7878
out
79-
_releasenotes
8079

8180
# Helm
8281
.helm

CHANGELOG/OWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# TODO: create alias for release team and decide who is approver and reviewer for release notes

CHANGELOG/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# CHANGELOG
2+
3+
This folder contains release notes for past releases. Changes to this folder in the main branch trigger a GitHub Action that creates release tags and a draft release.
4+
5+
See [release documentation](../docs/release/release-tasks.md) for more information.

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,7 @@ PREVIOUS_TAG ?= $(shell git tag -l | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+$$" | sort
901901
## set by Prow, ref name of the base branch, e.g., main
902902
RELEASE_ALIAS_TAG := $(PULL_BASE_REF)
903903
RELEASE_DIR := out
904-
RELEASE_NOTES_DIR := _releasenotes
904+
RELEASE_NOTES_DIR := CHANGELOG
905905
USER_FORK ?= $(shell git config --get remote.origin.url | cut -d/ -f4) # only works on https://github.com/<username>/cluster-api.git style URLs
906906
ifeq ($(USER_FORK),)
907907
USER_FORK := $(shell git config --get remote.origin.url | cut -d: -f2 | cut -d/ -f1) # for [email protected]:<username>/cluster-api.git style URLs

0 commit comments

Comments
 (0)