chore: PR #253에 대한 changeset 추가 (#255) #51
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 | |
# Store package.json files BEFORE changeset to preserve peerDependencies | |
echo "Backing up peerDependencies before changeset..." | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json" ]; then | |
cp "$pkg/package.json" "$pkg/package.json.backup" | |
echo "✓ Backed up $pkg/package.json" | |
fi | |
done | |
# Apply changesets and consume them | |
pnpm changeset version | |
# Ensure beta versions on develop branch | |
TIMESTAMP=$(date +%s) | |
CHANGED_PACKAGES="" | |
# Function to update beta timestamp (preserving version increments) | |
update_beta_timestamp() { | |
local current_version=$1 | |
local timestamp=$2 | |
# If already has beta suffix, replace only the timestamp | |
if [[ "$current_version" == *"-beta."* ]]; then | |
echo "$current_version" | sed "s/-beta\.[0-9]*$/-beta.${timestamp}/" | |
else | |
# Add beta suffix to non-beta versions | |
echo "${current_version}-beta.${timestamp}" | |
fi | |
} | |
# Apply beta suffixes to packages | |
echo "Applying beta timestamps to packages..." | |
# Check main package | |
NEW_MAIN=$(node -p "require('./package.json').version") | |
# If version changed OR doesn't have beta suffix, update it | |
if [ "$ORIGINAL_MAIN" != "$NEW_MAIN" ] || [[ "$NEW_MAIN" != *"-beta."* ]]; then | |
# If already has beta, just update timestamp; otherwise add beta | |
if [[ "$NEW_MAIN" == *"-beta."* ]]; then | |
BETA_MAIN=$(echo "$NEW_MAIN" | sed "s/-beta\.[0-9]*$/-beta.${TIMESTAMP}/") | |
else | |
BETA_MAIN="${NEW_MAIN}-beta.${TIMESTAMP}" | |
fi | |
npm version $BETA_MAIN --no-git-tag-version | |
CHANGED_PACKAGES="vue-pivottable" | |
echo "✓ Updated vue-pivottable: $NEW_MAIN → $BETA_MAIN" | |
else | |
echo "✓ vue-pivottable unchanged: $NEW_MAIN" | |
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") | |
# If version changed OR doesn't have beta suffix, update it | |
if [ "${ORIGINAL_VERSIONS[$PKG_NAME]}" != "$NEW_VERSION" ] || [[ "$NEW_VERSION" != *"-beta."* ]]; then | |
# If already has beta, just update timestamp; otherwise add beta | |
if [[ "$NEW_VERSION" == *"-beta."* ]]; then | |
BETA_VERSION=$(echo "$NEW_VERSION" | sed "s/-beta\.[0-9]*$/-beta.${TIMESTAMP}/") | |
else | |
BETA_VERSION="${NEW_VERSION}-beta.${TIMESTAMP}" | |
fi | |
npm version $BETA_VERSION --no-git-tag-version | |
CHANGED_PACKAGES="$CHANGED_PACKAGES $PKG_NAME" | |
echo "✓ Updated $PKG_NAME: $NEW_VERSION → $BETA_VERSION" | |
else | |
echo "✓ $PKG_NAME unchanged: $NEW_VERSION" | |
fi | |
cd - | |
fi | |
done | |
# Restore peerDependencies from backup to prevent auto-update | |
echo "Restoring peerDependencies from backup..." | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json.backup" ]; then | |
cd "$pkg" | |
echo "Restoring peerDependencies for $(basename "$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) { | |
console.log('Restoring peerDependencies:', backup.peerDependencies); | |
current.peerDependencies = backup.peerDependencies; | |
fs.writeFileSync('./package.json', JSON.stringify(current, null, 2) + '\\n'); | |
} | |
" | |
cd - | |
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" | |
# Clean up backup files | |
for pkg in packages/*/; do | |
if [ -d "$pkg" ] && [ -f "$pkg/package.json.backup" ]; then | |
rm -f "$pkg/package.json.backup" | |
fi | |
done | |
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 "Checking if release ${PKG_NAME}@${PKG_VERSION} already exists..." | |
# Check if release already exists | |
if gh release view "${PKG_NAME}@${PKG_VERSION}" &>/dev/null; then | |
echo "⚠️ Release ${PKG_NAME}@${PKG_VERSION} already exists, skipping..." | |
return 0 | |
fi | |
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 |