Skip to content

Commit ab6a62d

Browse files
chore: improve release workflow with tagging (#33)
Signed-off-by: Alec Jacobs <charles.jacobs@segment.com>
1 parent 691011f commit ab6a62d

3 files changed

Lines changed: 116 additions & 0 deletions

File tree

.github/workflows/release.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,11 @@ jobs:
5959
# exchanges it per-package for a short-lived npm token, and enables
6060
# provenance automatically (public repo + public package).
6161
run: yarn lerna publish from-package --yes --loglevel=verbose --dist-tag latest
62+
63+
- name: Fetch Latest Tags
64+
run: |
65+
git fetch --tags
66+
67+
- name: Generate Tags
68+
id: get-release-tag
69+
run: ./scripts/generate-release-tags.sh

scripts/generate-release-tags.sh

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env bash
2+
3+
# This script is executed after the version is bumped by lerna. It generates a release tag.
4+
# The release tag generated will be pushed to the repository by lerna version.
5+
set -e
6+
7+
sha=$(git rev-parse HEAD)
8+
branch=$(git rev-parse --symbolic-full-name --abbrev-ref HEAD)
9+
message=$(git log -1 --pretty=%B)
10+
11+
RELEASE_COMMIT_PREFIX="chore(release):"
12+
13+
function pre_tag_checks() {
14+
# # Only generate release tags for main branch
15+
if [[ $branch != "main" ]]; then
16+
echo "Skipping release tag generation as branch is not main"
17+
exit 0
18+
fi;
19+
20+
if [[ $message != "$RELEASE_COMMIT_PREFIX"* ]]; then
21+
echo "Skipping release tag generation as last commit is not a release commit"
22+
exit 0
23+
fi;
24+
25+
# check if jq is installed
26+
if ! command -v jq &> /dev/null; then
27+
echo "jq could not be found. Please install jq to generate release tag."
28+
exit 1
29+
fi
30+
}
31+
32+
function generate_monorepo_tag() {
33+
# Generate and push release tag. Release tag format: release-YYYY-MM-DD[.N] e.g. release-2026-01-01
34+
if ! n=$(git rev-list --count "$sha~" --grep "$RELEASE_COMMIT_PREFIX" --since="00:00"); then
35+
echo 'Failed to compute release tag. Exiting.'
36+
exit 1
37+
else
38+
case "$n" in
39+
0) suffix="" ;; # first commit of the day gets no suffix
40+
*) suffix=".$n" ;; # subsequent commits get a suffix, starting with .1
41+
esac
42+
43+
base_tag=$(date '+%Y-%m-%d')
44+
tag=$(printf "release-%s%s" "$base_tag" "$suffix")
45+
echo "Tagging $sha with $tag"
46+
git tag -a "$tag" -m "Release $tag"
47+
git push origin "$tag"
48+
fi
49+
}
50+
51+
function generate_plugin_tags() {
52+
# List changed package.json files in the last commit
53+
files=$(git show --pretty="" --name-only HEAD | grep -Ei '^plugins/.*package\.json$')
54+
55+
# Generate and push release tags for each package.
56+
# Tag format: <package-name>@<package-version> e.g. @my-org/my-package@1.0.0
57+
for file in $files; do
58+
tag=$(jq -r '.name + "@" + .version' "$file")
59+
60+
echo "Tagging $sha with $tag"
61+
git tag -a "$tag" -m "Release $tag"
62+
git push origin "$tag"
63+
done
64+
}
65+
66+
function main() {
67+
pre_tag_checks
68+
generate_monorepo_tag
69+
generate_plugin_tags
70+
}
71+
72+
main

scripts/prerelease.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
if [[ -n "$(git status --porcelain)" ]]; then
6+
echo >&2 "ERROR: Uncommitted changes found, please commit or stash them before releasing."
7+
exit 1
8+
fi
9+
10+
echo "Switching to main and pulling ..."
11+
git switch main
12+
git pull
13+
14+
echo "Checking yarn.lock status ..."
15+
if ! yarn install --immutable; then
16+
echo >&2 "ERROR: yarn.lock is not up to date, please run yarn install in a feature branch and merge the changes."
17+
exit 1
18+
fi
19+
20+
target_version="$1"
21+
if [[ -n "$target_version" ]]; then
22+
echo "Target version specified: $target_version"
23+
else
24+
echo "No target version specified, using --conventional-commits flag"
25+
target_version="--conventional-commits"
26+
fi
27+
28+
yarn lerna version --no-git-tag-version --no-private "$target_version"
29+
30+
release_branch="release/$(date +%s)"
31+
git switch --create "$release_branch"
32+
git add --all # include all files including any untracked
33+
git commit --all --message "chore(release): generate release"
34+
git push --set-upstream origin "$release_branch"
35+
36+
echo "Release notes generated and pushed to \"$release_branch\". Please open a pull request, get it reviewed, and merge to trigger package publishing."

0 commit comments

Comments
 (0)