Finalize Release #74
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Finalize Release | |
permissions: | |
contents: write | |
packages: write | |
on: | |
workflow_run: | |
workflows: ['E2E Tests (Release)'] | |
types: | |
- completed | |
jobs: | |
prepare: | |
runs-on: ubuntu-latest | |
if: github.event.workflow_run.conclusion == 'success' | |
outputs: | |
version: ${{ steps.extract_version.outputs.version }} | |
tag_name: ${{ steps.extract_version.outputs.tag_name }} | |
triggered_by: ${{ steps.extract_version.outputs.triggered_by }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Extract version from workflow run | |
id: extract_version | |
run: | | |
# Extract from the triggering workflow's commit | |
git fetch --tags | |
# Find the tag that points to the head_sha | |
TAG_NAME=$(git tag --points-at ${{ github.event.workflow_run.head_sha }} | grep '^v' | head -1) | |
if [ -z "$TAG_NAME" ]; then | |
echo "❌ No version tag found for commit ${{ github.event.workflow_run.head_sha }}" | |
echo "Available tags pointing to this commit:" | |
git tag --points-at ${{ github.event.workflow_run.head_sha }} || echo "None" | |
exit 1 | |
fi | |
# Extract version from tag (remove 'v' prefix) | |
if [[ $TAG_NAME =~ ^v(.+)$ ]]; then | |
VERSION="${BASH_REMATCH[1]}" | |
else | |
echo "❌ Tag $TAG_NAME does not match expected format (v*)" | |
exit 1 | |
fi | |
echo "Found tag: $TAG_NAME" | |
echo "Extracted version: $VERSION" | |
echo "version=$VERSION" >> $GITHUB_OUTPUT | |
echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT | |
echo "triggered_by=${{ github.event.workflow_run.id }}" >> $GITHUB_OUTPUT | |
promote-to-latest: | |
needs: prepare | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Setup | |
uses: ./.github/actions/setup | |
- name: Setup NPM authentication | |
env: | |
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} | |
run: | | |
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> .npmrc | |
- name: Promote packages to latest | |
run: | | |
npm dist-tag add @motiadev/core@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add @motiadev/workbench@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add @motiadev/stream-client@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add @motiadev/stream-client-browser@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add @motiadev/stream-client-node@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add @motiadev/stream-client-react@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add motia@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add @motiadev/test@${{ needs.prepare.outputs.version }} latest | |
npm dist-tag add @motiadev/ui@${{ needs.prepare.outputs.version }} latest | |
- name: Remove pre-release tag | |
run: | | |
npm dist-tag rm @motiadev/core pre-release || true | |
npm dist-tag rm @motiadev/workbench pre-release || true | |
npm dist-tag rm @motiadev/stream-client pre-release || true | |
npm dist-tag rm @motiadev/stream-client-browser pre-release || true | |
npm dist-tag rm @motiadev/stream-client-node pre-release || true | |
npm dist-tag rm @motiadev/stream-client-react pre-release || true | |
npm dist-tag rm motia pre-release || true | |
npm dist-tag rm @motiadev/test pre-release || true | |
npm dist-tag rm @motiadev/ui pre-release || true | |
create-github-release: | |
needs: [prepare, promote-to-latest] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Generate token | |
id: generate_token | |
uses: actions/create-github-app-token@v1 | |
with: | |
app-id: ${{ secrets.MOTIA_CI_APP_ID }} | |
private-key: ${{ secrets.MOTIA_CI_APP_PRIVATE_KEY }} | |
permissions: >- | |
{ | |
"contents": "write", | |
"packages": "write", | |
"metadata": "read" | |
} | |
- uses: actions/checkout@v4 | |
with: | |
token: ${{ steps.generate_token.outputs.token }} | |
fetch-depth: 0 | |
- name: Generate changelog | |
id: changelog | |
run: | | |
# Get the previous tag | |
PREVIOUS_TAG=$(git describe --tags --abbrev=0 ${{ needs.prepare.outputs.tag_name }}^) | |
echo "Previous tag: $PREVIOUS_TAG" | |
# Generate changelog | |
CHANGELOG=$(git log $PREVIOUS_TAG..${{ needs.prepare.outputs.tag_name }} --pretty=format:"* %s (%h)" --no-merges) | |
# Create release notes | |
cat > release_notes.md << EOF | |
## What's Changed | |
$CHANGELOG | |
## Package Versions | |
- @motiadev/core@${{ needs.prepare.outputs.version }} | |
- @motiadev/workbench@${{ needs.prepare.outputs.version }} | |
- @motiadev/stream-client-browser@${{ needs.prepare.outputs.version }} | |
- @motiadev/stream-client-react@${{ needs.prepare.outputs.version }} | |
- motia@${{ needs.prepare.outputs.version }} | |
- @motiadev/test@${{ needs.prepare.outputs.version }} | |
- @motiadev/ui@${{ needs.prepare.outputs.version }} | |
## Installation | |
\`\`\`bash | |
npm install motia@${{ needs.prepare.outputs.version }} | |
\`\`\` | |
**Full Changelog**: https://github.com/${{ github.repository }}/compare/$PREVIOUS_TAG..${{ needs.prepare.outputs.tag_name }} | |
EOF | |
- name: Create GitHub Release | |
uses: actions/github-script@v7 | |
with: | |
github-token: ${{ steps.generate_token.outputs.token }} | |
script: | | |
const fs = require('fs'); | |
const releaseNotes = fs.readFileSync('release_notes.md', 'utf8'); | |
const release = await github.rest.repos.createRelease({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
tag_name: '${{ needs.prepare.outputs.tag_name }}', | |
name: 'Motia ${{ needs.prepare.outputs.version }}', | |
body: releaseNotes, | |
draft: false, | |
prerelease: false | |
}); | |
console.log('Release created:', release.data.html_url); | |
commit-version-changes: | |
needs: [prepare, create-github-release] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Generate token | |
id: generate_token | |
uses: actions/create-github-app-token@v1 | |
with: | |
app-id: ${{ secrets.MOTIA_CI_APP_ID }} | |
private-key: ${{ secrets.MOTIA_CI_APP_PRIVATE_KEY }} | |
permissions: >- | |
{ | |
"contents": "write", | |
"metadata": "read" | |
} | |
- uses: actions/checkout@v4 | |
with: | |
token: ${{ steps.generate_token.outputs.token }} | |
- name: Setup | |
uses: ./.github/actions/setup | |
- name: Set version on all packages | |
run: | | |
pnpm -r --filter "@motiadev/*" exec pnpm version ${{ needs.prepare.outputs.version }} --no-git-tag-version | |
pnpm -r --filter motia exec pnpm version ${{ needs.prepare.outputs.version }} --no-git-tag-version | |
- name: Commit version changes | |
run: | | |
git config user.name "GitHub Actions" | |
git config user.email "[email protected]" | |
git add . | |
git commit -m "chore: release version ${{ needs.prepare.outputs.version }}" || echo "No changes to commit" | |
git push origin main | |
env: | |
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} |