Skip to content

Merge pull request #242 from vue-pivottable/fix/beta-release-issues #31

Merge pull request #242 from vue-pivottable/fix/beta-release-issues

Merge pull request #242 from vue-pivottable/fix/beta-release-issues #31

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