Skip to content

Commit 593be9e

Browse files
committed
wip release builder
1 parent c8b38e3 commit 593be9e

1 file changed

Lines changed: 204 additions & 0 deletions

File tree

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
name: Release draft_builder
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
paths:
8+
- packages/draft_builder/**
9+
- .github/workflows/draft-builder-release.yml
10+
workflow_dispatch:
11+
inputs:
12+
release_type:
13+
description: Semver bump to apply
14+
required: true
15+
default: patch
16+
type: choice
17+
options:
18+
- patch
19+
- minor
20+
- major
21+
22+
permissions:
23+
contents: write
24+
models: read
25+
id-token: write
26+
27+
jobs:
28+
publish:
29+
if: github.actor != 'github-actions[bot]'
30+
runs-on: ubuntu-latest
31+
env:
32+
PACKAGE_PATH: packages/draft_builder
33+
TAG_PREFIX: draft-builder-v
34+
RELEASE_TYPE: ${{ github.event_name == 'workflow_dispatch' && inputs.release_type || 'patch' }}
35+
steps:
36+
- name: Checkout
37+
uses: actions/checkout@v4
38+
with:
39+
fetch-depth: 0
40+
41+
- name: Set up Dart
42+
uses: dart-lang/setup-dart@v1
43+
with:
44+
sdk: 3.7.0
45+
46+
- name: Install dependencies
47+
working-directory: ${{ env.PACKAGE_PATH }}
48+
run: dart pub get
49+
50+
- name: Run tests
51+
working-directory: ${{ env.PACKAGE_PATH }}
52+
run: dart test
53+
54+
- name: Determine next version
55+
id: version
56+
run: |
57+
set -euo pipefail
58+
59+
PUBSPEC_VERSION="$(awk '/^version:/ {print $2; exit}' "${PACKAGE_PATH}/pubspec.yaml" || true)"
60+
LATEST_TAG="$(git describe --tags --match "${TAG_PREFIX}*" --abbrev=0 2>/dev/null || echo '')"
61+
62+
if [[ -n "${LATEST_TAG}" ]]; then
63+
BASE_VERSION="${LATEST_TAG#${TAG_PREFIX}}"
64+
else
65+
BASE_VERSION="${PUBSPEC_VERSION:-0.0.0}"
66+
fi
67+
68+
if [[ ! "${BASE_VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
69+
echo "Base version '${BASE_VERSION}' is not in semver format; defaulting to 0.0.0" >&2
70+
BASE_VERSION="0.0.0"
71+
fi
72+
73+
IFS='.' read -r MAJOR MINOR PATCH <<< "${BASE_VERSION}"
74+
75+
case "${RELEASE_TYPE}" in
76+
major)
77+
((MAJOR++))
78+
MINOR=0
79+
PATCH=0
80+
;;
81+
minor)
82+
((MINOR++))
83+
PATCH=0
84+
;;
85+
*)
86+
RELEASE_TYPE="patch"
87+
((PATCH++))
88+
;;
89+
esac
90+
91+
NEXT_VERSION="${MAJOR}.${MINOR}.${PATCH}"
92+
NEXT_TAG="${TAG_PREFIX}${NEXT_VERSION}"
93+
94+
if git rev-parse -q --verify "refs/tags/${NEXT_TAG}" >/dev/null; then
95+
echo "Tag ${NEXT_TAG} already exists. Aborting." >&2
96+
exit 1
97+
fi
98+
99+
if [[ -n "${LATEST_TAG}" ]]; then
100+
RELEASE_FROM="${LATEST_TAG}"
101+
else
102+
mapfile -t ROOT_COMMITS < <(git rev-list --max-parents=0 HEAD)
103+
ROOT_COUNT=${#ROOT_COMMITS[@]}
104+
if (( ROOT_COUNT > 0 )); then
105+
ROOT_INDEX=$((ROOT_COUNT - 1))
106+
RELEASE_FROM="${ROOT_COMMITS[ROOT_INDEX]}"
107+
else
108+
RELEASE_FROM="${GITHUB_SHA}"
109+
fi
110+
fi
111+
112+
{
113+
echo "value=${NEXT_VERSION}"
114+
echo "tag=${NEXT_TAG}"
115+
echo "previous_tag=${LATEST_TAG}"
116+
echo "release_from=${RELEASE_FROM}"
117+
} >> "$GITHUB_OUTPUT"
118+
119+
- name: Generate release notes
120+
id: release_notes
121+
uses: josiahsrc/ai-release-notes-builder@v2
122+
env:
123+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
124+
with:
125+
prompt: |
126+
Generate a bullet-point changelog list of what changed. Keep each point brief. Focus
127+
on high-level improvements and user-facing changes.
128+
from: ${{ steps.version.outputs.release_from }}
129+
to: ${{ github.sha }}
130+
include_start_commit: ${{ steps.version.outputs.previous_tag == '' }}
131+
paths: |
132+
packages/draft_builder/**
133+
134+
- name: Update pubspec version
135+
env:
136+
NEXT_VERSION: ${{ steps.version.outputs.value }}
137+
run: |
138+
set -euo pipefail
139+
tmp_file="$(mktemp)"
140+
awk -v new_version="${NEXT_VERSION}" '
141+
/^version:/ { print "version: " new_version; next }
142+
{ print }
143+
' "${PACKAGE_PATH}/pubspec.yaml" > "$tmp_file"
144+
mv "$tmp_file" "${PACKAGE_PATH}/pubspec.yaml"
145+
146+
- name: Update CHANGELOG
147+
env:
148+
NEXT_VERSION: ${{ steps.version.outputs.value }}
149+
run: |
150+
set -euo pipefail
151+
notes_file="$(mktemp)"
152+
cat <<'NOTES' > "$notes_file"
153+
${{ steps.release_notes.outputs.release-notes }}
154+
NOTES
155+
156+
changelog_tmp="$(mktemp)"
157+
{
158+
printf '## %s\n\n' "${NEXT_VERSION}"
159+
cat "$notes_file"
160+
echo
161+
cat "${PACKAGE_PATH}/CHANGELOG.md"
162+
} > "$changelog_tmp"
163+
164+
mv "$changelog_tmp" "${PACKAGE_PATH}/CHANGELOG.md"
165+
166+
- name: Configure git
167+
run: |
168+
git config user.name "github-actions[bot]"
169+
git config user.email "github-actions[bot]@users.noreply.github.com"
170+
171+
- name: Commit version bump
172+
env:
173+
NEXT_VERSION: ${{ steps.version.outputs.value }}
174+
run: |
175+
set -euo pipefail
176+
git add "${PACKAGE_PATH}/pubspec.yaml" "${PACKAGE_PATH}/CHANGELOG.md"
177+
if git status --porcelain | grep .; then
178+
git commit -m "chore(release): draft_builder v${NEXT_VERSION}"
179+
else
180+
echo "No changes to commit"
181+
fi
182+
183+
# - name: Publish
184+
# run: dart pub publish --force
185+
# working-directory: ${{ env.PACKAGE_PATH }}
186+
187+
# - name: Create release tag
188+
# env:
189+
# NEXT_TAG: ${{ steps.version.outputs.tag }}
190+
# run: git tag "$NEXT_TAG"
191+
192+
# - name: Push changes
193+
# env:
194+
# NEXT_TAG: ${{ steps.version.outputs.tag }}
195+
# run: |
196+
# git push origin HEAD
197+
# git push origin "$NEXT_TAG"
198+
199+
# - name: Append release notes to summary
200+
# run: |
201+
# cat <<'EOF' >> "$GITHUB_STEP_SUMMARY"
202+
# ## draft_builder v${{ steps.version.outputs.value }}
203+
# ${{ steps.release_notes.outputs.release-notes }}
204+
# EOF

0 commit comments

Comments
 (0)