Merge pull request #242 from vue-pivottable/fix/beta-release-issues #31
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: Release Develop (Pre-release) | |
on: | |
push: | |
branches: | |
- develop | |
concurrency: ${{ github.workflow }}-${{ github.ref }} | |
jobs: | |
pre-release: | |
name: Pre-release | |
runs-on: ubuntu-latest | |
permissions: | |
contents: write | |
issues: write | |
pull-requests: write | |
id-token: write | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Setup Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '22.10.0' | |
registry-url: 'https://registry.npmjs.org/' | |
- name: Setup pnpm | |
uses: pnpm/action-setup@v2 | |
with: | |
version: latest | |
- name: Install dependencies | |
run: pnpm install | |
- name: Check for changesets | |
id: changesets-check | |
run: | | |
if [ -n "$(ls -A .changeset/*.md 2>/dev/null | grep -v README.md)" ]; then | |
echo "has_changesets=true" >> $GITHUB_OUTPUT | |
else | |
echo "has_changesets=false" >> $GITHUB_OUTPUT | |
fi | |
- name: Version packages as beta | |
id: version | |
if: steps.changesets-check.outputs.has_changesets == 'true' | |
run: | | |
# Store original versions before changeset | |
ORIGINAL_MAIN=$(node -p "require('./package.json').version" | sed 's/-beta\.[0-9]*//g') | |
declare -A ORIGINAL_VERSIONS | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json" ]; then | |
PKG_NAME=$(basename "$pkg") | |
ORIGINAL_VERSIONS[$PKG_NAME]=$(cd "$pkg" && node -p "require('./package.json').version" | sed 's/-beta\.[0-9]*//g') | |
fi | |
done | |
# Apply changesets and consume them | |
pnpm changeset version | |
# Check for version changes and update to beta | |
TIMESTAMP=$(date +%s) | |
CHANGED_PACKAGES="" | |
# Check main package | |
NEW_MAIN=$(node -p "require('./package.json').version") | |
if [ "$ORIGINAL_MAIN" != "$NEW_MAIN" ]; then | |
BETA_VERSION="${NEW_MAIN}-beta.${TIMESTAMP}" | |
npm version $BETA_VERSION --no-git-tag-version | |
CHANGED_PACKAGES="vue-pivottable" | |
fi | |
# Check sub-packages | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json" ]; then | |
cd "$pkg" | |
PKG_NAME=$(basename "$pkg") | |
NEW_VERSION=$(node -p "require('./package.json').version") | |
# Only add beta if version changed | |
if [ "${ORIGINAL_VERSIONS[$PKG_NAME]}" != "$NEW_VERSION" ]; then | |
PKG_BETA="${NEW_VERSION}-beta.${TIMESTAMP}" | |
npm version $PKG_BETA --no-git-tag-version | |
CHANGED_PACKAGES="$CHANGED_PACKAGES $PKG_NAME" | |
fi | |
cd - | |
fi | |
done | |
# Store package.json files before changeset modifications | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json" ]; then | |
cp "$pkg/package.json" "$pkg/package.json.backup" | |
fi | |
done | |
# Commit all changes | |
git config user.name "github-actions[bot]" | |
git config user.email "github-actions[bot]@users.noreply.github.com" | |
git add -A | |
git commit -m "chore: prepare beta release | |
Changed packages: $CHANGED_PACKAGES" | |
# Restore peerDependencies from backup to prevent beta version pollution | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json.backup" ]; then | |
cd "$pkg" | |
# Extract peerDependencies from backup and apply to current | |
node -e " | |
const fs = require('fs'); | |
const backup = JSON.parse(fs.readFileSync('./package.json.backup', 'utf8')); | |
const current = JSON.parse(fs.readFileSync('./package.json', 'utf8')); | |
if (backup.peerDependencies) { | |
current.peerDependencies = backup.peerDependencies; | |
} | |
fs.writeFileSync('./package.json', JSON.stringify(current, null, 2) + '\\n'); | |
" | |
rm -f package.json.backup | |
cd - | |
fi | |
done | |
# Commit peerDependencies fix if there are changes | |
if ! git diff --quiet; then | |
git add -A | |
git commit -m "fix: restore peerDependencies to prevent beta version pollution" | |
fi | |
git push origin develop | |
# Always use current main package version for GitHub release tag | |
CURRENT_VERSION=$(node -p "require('./package.json').version") | |
echo "version=${CURRENT_VERSION}" >> $GITHUB_OUTPUT | |
- name: Run quality checks | |
if: steps.changesets-check.outputs.has_changesets == 'true' | |
run: | | |
echo "Running type checks..." | |
pnpm typecheck | |
pnpm -r typecheck || true | |
echo "Running linting..." | |
pnpm lint | |
pnpm -r lint || true | |
- name: Build packages | |
if: steps.changesets-check.outputs.has_changesets == 'true' | |
run: | | |
set -e # Exit immediately if any command fails | |
echo "Building main package first..." | |
pnpm build # Build main package first to generate type declarations | |
echo "Building sub-packages..." | |
pnpm -r --filter './packages/*' build # Build sub-packages after main | |
- name: Create GitHub Pre-releases | |
if: steps.changesets-check.outputs.has_changesets == 'true' | |
run: | | |
# Create release for each package with beta version | |
create_release() { | |
local PKG_NAME=$1 | |
local PKG_VERSION=$2 | |
local NPM_NAME=$3 | |
echo "Creating release for $PKG_NAME@$PKG_VERSION" | |
gh release create "${PKG_NAME}@${PKG_VERSION}" \ | |
--title "${PKG_NAME}@${PKG_VERSION}" \ | |
--notes "## 🚧 Pre-release (Beta) | |
This is a pre-release version. It may contain bugs and breaking changes. | |
Install with: \`npm install ${NPM_NAME}@beta\` | |
### Version: ${PKG_VERSION}" \ | |
--prerelease \ | |
--target ${{ github.sha }} | |
} | |
# Check main package | |
MAIN_VERSION=$(node -p "require('./package.json').version") | |
if [[ $MAIN_VERSION == *"-beta"* ]]; then | |
create_release "vue-pivottable" "$MAIN_VERSION" "vue-pivottable" | |
fi | |
# Check sub-packages | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json" ]; then | |
PKG_NAME=$(cd "$pkg" && node -p "require('./package.json').name") | |
PKG_VERSION=$(cd "$pkg" && node -p "require('./package.json').version") | |
if [[ $PKG_VERSION == *"-beta"* ]]; then | |
create_release "$PKG_NAME" "$PKG_VERSION" "$PKG_NAME" | |
fi | |
fi | |
done | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
- name: Publish pre-release to npm | |
if: steps.changesets-check.outputs.has_changesets == 'true' | |
run: | | |
# Publish with beta tag only after GitHub release is created | |
RELEASE_TAG=beta node scripts/release-packages.cjs | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} | |
NPM_TOKEN_SUMIN: ${{ secrets.NPM_TOKEN_SUMIN }} | |
- name: Create or Update PR to main | |
if: steps.changesets-check.outputs.has_changesets == 'true' | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
# 현재 버전 가져오기 | |
VERSION=$(node -p "require('./package.json').version") | |
# 기존 PR 확인 | |
PR_NUMBER=$(gh pr list --base main --head develop --state open --json number -q '.[0].number') | |
if [ -z "$PR_NUMBER" ]; then | |
# 새 PR 생성 | |
gh pr create \ | |
--base main \ | |
--head develop \ | |
--title "Release: $VERSION" \ | |
--body "## 🚀 Release $VERSION | |
This PR contains the latest beta release ready for production. | |
### Beta Version | |
- $VERSION | |
### Packages to be released | |
- vue-pivottable: $VERSION | |
- Check sub-packages for version updates | |
### Pre-release Testing | |
- Beta version has been published to npm with tag @beta | |
- Install with: \`npm install vue-pivottable@beta\` | |
### Release Notes | |
See [CHANGELOG.md](./CHANGELOG.md) for details. | |
--- | |
⚠️ **Note**: This PR will be automatically updated if new changes are pushed to develop." | |
else | |
# 기존 PR 업데이트 | |
echo "Updating existing PR #$PR_NUMBER with new beta version..." | |
gh pr edit $PR_NUMBER \ | |
--title "Release: $VERSION" \ | |
--body "## 🚀 Release $VERSION (Updated) | |
This PR has been automatically updated with the latest beta release. | |
### Current Beta Version | |
- $VERSION | |
### Packages to be released | |
- vue-pivottable: $VERSION | |
- Check sub-packages for version updates | |
### Pre-release Testing | |
- Beta version has been published to npm with tag @beta | |
- Install with: \`npm install vue-pivottable@beta\` | |
### ⚠️ Important | |
**This PR has been updated with new commits. Please review the changes again.** | |
### Release Notes | |
See [CHANGELOG.md](./CHANGELOG.md) for details. | |
--- | |
Last updated: $(date -u +"%Y-%m-%d %H:%M:%S UTC")" | |
# PR을 ready for review 상태로 설정 | |
gh pr ready $PR_NUMBER | |
# auto-updated 라벨 추가 | |
gh pr edit $PR_NUMBER --add-label "auto-updated,needs-review" | |
fi |