Skip to content

Merge pull request #81 from nativeui-org/changeset-release/main #221

Merge pull request #81 from nativeui-org/changeset-release/main

Merge pull request #81 from nativeui-org/changeset-release/main #221

Workflow file for this run

name: Release (Changesets)
on:
push:
branches: [main]
tags-ignore:
- '**'
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
id-token: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.CHANGESETS_TOKEN }}
- uses: pnpm/action-setup@v4
with: { version: 10 }
- uses: actions/setup-node@v4
with:
node-version: 20
registry-url: https://registry.npmjs.org/
- run: pnpm install --frozen-lockfile
- name: Build packages
run: |
pnpm -r --filter @native-ui-org/native-modules run build
pnpm install --frozen-lockfile
pnpm -r --filter @native-ui-org/primitives run build
- name: Configure pnpm for npm
run: |
echo "@native-ui-org:registry=https://registry.npmjs.org/" >> ~/.npmrc
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> ~/.npmrc
env:
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Create Release PR or Publish
id: changesets
uses: changesets/action@v1
with:
version: pnpm changeset version
publish: pnpm changeset publish --filter '!@native-ui-org/sandbox' --filter '!@native-ui-org/website'
createGithubReleases: false
title: "chore: release primitives"
env:
GITHUB_TOKEN: ${{ secrets.CHANGESETS_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Create custom GitHub Releases
if: steps.changesets.outputs.published == 'true'
run: |
for package in $(echo '${{ steps.changesets.outputs.publishedPackages }}' | jq -r '.[] | @base64'); do
pkg=$(echo "$package" | base64 --decode | jq -r '.name')
version=$(echo "$package" | base64 --decode | jq -r '.version')
shortName=$(echo "$pkg" | sed 's/@native-ui-org\///')
tag="${shortName}@${version}"
# Skip if tag already exists
if git rev-parse "$tag" >/dev/null 2>&1; then
echo "ℹ️ Tag ${tag} already exists, skipping this package"
continue
fi
git tag "$tag"
git push origin "$tag"
changelogContent=""
if [ "$shortName" = "sandbox" ]; then
changelogFile="apps/sandbox/CHANGELOG.md"
else
changelogFile="packages/${shortName}/CHANGELOG.md"
fi
if [ -f "$changelogFile" ]; then
changelogContent=$(awk "/^## \[${version}\]/,/^## \[/" "$changelogFile" | head -n -1)
fi
releaseTitle="${shortName}@${version}"
releaseNotesFile=$(mktemp)
echo "## 🚀 Release ${version}" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
if [ -n "$changelogContent" ]; then
echo "### 📝 Changelog" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "$changelogContent" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
fi
echo "### 📥 Installation" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "\`\`\`bash" >> "$releaseNotesFile"
echo "npm install ${pkg}" >> "$releaseNotesFile"
echo "\`\`\`" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
case "$shortName" in
"primitives")
echo "### 📚 Documentation" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "Visit [primitives.nativeui.io](https://primitives.nativeui.io) for full documentation." >> "$releaseNotesFile"
;;
"native-modules")
echo "### 📚 Documentation" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "Visit [primitives.nativeui.io](https://primitives.nativeui.io) for full documentation." >> "$releaseNotesFile"
;;
esac
gh release create "$tag" \
--title "$releaseTitle" \
--notes-file "$releaseNotesFile" \
--repo nativeui-org/primitives
rm "$releaseNotesFile"
done
env:
GITHUB_TOKEN: ${{ secrets.CHANGESETS_TOKEN }}
- name: Release Apps (Sandbox & Website)
if: always()
run: |
echo "🔍 Checking for app version changes in this commit..."
echo "Files changed:"
git diff HEAD^ HEAD --name-only
echo ""
# Check sandbox
if git diff HEAD^ HEAD --name-only | grep -q "apps/sandbox/package.json"; then
sandboxVersion=$(jq -r '.version' apps/sandbox/package.json)
tag="sandbox@${sandboxVersion}"
echo "📦 Sandbox version changed to ${sandboxVersion}"
# Check if release already exists
if gh release view "$tag" --repo nativeui-org/primitives >/dev/null 2>&1; then
echo "ℹ️ Release ${tag} already exists, skipping"
else
echo "✅ Creating release for ${tag}"
# Create tag if doesn't exist
if ! git rev-parse "$tag" >/dev/null 2>&1; then
git tag "$tag"
git push origin "$tag"
fi
# Create GitHub Release
releaseNotesFile=$(mktemp)
echo "## 🚀 Sandbox ${sandboxVersion}" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "### 🌐 Live Demo" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "Visit [sandbox-primitives.nativeui.io](https://sandbox-primitives.nativeui.io)" >> "$releaseNotesFile"
gh release create "$tag" \
--title "$tag" \
--notes-file "$releaseNotesFile" \
--repo nativeui-org/primitives
rm "$releaseNotesFile"
echo "✅ Sandbox release created → Vercel deployment will start"
fi
else
echo "ℹ️ No sandbox version change detected"
fi
# Check website
if git diff HEAD^ HEAD --name-only | grep -q "apps/website/package.json"; then
websiteVersion=$(jq -r '.version' apps/website/package.json)
tag="website@${websiteVersion}"
echo "📦 Website version changed to ${websiteVersion}"
# Check if release already exists
if gh release view "$tag" --repo nativeui-org/primitives >/dev/null 2>&1; then
echo "ℹ️ Release ${tag} already exists, skipping"
else
echo "✅ Creating release for ${tag}"
# Create tag if doesn't exist
if ! git rev-parse "$tag" >/dev/null 2>&1; then
git tag "$tag"
git push origin "$tag"
fi
# Create GitHub Release
releaseNotesFile=$(mktemp)
echo "## 🚀 Website ${websiteVersion}" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "### 📚 Documentation" >> "$releaseNotesFile"
echo "" >> "$releaseNotesFile"
echo "Visit [primitives.nativeui.io](https://primitives.nativeui.io)" >> "$releaseNotesFile"
gh release create "$tag" \
--title "$tag" \
--notes-file "$releaseNotesFile" \
--repo nativeui-org/primitives
rm "$releaseNotesFile"
echo "✅ Website release created → Vercel deployment will start"
fi
else
echo "ℹ️ No website version change detected"
fi
env:
GITHUB_TOKEN: ${{ secrets.CHANGESETS_TOKEN }}