Skip to content

Finalize Release

Finalize Release #74

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 }}