Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release tooling: Release stable releases from latest-release #24106

Merged
merged 32 commits into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
f5430d3
rename release preparement workflows
JReinhold Aug 28, 2023
8d582d7
merge stable to latest-release instead of next-release, resolving mer…
JReinhold Aug 29, 2023
1161b7a
more renaming of new release workflows
JReinhold Aug 29, 2023
d6297bf
only commit changelog changes when there are actual changes
JReinhold Aug 30, 2023
670bc51
add comments
JReinhold Aug 30, 2023
d5df684
simplify
JReinhold Aug 30, 2023
431ec63
ensure next is always ahead of main during stable releases
JReinhold Aug 31, 2023
5075165
improve readability of publish script
JReinhold Aug 31, 2023
44e988c
pul all release workflows in same concurrency group
JReinhold Aug 31, 2023
bff632d
add todos
JReinhold Sep 1, 2023
8eddd45
Merge branch 'next' of github.com:storybookjs/storybook into release-…
JReinhold Sep 8, 2023
ba8e5fe
cancel any release-preparation runs in progress
JReinhold Sep 8, 2023
a84e270
cleanup
JReinhold Sep 8, 2023
e1a2172
only consider open PRs when looking for frozen state
JReinhold Sep 8, 2023
4d569f2
update tests
JReinhold Sep 8, 2023
00a9089
Merge branch 'next' of github.com:storybookjs/storybook into release-…
JReinhold Sep 24, 2023
4bf6ba4
cleanup
JReinhold Sep 24, 2023
25ebf5c
fix type errors
JReinhold Sep 24, 2023
32ba0d9
Merge branch 'next' of github.com:storybookjs/storybook into release-…
JReinhold Sep 25, 2023
9ca7ed4
cancel when 0 patches to pick
JReinhold Sep 25, 2023
22f12e6
temp rename workflow to test
JReinhold Sep 25, 2023
e719c53
try number when reading pr-count
JReinhold Sep 25, 2023
d757590
compare less than 1
JReinhold Sep 25, 2023
8466a08
check non-null in pr count
JReinhold Sep 25, 2023
d83d422
rename patch workflow
JReinhold Sep 25, 2023
ca7f6f8
hotfix -> patch, next-release -> non-patch-release
JReinhold Oct 4, 2023
15b5933
more renaming
JReinhold Oct 4, 2023
ed18a24
move ensure-next-ahead from a bash script to a tested node script
JReinhold Oct 4, 2023
930adf4
move bash script to cancel preparation runs to tested node script
JReinhold Oct 4, 2023
0b35c18
Merge branch 'next' into release-stable-to-latest
JReinhold Oct 4, 2023
72837ae
fix tests
JReinhold Oct 4, 2023
406e0a5
Merge branch 'release-stable-to-latest' of github.com:storybookjs/sto…
JReinhold Oct 4, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ concurrency:
cancel-in-progress: true

jobs:
prepare-prerelease-pull-request:
prepare-non-patch-pull-request:
name: Prepare prerelease pull request
runs-on: ubuntu-latest
environment: release
Expand Down Expand Up @@ -112,21 +112,35 @@ jobs:
run: |
yarn release:version --deferred --release-type ${{ inputs.release-type || 'prerelease' }} ${{ inputs.pre-id && format('{0} {1}', '--pre-id', inputs.pre-id) || '' }} --verbose

- name: Check release vs prerelease
id: is-prerelease
run: yarn release:is-prerelease ${{ steps.bump-version.outputs.next-version }}

- name: Write changelog
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
yarn release:write-changelog ${{ steps.bump-version.outputs.next-version }} --verbose

- name: 'Commit changes to branch: version-prerelease-from-${{ steps.bump-version.outputs.current-version }}'
- name: 'Commit changes to branch: version-non-patch-from-${{ steps.bump-version.outputs.current-version }}'
working-directory: .
run: |
git config --global user.name 'storybook-bot'
git config --global user.email '[email protected]'
git checkout -b version-prerelease-from-${{ steps.bump-version.outputs.current-version }}
git checkout -b version-non-patch-from-${{ steps.bump-version.outputs.current-version }}
git add .
git commit -m "Write changelog for ${{ steps.bump-version.outputs.next-version }} [skip ci]" || true
git push --force origin version-non-patch-from-${{ steps.bump-version.outputs.current-version }}

- name: Resolve merge-conflicts with base branch
if: steps.is-prerelease.outputs.prerelease == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git pull origin latest-release
git checkout --ours .
git add .
git commit -m "Write changelog for ${{ steps.bump-version.outputs.next-version }}" || true
git push --force origin version-prerelease-from-${{ steps.bump-version.outputs.current-version }}
git commit -m "Merge latest-release into version-non-patch-from-${{ steps.bump-version.outputs.current-version }} with conflicts resolved to ours [skip ci]"

- name: Generate PR description
id: description
Expand All @@ -144,14 +158,15 @@ jobs:
gh pr edit \
--repo "${{github.repository }}" \
--title "Release: $CAPITALIZED_RELEASE_TYPE ${{ inputs.pre-id && format('{0} ', inputs.pre-id) }}${{ steps.bump-version.outputs.next-version }}" \
--base ${{ steps.is-prerelease.outputs.prerelease == 'true' && 'next-release' || 'latest-release' }} \
--body "${{ steps.description.outputs.description }}"
else
gh pr create \
--repo "${{github.repository }}"\
--title "Release: $CAPITALIZED_RELEASE_TYPE ${{ inputs.pre-id && format('{0} ', inputs.pre-id) }}${{ steps.bump-version.outputs.next-version }}" \
--label "release" \
--base next-release \
--head version-prerelease-from-${{ steps.bump-version.outputs.current-version }} \
--base ${{ steps.is-prerelease.outputs.prerelease == 'true' && 'next-release' || 'latest-release' }} \
--head version-non-patch-from-${{ steps.bump-version.outputs.current-version }} \
--body "${{ steps.description.outputs.description }}"
fi

Expand Down
11 changes: 10 additions & 1 deletion .github/workflows/prepare-patch-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,15 @@ jobs:
git config --global user.email '[email protected]'
yarn release:pick-patches

- name: Cancel when no patches to pick
if: steps.pick-patches.outputs.pr-count == '0' && steps.pick-patches.outputs.pr-count != null
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# From https://stackoverflow.com/a/75809743
run: |
gh run cancel ${{ github.run_id }}
gh run watch ${{ github.run_id }}

- name: Bump version deferred
id: bump-version
if: steps.unreleased-changes.outputs.has-changes-to-release == 'true'
Expand Down Expand Up @@ -121,7 +130,7 @@ jobs:
git config --global user.email '[email protected]'
git checkout -b version-patch-from-${{ steps.versions.outputs.current }}
git add .
git commit -m "Write changelog for ${{ steps.versions.outputs.next }}" || true
git commit -m "Write changelog for ${{ steps.versions.outputs.next }} [skip ci]" || true
git push --force origin version-patch-from-${{ steps.versions.outputs.current }}

- name: Generate PR description
Expand Down
61 changes: 50 additions & 11 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
push:
branches:
- latest-release
- next-release
- non-patch-release

env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
Expand Down Expand Up @@ -36,6 +36,22 @@ jobs:
gh run cancel ${{ github.run_id }}
gh run watch ${{ github.run_id }}

- name: Cancel all release preparation runs
run: |
# Get a list of all running or pending release preparation runs
# combining both the prepare-patch-release.yml and prepare-non-patch-release.yml workflows
RUNNING_RELEASE_PREPARATIONS=$(
{
gh run list --limit 50 --workflow=prepare-patch-release.yml --json databaseId,status
gh run list --limit 50 --workflow=prepare-non-patch-release.yml --json databaseId,status
} | jq -rc '.[] | select(.status | contains("in_progress", "pending", "queued", "requested", "waiting")) | .databaseId'
)

# Loop through each run and pass it to the "gh run cancel" command
while IFS= read -r databaseId; do
gh run cancel "$databaseId"
done <<< "$RUNNING_RELEASE_PREPARATIONS"

- name: Checkout ${{ github.ref_name }}
uses: actions/checkout@v3
with:
Expand Down Expand Up @@ -63,7 +79,6 @@ jobs:
yarn install

- name: Apply deferred version bump and commit
id: version-bump
working-directory: .
run: |
CURRENT_VERSION=$(cat ./code/package.json | jq '.version')
Expand Down Expand Up @@ -122,12 +137,11 @@ jobs:
run: git fetch --tags origin

# when this is a patch release from main, label any patch PRs included in the release
# when this is a stable release from next, label ALL patch PRs found, as they will per definition be "patched" now
- name: Label patch PRs as picked
if: github.ref_name == 'latest-release' || (steps.publish-needed.outputs.published == 'false' && steps.target.outputs.target == 'next' && !steps.is-prerelease.outputs.prerelease)
if: github.ref_name == 'latest-release'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: yarn release:label-patches ${{ steps.target.outputs.target == 'next' && '--all' || '' }}
run: yarn release:label-patches

- name: Create GitHub Release
if: steps.publish-needed.outputs.published == 'false'
Expand All @@ -151,16 +165,45 @@ jobs:
git merge ${{ github.ref_name }}
git push origin ${{ steps.target.outputs.target }}

# This step ensures that next is always one minor ahead of main
# this is needed when releasing a stable from next
# next will be at eg. 7.4.0-alpha.4, and main will be at 7.3.0
# then we release 7.4.0 by merging next to latest-release to main
# we then ensure here that next is bumped to 7.5.0 - without releasing it
# if this is a patch release bumping main to 7.3.1, next will not be touched because it's already ahead
- name: Ensure `next` is a minor version ahead of `main`
if: steps.target.outputs.target == 'main'
run: |
git checkout next
git pull

CODE_PKG_JSON=$(cat ../code/package.json)
VERSION_ON_NEXT=$(echo $CODE_PKG_JSON | jq --raw-output '.version')
VERSION_ON_MAIN="${{ steps.version.outputs.current-version }}"

# skip if next is already ahead of main
if NEXT_IS_AHEAD=$(npx semver --include-prerelease --range ">=$VERSION_ON_MAIN" "$VERSION_ON_NEXT" 2>/dev/null); then
return
fi

# temporarily set the version on next to be the same as main...
echo "$CODE_PKG_JSON" | jq --arg version "$VERSION_ON_MAIN" '.version = $version' > ../code/package.json
# ... then bump it by one minor
yarn release:version --release-type minor
git add ..
git commit -m "Bump next to be one minor ahead of main [skip ci]"
git push origin next

- name: Sync CHANGELOG.md from `main` to `next`
if: github.ref_name == 'latest-release'
if: steps.target.outputs.target == 'main'
working-directory: .
run: |
git fetch origin next
git checkout next
git pull
git checkout origin/main ./CHANGELOG.md
git add ./CHANGELOG.md
git commit -m "Update CHANGELOG.md for v${{ steps.version.outputs.current-version }} [skip ci]"
git commit -m "Update CHANGELOG.md for v${{ steps.version.outputs.current-version }} [skip ci]" || true
git push origin next

- name: Sync version JSONs from `next-release` to `main`
Expand All @@ -176,10 +219,6 @@ jobs:
git commit -m "Update $VERSION_FILE for v${{ steps.version.outputs.current-version }}"
git push origin main

- name: Overwrite main with next
if: steps.target.outputs.target == 'next' && steps.is-prerelease.outputs.prerelease == 'false'
run: git push --force origin next:main

- name: Report job failure to Discord
if: failure()
env:
Expand Down
Loading