diff --git a/.github/workflows/integrate-develop.yml b/.github/workflows/integrate-develop.yml new file mode 100644 index 0000000..0a506dd --- /dev/null +++ b/.github/workflows/integrate-develop.yml @@ -0,0 +1,157 @@ +name: Integrate Develop to Staging + +on: + push: + branches: + - develop + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + create-or-update-pr: + name: Create or Update PR to Staging + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: 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' + + - name: Check for existing PR + id: check-pr + run: | + EXISTING_PR=$(gh pr list --base staging --head develop --json number --jq '.[0].number' || echo "") + + if [ -n "$EXISTING_PR" ]; then + echo "pr_exists=true" >> $GITHUB_OUTPUT + echo "pr_number=$EXISTING_PR" >> $GITHUB_OUTPUT + echo "Found existing PR #$EXISTING_PR" + else + echo "pr_exists=false" >> $GITHUB_OUTPUT + echo "No existing PR found" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Get commit information + id: commit-info + run: | + # Fetch staging branch + git fetch origin staging:staging || echo "Staging branch not found" + + # Get the latest commits from develop that aren't in staging + if git rev-parse --verify origin/staging >/dev/null 2>&1; then + COMMITS=$(git log --pretty=format:"- %s (%h)" origin/staging..HEAD | head -20) + COMMIT_COUNT=$(git rev-list --count origin/staging..HEAD) + else + COMMITS=$(git log --pretty=format:"- %s (%h)" HEAD | head -20) + COMMIT_COUNT=$(git rev-list --count HEAD) + fi + + # Escape for GitHub Actions output + COMMITS="${COMMITS//'%'/'%25'}" + COMMITS="${COMMITS//$'\n'/'%0A'}" + COMMITS="${COMMITS//$'\r'/'%0D'}" + + echo "commits<> $GITHUB_OUTPUT + echo "$COMMITS" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + echo "commit_count=$COMMIT_COUNT" >> $GITHUB_OUTPUT + + # Get timestamp + TIMESTAMP=$(date -u +"%Y-%m-%d %H:%M:%S UTC") + echo "timestamp=$TIMESTAMP" >> $GITHUB_OUTPUT + + - name: Create PR to staging + if: steps.check-pr.outputs.pr_exists == 'false' + run: | + COMMIT_COUNT="${{ steps.commit-info.outputs.commit_count }}" + TIMESTAMP="${{ steps.commit-info.outputs.timestamp }}" + + # Create PR body file + { + echo "## ๐Ÿš€ Integration from develop to staging" + echo "" + echo "### ๐Ÿ“Š Summary" + echo "- **Commits**: ${COMMIT_COUNT} new commits" + echo "- **Created**: ${TIMESTAMP}" + echo "- **Auto-generated**: This PR was automatically created by the integration workflow" + echo "" + echo "### ๐Ÿ“ Recent Commits" + echo "${{ steps.commit-info.outputs.commits }}" + echo "" + echo "### ๐Ÿ” What happens next?" + echo "1. Review the changes in this PR" + echo "2. Run any necessary QA tests" + echo "3. When approved and merged, the staging workflow will:" + echo " - Check for changesets" + echo " - If found, create beta releases" + echo " - Automatically create a PR to main" + echo "" + echo "### โšก Notes" + echo "- This PR will be automatically updated with new commits to develop" + echo "- Multiple features can accumulate in this single PR" + echo "- Approval triggers the beta release process" + } > pr-body.md + + gh pr create \ + --base staging \ + --head develop \ + --title "๐Ÿ”„ Integrate develop โ†’ staging" \ + --body-file pr-body.md \ + --label "auto-updated" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Update existing PR + if: steps.check-pr.outputs.pr_exists == 'true' + run: | + PR_NUMBER="${{ steps.check-pr.outputs.pr_number }}" + COMMIT_COUNT="${{ steps.commit-info.outputs.commit_count }}" + TIMESTAMP="${{ steps.commit-info.outputs.timestamp }}" + COMMITS="${{ steps.commit-info.outputs.commits }}" + + # Update PR title with commit count + gh pr edit $PR_NUMBER \ + --title "๐Ÿ”„ Integrate develop โ†’ staging (${COMMIT_COUNT} commits)" + + # Get current PR body + CURRENT_BODY=$(gh pr view $PR_NUMBER --json body --jq '.body') + + # Create updated section + UPDATED_SECTION="### ๐Ÿ”„ Last Updated: ${TIMESTAMP}\nNew commits: ${COMMIT_COUNT}\n\n### ๐Ÿ“ Recent Commits\n${COMMITS}" + + # Update or append the updated section + if echo "$CURRENT_BODY" | grep -q "### ๐Ÿ”„ Last Updated:"; then + # Replace existing update section + NEW_BODY=$(echo "$CURRENT_BODY" | sed '/### ๐Ÿ”„ Last Updated:/,/### ๐Ÿ“ Recent Commits/d' | sed '/^$/d') + NEW_BODY="$NEW_BODY\n\n$UPDATED_SECTION" + else + # Append update section + NEW_BODY="$CURRENT_BODY\n\n---\n\n$UPDATED_SECTION" + fi + + # Update PR body + echo "$NEW_BODY" > pr-body-update.md + gh pr edit $PR_NUMBER --body-file pr-body-update.md + + # Add labels + gh pr edit $PR_NUMBER \ + --add-label "needs-review" + + # Set as ready for review + gh pr ready $PR_NUMBER || true + + echo "โœ… Updated PR #${PR_NUMBER} with ${COMMIT_COUNT} new commits" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release-develop.yml b/.github/workflows/legacy/release-develop.yml.bak similarity index 100% rename from .github/workflows/release-develop.yml rename to .github/workflows/legacy/release-develop.yml.bak diff --git a/.github/workflows/release.yml b/.github/workflows/legacy/release.yml.bak similarity index 100% rename from .github/workflows/release.yml rename to .github/workflows/legacy/release.yml.bak diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index 9c29efe..2bb2c91 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -5,6 +5,7 @@ on: branches: - main - develop + - staging jobs: lint-and-type-check: diff --git a/.github/workflows/release-staging.yml b/.github/workflows/release-staging.yml new file mode 100644 index 0000000..f5b2bac --- /dev/null +++ b/.github/workflows/release-staging.yml @@ -0,0 +1,262 @@ +name: Release Staging (Beta) + +on: + push: + branches: + - staging + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + +jobs: + check-changesets: + name: Check for Changesets + runs-on: ubuntu-latest + outputs: + has_changesets: ${{ steps.check.outputs.has_changesets }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check for changesets + id: check + run: | + if [ -d ".changeset" ] && [ "$(ls -A .changeset/*.md 2>/dev/null | grep -v README.md)" ]; then + echo "has_changesets=true" >> $GITHUB_OUTPUT + echo "โœ… Found changesets to process" + else + echo "has_changesets=false" >> $GITHUB_OUTPUT + echo "โญ๏ธ No changesets found, skipping release" + fi + + release-beta: + name: Release Beta Versions + needs: check-changesets + if: needs.check-changesets.outputs.has_changesets == 'true' + 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: Run quality checks + run: | + echo "Running type checks..." + pnpm typecheck + pnpm -r typecheck || true + + echo "Running linting..." + pnpm lint + pnpm -r lint || true + + - name: Create beta versions + id: changesets + run: | + # Configure git + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # Run changesets version with beta + pnpm changeset version + + # Add beta suffix to all updated packages + TIMESTAMP=$(date +%s) + + # Update main package if version changed + if git diff --name-only | grep -q "^package.json$"; then + CURRENT_VERSION=$(node -p "require('./package.json').version") + BETA_VERSION="${CURRENT_VERSION}-beta.${TIMESTAMP}" + npm version $BETA_VERSION --no-git-tag-version + echo "Main package: $CURRENT_VERSION โ†’ $BETA_VERSION" + fi + + # Update sub-packages if versions changed + for pkg in packages/*/; do + if [ -d "$pkg" ] && git diff --name-only | grep -q "^$pkg"; then + cd "$pkg" + if git diff --name-only | grep -q "package.json"; then + CURRENT_VERSION=$(node -p "require('./package.json').version") + BETA_VERSION="${CURRENT_VERSION}-beta.${TIMESTAMP}" + npm version $BETA_VERSION --no-git-tag-version + PKG_NAME=$(basename "$pkg") + echo "$PKG_NAME: $CURRENT_VERSION โ†’ $BETA_VERSION" + fi + cd - > /dev/null + fi + done + + # Commit all changes + git add -A + git commit -m "chore: version packages for beta release" || echo "No changes to commit" + + - name: Build packages + run: | + echo "Building all packages..." + pnpm build:all + + - name: Publish beta packages + id: publish + run: | + # Publish with beta tag + RELEASE_TAG=beta node scripts/release-packages.cjs + + # Collect published versions + echo "published_versions<> $GITHUB_OUTPUT + echo "### Published Beta Versions" >> $GITHUB_OUTPUT + + # Check main package + MAIN_VERSION=$(node -p "require('./package.json').version") + echo "- vue-pivottable@$MAIN_VERSION" >> $GITHUB_OUTPUT + + # 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") + echo "- $PKG_NAME@$PKG_VERSION" >> $GITHUB_OUTPUT + fi + done + echo "EOF" >> $GITHUB_OUTPUT + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN_SUMIN: ${{ secrets.NPM_TOKEN_SUMIN }} + + - name: Push changes + run: | + git push origin staging + + - name: Check for existing PR to main + id: check-pr + run: | + EXISTING_PR=$(gh pr list --base main --head staging --json number --jq '.[0].number' || echo "") + + if [ -n "$EXISTING_PR" ]; then + echo "pr_exists=true" >> $GITHUB_OUTPUT + echo "pr_number=$EXISTING_PR" >> $GITHUB_OUTPUT + else + echo "pr_exists=false" >> $GITHUB_OUTPUT + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create PR to main + if: steps.check-pr.outputs.pr_exists == 'false' + run: | + # Get the main package version for PR title + MAIN_VERSION=$(node -p "require('./package.json').version") + + gh pr create \ + --base main \ + --head staging \ + --title "๐Ÿš€ Release: Beta versions ready for production" \ + --body "## ๐ŸŽฏ Beta Release Ready for Production + +${{ steps.publish.outputs.published_versions }} + +### ๐Ÿ“‹ What happens next? +1. Review and test the beta versions +2. When approved and merged, this will: + - Update package.json versions (remove beta suffix) + - Generate/update CHANGELOG.md files + - Sync changes back to develop and staging + - **Note**: npm publish happens only when you create a version tag + +### ๐Ÿท๏ธ After merge: +Create a version tag to trigger production release: +\`\`\`bash +git checkout main +git pull origin main +git tag v\${VERSION} +git push origin v\${VERSION} +\`\`\` + +### ๐Ÿ“ฆ Install beta versions: +\`\`\`bash +npm install vue-pivottable@beta +# or specific sub-packages +npm install @vue-pivottable/plotly-renderer@beta +npm install @vue-pivottable/lazy-table-renderer@beta +\`\`\` + +--- +*This PR was automatically created by the staging release workflow*" \ + --label "released" \ + --label "auto-updated" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Update existing PR + if: steps.check-pr.outputs.pr_exists == 'true' + run: | + TIMESTAMP=$(date -u +"%Y-%m-%d %H:%M:%S UTC") + PR_NUMBER="${{ steps.check-pr.outputs.pr_number }}" + PUBLISHED_VERSIONS="${{ steps.publish.outputs.published_versions }}" + + cat > pr-body-update.md << EOF +## ๐ŸŽฏ Beta Release Ready for Production + +### โฐ Last Updated: $TIMESTAMP + +$PUBLISHED_VERSIONS + +### ๐Ÿ“‹ What happens next? +1. Review and test the beta versions +2. When approved and merged, this will: + - Update package.json versions (remove beta suffix) + - Generate/update CHANGELOG.md files + - Sync changes back to develop and staging + - **Note**: npm publish happens only when you create a version tag + +### ๐Ÿท๏ธ After merge: +Create a version tag to trigger production release: +\`\`\`bash +git checkout main +git pull origin main +git tag v\${VERSION} +git push origin v\${VERSION} +\`\`\` + +### ๐Ÿ“ฆ Install beta versions: +\`\`\`bash +npm install vue-pivottable@beta +# or specific sub-packages +npm install @vue-pivottable/plotly-renderer@beta +npm install @vue-pivottable/lazy-table-renderer@beta +\`\`\` + +--- +*This PR was automatically updated by the staging release workflow* +EOF + + # Update PR body with new beta versions + gh pr edit $PR_NUMBER --body-file pr-body-update.md + + # Update labels + gh pr edit $PR_NUMBER \ + --add-label "needs-review" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml new file mode 100644 index 0000000..5cffe31 --- /dev/null +++ b/.github/workflows/release-tag.yml @@ -0,0 +1,185 @@ +name: Release Production (Tag) + +on: + push: + tags: + - 'v*.*.*' + +jobs: + release-production: + name: Release to Production + 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: Validate tag + id: tag-info + run: | + TAG_NAME=${GITHUB_REF#refs/tags/} + echo "tag=$TAG_NAME" >> $GITHUB_OUTPUT + + # Extract version from tag + VERSION=${TAG_NAME#v} + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # Validate version format + if ! [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?$ ]]; then + echo "โŒ Invalid version format: $VERSION" + exit 1 + fi + + echo "โœ… Valid tag: $TAG_NAME (version: $VERSION)" + + - 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: Verify versions match + run: | + TAG_VERSION="${{ steps.tag-info.outputs.version }}" + + # Check main package version + MAIN_VERSION=$(node -p "require('./package.json').version") + if [ "$MAIN_VERSION" != "$TAG_VERSION" ]; then + echo "โš ๏ธ Warning: Main package version ($MAIN_VERSION) doesn't match tag ($TAG_VERSION)" + # This is not a fatal error as we might be releasing sub-packages + else + echo "โœ… Main package version matches tag: $MAIN_VERSION" + fi + + - name: Run quality checks + run: | + echo "Running type checks..." + pnpm typecheck + pnpm -r typecheck || true + + echo "Running linting..." + pnpm lint + pnpm -r lint || true + + - name: Build packages + run: | + echo "Building all packages..." + pnpm build:all + + - name: Publish to npm + id: publish + run: | + echo "Publishing packages with @latest tag..." + + # Publish packages + node scripts/release-packages.cjs + + # Collect published packages + echo "published_packages<> $GITHUB_OUTPUT + + # Check which packages were published + MAIN_VERSION=$(node -p "require('./package.json').version") + echo "- vue-pivottable@$MAIN_VERSION" >> $GITHUB_OUTPUT + + 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") + echo "- $PKG_NAME@$PKG_VERSION" >> $GITHUB_OUTPUT + fi + done + echo "EOF" >> $GITHUB_OUTPUT + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN_SUMIN: ${{ secrets.NPM_TOKEN_SUMIN }} + + - name: Get release notes + id: release-notes + run: | + # Try to extract release notes from CHANGELOG.md + NOTES="" + + if [ -f "CHANGELOG.md" ]; then + # Extract notes for this version + VERSION="${{ steps.tag-info.outputs.version }}" + NOTES=$(awk "/^## $VERSION/,/^## [0-9]/" CHANGELOG.md | sed '1d;$d' | head -n 20) + fi + + if [ -z "$NOTES" ]; then + NOTES="See CHANGELOG.md for details" + fi + + # Escape for GitHub Actions + NOTES="${NOTES//'%'/'%25'}" + NOTES="${NOTES//$'\n'/'%0A'}" + NOTES="${NOTES//$'\r'/'%0D'}" + + echo "notes<> $GITHUB_OUTPUT + echo "$NOTES" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Create GitHub Release + run: | + TAG="${{ steps.tag-info.outputs.tag }}" + VERSION="${{ steps.tag-info.outputs.version }}" + PUBLISHED_PACKAGES="${{ steps.publish.outputs.published_packages }}" + RELEASE_NOTES="${{ steps.release-notes.outputs.notes }}" + + cat > release-notes.md << EOF +## ๐Ÿš€ Production Release $VERSION + +### ๐Ÿ“ฆ Published Packages +$PUBLISHED_PACKAGES + +### ๐Ÿ“ Release Notes +$RELEASE_NOTES + +### ๐Ÿ’ป Installation +\`\`\`bash +npm install vue-pivottable@latest +# or specific packages +npm install @vue-pivottable/plotly-renderer@latest +npm install @vue-pivottable/lazy-table-renderer@latest +\`\`\` + +### ๐Ÿ”— Links +- [npm: vue-pivottable](https://www.npmjs.com/package/vue-pivottable) +- [npm: @vue-pivottable/plotly-renderer](https://www.npmjs.com/package/@vue-pivottable/plotly-renderer) +- [npm: @vue-pivottable/lazy-table-renderer](https://www.npmjs.com/package/@vue-pivottable/lazy-table-renderer) + +--- +*Released by GitHub Actions* +EOF + + gh release create "$TAG" \ + --title "Release $TAG" \ + --notes-file release-notes.md + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create release summary + run: | + echo "## ๐ŸŽ‰ Production Release Complete!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐Ÿ“ฆ Released Version: ${{ steps.tag-info.outputs.tag }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐Ÿ“š Published Packages" >> $GITHUB_STEP_SUMMARY + echo "${{ steps.publish.outputs.published_packages }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐Ÿ”— View Release" >> $GITHUB_STEP_SUMMARY + echo "[GitHub Release](https://github.com/${{ github.repository }}/releases/tag/${{ steps.tag-info.outputs.tag }})" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/.github/workflows/update-version.yml b/.github/workflows/update-version.yml new file mode 100644 index 0000000..8baa775 --- /dev/null +++ b/.github/workflows/update-version.yml @@ -0,0 +1,247 @@ +name: Update Version in Main + +on: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: false + +jobs: + check-versions: + name: Check for Beta Versions + runs-on: ubuntu-latest + outputs: + has_beta: ${{ steps.check.outputs.has_beta }} + base_version: ${{ steps.check.outputs.base_version }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Check for beta versions + id: check + run: | + HAS_BETA=false + BASE_VERSION="" + + # Check main package + MAIN_VERSION=$(node -p "require('./package.json').version") + if [[ $MAIN_VERSION == *"-beta"* ]]; then + HAS_BETA=true + BASE_VERSION=$(echo $MAIN_VERSION | sed 's/-beta.*//') + echo "Found beta in main package: $MAIN_VERSION โ†’ $BASE_VERSION" + fi + + # Check sub-packages + for pkg in packages/*/; do + if [ -d "$pkg" ] && [ -f "$pkg/package.json" ]; then + PKG_VERSION=$(cd "$pkg" && node -p "require('./package.json').version") + if [[ $PKG_VERSION == *"-beta"* ]]; then + HAS_BETA=true + PKG_BASE=$(echo $PKG_VERSION | sed 's/-beta.*//') + PKG_NAME=$(basename "$pkg") + echo "Found beta in $PKG_NAME: $PKG_VERSION โ†’ $PKG_BASE" + fi + fi + done + + echo "has_beta=$HAS_BETA" >> $GITHUB_OUTPUT + echo "base_version=$BASE_VERSION" >> $GITHUB_OUTPUT + + update-versions: + name: Update Versions and Sync + needs: check-versions + if: needs.check-versions.outputs.has_beta == 'true' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22.10.0' + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: Install dependencies + run: pnpm install + + - name: Configure git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Update versions + id: version-update + run: | + echo "๐Ÿ“ Updating package versions..." + + # Use changeset version to update versions properly + pnpm changeset version + + # Remove any remaining beta suffixes + # Update main package + MAIN_VERSION=$(node -p "require('./package.json').version") + if [[ $MAIN_VERSION == *"-beta"* ]]; then + CLEAN_VERSION=$(echo $MAIN_VERSION | sed 's/-beta.*//') + npm version $CLEAN_VERSION --no-git-tag-version + echo "Updated main package to $CLEAN_VERSION" + fi + + # Update sub-packages + for pkg in packages/*/; do + if [ -d "$pkg" ] && [ -f "$pkg/package.json" ]; then + cd "$pkg" + PKG_VERSION=$(node -p "require('./package.json').version") + if [[ $PKG_VERSION == *"-beta"* ]]; then + CLEAN_VERSION=$(echo $PKG_VERSION | sed 's/-beta.*//') + npm version $CLEAN_VERSION --no-git-tag-version + PKG_NAME=$(basename "$pkg") + echo "Updated $PKG_NAME to $CLEAN_VERSION" + fi + cd - > /dev/null + fi + done + + # Get final version for output + FINAL_VERSION=$(node -p "require('./package.json').version") + echo "version=$FINAL_VERSION" >> $GITHUB_OUTPUT + + - name: Commit version updates + run: | + git add -A + git commit -m "chore: update versions to stable + + - Remove beta suffixes + - Update CHANGELOG.md files + - Prepare for production release" || echo "No changes to commit" + + - name: Push to main + run: | + git push origin main + + - name: Sync to develop + run: | + echo "๐Ÿ”„ Syncing changes to develop branch..." + + # Fetch latest develop + git fetch origin develop:develop + + # Create sync branch + SYNC_BRANCH="sync/main-to-develop-$(date +%s)" + git checkout -b $SYNC_BRANCH + + # Merge main changes + git merge main --no-ff -m "chore: sync version updates from main" + + # Push sync branch + git push origin $SYNC_BRANCH + + # Create PR + VERSION="${{ steps.version-update.outputs.version }}" + + { + echo "## ๐Ÿ”„ Version Sync from Main" + echo "" + echo "### ๐Ÿ“ฆ Updated Versions" + echo "This PR syncs the stable version updates from main to develop." + echo "" + echo "Version: **v$VERSION**" + echo "" + echo "### โšก Auto-merge" + echo "This PR should be merged automatically to keep branches in sync." + echo "" + echo "---" + echo "*This PR was automatically created by the version update workflow*" + } > pr-body.md + + gh pr create \ + --base develop \ + --head $SYNC_BRANCH \ + --title "๐Ÿ”„ Sync: main โ†’ develop (v$VERSION)" \ + --body-file pr-body.md \ + --label "auto-updated" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Sync to staging + run: | + echo "๐Ÿ”„ Syncing changes to staging branch..." + + # Checkout main again + git checkout main + + # Fetch latest staging + git fetch origin staging:staging + + # Create sync branch + SYNC_BRANCH="sync/main-to-staging-$(date +%s)" + git checkout -b $SYNC_BRANCH + + # Merge main changes + git merge main --no-ff -m "chore: sync version updates from main" + + # Push sync branch + git push origin $SYNC_BRANCH + + # Create PR + VERSION="${{ steps.version-update.outputs.version }}" + + { + echo "## ๐Ÿ”„ Version Sync from Main" + echo "" + echo "### ๐Ÿ“ฆ Updated Versions" + echo "This PR syncs the stable version updates from main to staging." + echo "" + echo "Version: **v$VERSION**" + echo "" + echo "### โšก Auto-merge" + echo "This PR should be merged automatically to keep branches in sync." + echo "" + echo "---" + echo "*This PR was automatically created by the version update workflow*" + } > pr-body-staging.md + + gh pr create \ + --base staging \ + --head $SYNC_BRANCH \ + --title "๐Ÿ”„ Sync: main โ†’ staging (v$VERSION)" \ + --body-file pr-body-staging.md \ + --label "auto-updated" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create release summary + run: | + VERSION="${{ steps.version-update.outputs.version }}" + + echo "## โœ… Version Update Complete" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐Ÿ“ฆ Version: v$VERSION" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐Ÿท๏ธ Next Steps" >> $GITHUB_STEP_SUMMARY + echo "To publish this version to npm, create and push a tag:" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY + echo "git checkout main" >> $GITHUB_STEP_SUMMARY + echo "git pull origin main" >> $GITHUB_STEP_SUMMARY + echo "git tag v$VERSION" >> $GITHUB_STEP_SUMMARY + echo "git push origin v$VERSION" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐Ÿ”„ Sync PRs Created" >> $GITHUB_STEP_SUMMARY + echo "- PR to develop branch" >> $GITHUB_STEP_SUMMARY + echo "- PR to staging branch" >> $GITHUB_STEP_SUMMARY \ No newline at end of file diff --git a/RELEASE_STRATEGY.ko.md b/RELEASE_STRATEGY.ko.md index 80e3f0d..c467d31 100644 --- a/RELEASE_STRATEGY.ko.md +++ b/RELEASE_STRATEGY.ko.md @@ -4,43 +4,43 @@ ## ๊ฐœ์š” -์ด ๋ฌธ์„œ๋Š” Changesets๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ํŒจํ‚ค์ง€ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ง€์›ํ•˜๋Š” vue3-pivottable ๋ชจ๋…ธ๋ ˆํฌ์˜ ๋ฆด๋ฆฌ์Šค ์ „๋žต์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. +์ด ๋ฌธ์„œ๋Š” ์ž๋™ํ™”๋œ ์›Œํฌํ”Œ๋กœ์šฐ, Changesets๋ฅผ ํ†ตํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” vue3-pivottable ๋ชจ๋…ธ๋ ˆํฌ์˜ ๋ฆด๋ฆฌ์Šค ์ „๋žต์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ## ๋ฆด๋ฆฌ์Šค ํ”Œ๋กœ์šฐ ```mermaid sequenceDiagram - participant F as feature ๋ธŒ๋žœ์น˜ + participant F as feature/fix ๋ธŒ๋žœ์น˜ participant D as develop + participant S as staging participant M as main - participant R as release/vX.X.X + participant T as Tags participant NPM as npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ Note over F,D: 1. ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ F->>D: changesets์™€ ํ•จ๊ป˜ PR - D-->>D: ์ฝ”๋“œ ๋ฆฌ๋ทฐ & ๋จธ์ง€ + D->>D: ์ฝ”๋“œ ๋ฆฌ๋ทฐ & ๋จธ์ง€ - Note over D,NPM: 2. ๋ฒ ํƒ€ ๋ฆด๋ฆฌ์Šค (์ž๋™) - D-->>D: Changesets ์†Œ๋น„ - D-->>D: ๋ฒ„์ „ bump + beta ์ ‘๋ฏธ์‚ฌ - D-->>D: ํ’ˆ์งˆ ์ฒดํฌ (lint, typecheck) - D-->>D: ๋ชจ๋“  ํŒจํ‚ค์ง€ ๋นŒ๋“œ - D->>NPM: @beta ํผ๋ธ”๋ฆฌ์‹œ - D-->>D: ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ + Note over D,S: 2. Staging์œผ๋กœ ์ž๋™ PR + D->>S: ์ž๋™ PR ์ƒ์„ฑ + D->>S: ์ถ”๊ฐ€ ์ปค๋ฐ‹ ๋ˆ„์  - Note over D,M: 3. ํ”„๋กœ๋•์…˜ ์ค€๋น„ - D->>M: PR (๋ฒ ํƒ€ ๋ฒ„์ „, changesets ์—†์Œ) - M-->>M: ๋ฆฌ๋ทฐ & ๋จธ์ง€ + Note over S,NPM: 3. ๋ฒ ํƒ€ ๋ฆด๋ฆฌ์Šค (PR ์Šน์ธ) + S->>S: ๋ฒ ํƒ€ ๋ฒ„์ „ ์ƒ์„ฑ + S->>S: ํ’ˆ์งˆ ์ฒดํฌ & ๋นŒ๋“œ + S->>NPM: @beta ํผ๋ธ”๋ฆฌ์‹œ + S->>M: main์œผ๋กœ ์ž๋™ PR - Note over M,NPM: 4. ์•ˆ์ • ๋ฆด๋ฆฌ์Šค (์ž๋™) - M->>R: ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ - R-->>R: beta ์ ‘๋ฏธ์‚ฌ๋งŒ ์ œ๊ฑฐ - R-->>R: ํ’ˆ์งˆ ์ฒดํฌ & ๋นŒ๋“œ - R->>NPM: @latest ํผ๋ธ”๋ฆฌ์‹œ + Note over M,T: 4. ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ (PR ์Šน์ธ) + M->>M: Changeset version ์—…๋ฐ์ดํŠธ + M->>M: package.json & CHANGELOG ์—…๋ฐ์ดํŠธ + M->>D: develop์œผ๋กœ ์ž๋™ ๋™๊ธฐํ™” + M->>S: staging์œผ๋กœ ์ž๋™ ๋™๊ธฐํ™” - Note over R,M: 5. ๋™๊ธฐํ™” - R->>M: main ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ PR - M-->>M: ๋จธ์ง€ (main์— ์•ˆ์ • ๋ฒ„์ „ ๋ฐ˜์˜) + Note over T,NPM: 5. ํ”„๋กœ๋•์…˜ ๋ฆด๋ฆฌ์Šค (ํƒœ๊ทธ) + T->>T: ๋ฒ„์ „ ํƒœ๊ทธ ์ƒ์„ฑ (v1.2.0) + T->>NPM: @latest ํผ๋ธ”๋ฆฌ์‹œ + T->>T: GitHub Release ์ƒ์„ฑ ``` ## ๋ธŒ๋žœ์น˜ ์ฑ…์ž„ @@ -48,30 +48,42 @@ sequenceDiagram ### develop ๋ธŒ๋žœ์น˜ - **๋ชฉ์ **: ๋ชจ๋“  ๊ธฐ๋Šฅ์˜ ํ†ตํ•ฉ ๋ธŒ๋žœ์น˜ - **์ž๋™ ์ž‘์—…**: - - changesets ์†Œ๋น„ (ํŒŒ์ผ ์‚ญ์ œ๋จ) - - changesets ๊ธฐ๋ฐ˜ ๋ฒ„์ „ bump - - ํƒ€์ž„์Šคํƒฌํ”„์™€ ํ•จ๊ป˜ beta ์ ‘๋ฏธ์‚ฌ ์ถ”๊ฐ€ - - ํ’ˆ์งˆ ์ฒดํฌ ์‹คํ–‰ (ESLint, TypeScript) - - ๋ชจ๋“  ํŒจํ‚ค์ง€ ๋นŒ๋“œ - - @beta ํƒœ๊ทธ๋กœ npm์— ํผ๋ธ”๋ฆฌ์‹œ - - ๋ฒ„์ „ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ develop์— ์ปค๋ฐ‹ + - push ์‹œ staging์œผ๋กœ ์ž๋™ PR ์ƒ์„ฑ + - ๊ธฐ์กด staging PR์— ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ˆ„์  + - ์ง€์†์  ํ†ตํ•ฉ ์ฒดํฌ + +### staging ๋ธŒ๋žœ์น˜ +- **๋ชฉ์ **: QA ํ…Œ์ŠคํŠธ ๋ฐ ๋ฒ ํƒ€ ๋ฆด๋ฆฌ์Šค +- **PR ๋จธ์ง€ ์‹œ ์ž๋™ ์ž‘์—…**: + - ๋ˆ„์ ๋œ changesets ํ™•์ธ + - changesets๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ: + - changesets ์†Œ๋น„ (ํŒŒ์ผ ์‚ญ์ œ) + - ๋ฒ ํƒ€ ๋ฒ„์ „ ์ƒ์„ฑ (x.y.z-beta.timestamp) + - ํ’ˆ์งˆ ์ฒดํฌ ์‹คํ–‰ (ESLint, TypeScript) + - ๋ชจ๋“  ํŒจํ‚ค์ง€ ๋นŒ๋“œ + - @beta ํƒœ๊ทธ๋กœ npm์— ํผ๋ธ”๋ฆฌ์‹œ + - main์œผ๋กœ ์ž๋™ PR ์ƒ์„ฑ + - changesets๊ฐ€ ์—†์œผ๋ฉด: ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค ๊ฑด๋„ˆ๋›ฐ๊ธฐ ### main ๋ธŒ๋žœ์น˜ -- **๋ชฉ์ **: ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์ฝ”๋“œ๋งŒ -- **๋ณดํ˜ธ**: ์ง์ ‘ ํ‘ธ์‹œ ๋ถˆ๊ฐ€ -- **์ž๋™ ์ž‘์—…**: - - release/vX.X.X ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ - - changeset ์ฒ˜๋ฆฌ ์—†์Œ (develop์—์„œ ์ด๋ฏธ ์™„๋ฃŒ) - - ์•ˆ์ • ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค ํŠธ๋ฆฌ๊ฑฐ - -### release/vX.X.X ๋ธŒ๋žœ์น˜ -- **๋ชฉ์ **: ์•ˆ์ • ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•œ ์ž„์‹œ ๋ธŒ๋žœ์น˜ +- **๋ชฉ์ **: ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์ฝ”๋“œ +- **๋ณดํ˜ธ**: ์ง์ ‘ ์ปค๋ฐ‹ ๋ถˆ๊ฐ€ (PR๋งŒ ๊ฐ€๋Šฅ) +- **PR ๋จธ์ง€ ์‹œ ์ž๋™ ์ž‘์—…**: + - `changeset version` ์‹คํ–‰ + - package.json ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ + - CHANGELOG.md ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ + - ๋ฒ„์ „ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ปค๋ฐ‹ + - develop๊ณผ staging์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋™๊ธฐํ™” + - **npm ํผ๋ธ”๋ฆฌ์‹œํ•˜์ง€ ์•Š์Œ** + +### Tags (v*.*.*) +- **๋ชฉ์ **: ํ”„๋กœ๋•์…˜ ๋ฆด๋ฆฌ์Šค ํŠธ๋ฆฌ๊ฑฐ +- **์ƒ์„ฑ**: main ์—…๋ฐ์ดํŠธ ํ›„ ์ˆ˜๋™ - **์ž๋™ ์ž‘์—…**: - - ๋ฒ„์ „์—์„œ beta ์ ‘๋ฏธ์‚ฌ ์ œ๊ฑฐ - - ํ’ˆ์งˆ ์ฒดํฌ ์‹คํ–‰ + - ํƒœ๊ทธ๋œ ์ปค๋ฐ‹์—์„œ ์ฒดํฌ์•„์›ƒ - ๋ชจ๋“  ํŒจํ‚ค์ง€ ๋นŒ๋“œ - @latest ํƒœ๊ทธ๋กœ npm์— ํผ๋ธ”๋ฆฌ์‹œ - - main์œผ๋กœ ๋‹ค์‹œ PR ์ƒ์„ฑ + - GitHub Release ์ƒ์„ฑ ## ํŒจํ‚ค์ง€ ๋…๋ฆฝ์„ฑ @@ -114,14 +126,16 @@ graph TD # ๋ฉ”์ธ ํŒจํ‚ค์ง€์˜ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ์œ„ํ•œ Changeset "vue-pivottable": patch -# develop์—์„œ์˜ ๊ฒฐ๊ณผ: +# staging์—์„œ์˜ ๊ฒฐ๊ณผ: vue-pivottable: 1.1.1 โ†’ 1.1.2-beta.1234567890 @vue-pivottable/plotly-renderer: 2.0.0 (๋ณ€๊ฒฝ ์—†์Œ) @vue-pivottable/lazy-table-renderer: 1.0.13 (๋ณ€๊ฒฝ ์—†์Œ) -# main/release์—์„œ์˜ ๊ฒฐ๊ณผ: -vue-pivottable: 1.1.2-beta.1234567890 โ†’ 1.1.2 -# ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋Š” ํผ๋ธ”๋ฆฌ์‹œ๋˜์ง€ ์•Š์Œ +# main ๋จธ์ง€ ํ›„ ๊ฒฐ๊ณผ: +vue-pivottable: 1.1.2 (๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋จ, ํผ๋ธ”๋ฆฌ์‹œ ์•ˆ ๋จ) + +# v1.1.2 ํƒœ๊ทธ ์ƒ์„ฑ ํ›„: +vue-pivottable: 1.1.2 โ†’ npm @latest ``` ### ์‹œ๋‚˜๋ฆฌ์˜ค 2: ๋‹ค์ค‘ ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ @@ -130,15 +144,16 @@ vue-pivottable: 1.1.2-beta.1234567890 โ†’ 1.1.2 "vue-pivottable": minor "@vue-pivottable/plotly-renderer": minor -# develop์—์„œ์˜ ๊ฒฐ๊ณผ: +# staging์—์„œ์˜ ๊ฒฐ๊ณผ: vue-pivottable: 1.1.1 โ†’ 1.2.0-beta.1234567890 @vue-pivottable/plotly-renderer: 2.0.0 โ†’ 2.1.0-beta.1234567890 -@vue-pivottable/lazy-table-renderer: 1.0.13 (๋ณ€๊ฒฝ ์—†์Œ) -# main/release์—์„œ์˜ ๊ฒฐ๊ณผ: -vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 -@vue-pivottable/plotly-renderer: 2.1.0-beta.1234567890 โ†’ 2.1.0 -# lazy-table-renderer๋Š” ํผ๋ธ”๋ฆฌ์‹œ๋˜์ง€ ์•Š์Œ +# main ๋จธ์ง€ ํ›„ ๊ฒฐ๊ณผ: +vue-pivottable: 1.2.0 (์—…๋ฐ์ดํŠธ๋จ) +@vue-pivottable/plotly-renderer: 2.1.0 (์—…๋ฐ์ดํŠธ๋จ) + +# v1.2.0 ํƒœ๊ทธ ์ƒ์„ฑ ํ›„: +๋‘ ํŒจํ‚ค์ง€ ๋ชจ๋‘ โ†’ npm @latest ``` ## ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ @@ -158,19 +173,30 @@ vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 ## ์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ ### 1. `.github/workflows/pr-check.yml` -- **ํŠธ๋ฆฌ๊ฑฐ**: main ๋˜๋Š” develop์œผ๋กœ์˜ PR +- **ํŠธ๋ฆฌ๊ฑฐ**: ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋กœ์˜ PR - **์ฒดํฌ**: Lint, TypeCheck, Build, Changesets - **๋ชฉ์ **: ๋จธ์ง€ ์ „ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ณด์žฅ -### 2. `.github/workflows/release-develop.yml` +### 2. `.github/workflows/integrate-develop.yml` - **ํŠธ๋ฆฌ๊ฑฐ**: develop์œผ๋กœ ํ‘ธ์‹œ -- **์ž‘์—…**: ๋ฒ„์ „ ๊ด€๋ฆฌ, ๋นŒ๋“œ, @beta ํผ๋ธ”๋ฆฌ์‹œ -- **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: changesets ์†Œ๋น„ +- **์ž‘์—…**: staging์œผ๋กœ PR ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ +- **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: ๋‹ค์ค‘ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ˆ„์  + +### 3. `.github/workflows/release-staging.yml` +- **ํŠธ๋ฆฌ๊ฑฐ**: staging์œผ๋กœ ํ‘ธ์‹œ +- **์กฐ๊ฑด**: changesets๊ฐ€ ์กด์žฌํ•  ๋•Œ (develop์—์„œ ๋ˆ„์ ๋จ) +- **์ž‘์—…**: ๋ฒ ํƒ€ ๋ฒ„์ „, ๋นŒ๋“œ, @beta ํผ๋ธ”๋ฆฌ์‹œ +- **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: changesets ์†Œ๋น„, main์œผ๋กœ ์ž๋™ PR + +### 4. `.github/workflows/update-version.yml` +- **ํŠธ๋ฆฌ๊ฑฐ**: main์œผ๋กœ ํ‘ธ์‹œ (๋ฒ ํƒ€ ๋ฒ„์ „ ํฌํ•จ) +- **์ž‘์—…**: ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ, ๋ธŒ๋žœ์น˜ ๋™๊ธฐํ™” +- **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: npm ํผ๋ธ”๋ฆฌ์‹œ ์•ˆ ํ•จ -### 3. `.github/workflows/release.yml` -- **ํŠธ๋ฆฌ๊ฑฐ**: main์œผ๋กœ ํ‘ธ์‹œ -- **์ž‘์—…**: beta ์ ‘๋ฏธ์‚ฌ ์ œ๊ฑฐ, ๋นŒ๋“œ, @latest ํผ๋ธ”๋ฆฌ์‹œ -- **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: changeset ๋ถˆํ•„์š” +### 5. `.github/workflows/release-tag.yml` +- **ํŠธ๋ฆฌ๊ฑฐ**: ํƒœ๊ทธ ํ‘ธ์‹œ (v*.*.*) +- **์ž‘์—…**: ๋นŒ๋“œ, @latest ํผ๋ธ”๋ฆฌ์‹œ +- **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ## ๋ณด์•ˆ @@ -181,15 +207,16 @@ vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 ### ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ - main: PR ํ•„์ˆ˜, ์ง์ ‘ ํ‘ธ์‹œ ๋ถˆ๊ฐ€ -- develop: CI ์ปค๋ฐ‹์„ ์œ„ํ•ด ์—ด๋ ค์žˆ์Œ -- release/*: ์ž„์‹œ, ์ž๋™ ์ƒ์„ฑ +- staging: PR ํ•„์ˆ˜, ์ง์ ‘ ํ‘ธ์‹œ ๋ถˆ๊ฐ€ +- develop: PR ํ•„์ˆ˜, ์ง์ ‘ ํ‘ธ์‹œ ๋ถˆ๊ฐ€ ## ๋ช…๋ น์–ด ์ฐธ์กฐ | ๋ช…๋ น์–ด | ์„ค๋ช… | |---------|-------------| -| `pnpm changeset add` | ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ changeset ์ถ”๊ฐ€ | +| `pnpm changeset` | ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ changeset ์ถ”๊ฐ€ | | `pnpm changeset status` | ๋Œ€๊ธฐ ์ค‘์ธ changesets ํ™•์ธ | +| `pnpm changeset version` | changesets๋ฅผ ๋ฒ„์ „์— ์ ์šฉ | | `pnpm build:all` | ๋ชจ๋“  ํŒจํ‚ค์ง€ ๋นŒ๋“œ | | `pnpm typecheck` | TypeScript ์ฒดํฌ ์‹คํ–‰ | | `pnpm lint` | ESLint ์‹คํ–‰ | @@ -198,60 +225,87 @@ vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 ## ๋ชจ๋ฒ” ์‚ฌ๋ก€ 1. **ํ•ญ์ƒ changesets ์ถ”๊ฐ€** - ๋ฆด๋ฆฌ์Šค๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•ด -2. **๋ฒ ํƒ€์—์„œ ๋จผ์ € ํ…Œ์ŠคํŠธ** - main์œผ๋กœ ์Šน์ธํ•˜๊ธฐ ์ „์— npm @beta ํ™•์ธ -3. **๋…๋ฆฝ ๋ฒ„์ „** - ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋Š” bumpํ•˜์ง€ ์•Š์Œ -4. **ํ’ˆ์งˆ ์šฐ์„ ** - ํผ๋ธ”๋ฆฌ์‹œ ์ „ ๋ชจ๋“  ์ฒดํฌ ํ†ต๊ณผ ํ•„์ˆ˜ +2. **๋ฒ ํƒ€์—์„œ ๋จผ์ € ํ…Œ์ŠคํŠธ** - staging์ด ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ œ๊ณต +3. **์ž๋™ PR ๊ฒ€ํ† ** - ์Šน์ธ ์ „ ์ž๋™ํ™”๋œ PR ํ™•์ธ +4. **main ์—…๋ฐ์ดํŠธ ํ›„ ํƒœ๊ทธ** - main์—์„œ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ํ›„์—๋งŒ ํƒœ๊ทธ ์ƒ์„ฑ ## ๋ฆด๋ฆฌ์Šค ํ”„๋กœ์„ธ์Šค ์ค‘ ์—…๋ฐ์ดํŠธ ์ฒ˜๋ฆฌ -### ์‹œ๋‚˜๋ฆฌ์˜ค: main์œผ๋กœ์˜ PR ์ดํ›„ develop ๋ณ€๊ฒฝ์‚ฌํ•ญ +### ์‹œ๋‚˜๋ฆฌ์˜ค: ์ง€์†์ ์ธ ๊ฐœ๋ฐœ ํ”Œ๋กœ์šฐ -develop์—์„œ main์œผ๋กœ์˜ PR์ด ์ด๋ฏธ ์—ด๋ ค์žˆ๊ณ  develop์— ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ํ‘ธ์‹œ๋˜๋Š” ๊ฒฝ์šฐ: +์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์ง„ํ–‰ ์ค‘์ธ ๊ฐœ๋ฐœ์„ ์›ํ™œํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค: 1. **์ž๋™ PR ์—…๋ฐ์ดํŠธ** - - release-develop ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๊ธฐ์กด PR์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ - - PR ์ œ๋ชฉ์„ ์ƒˆ ๋ฒ ํƒ€ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ - - PR ์„ค๋ช…์— ํƒ€์ž„์Šคํƒฌํ”„์™€ ์ƒˆ ๋ฒ„์ „ ์ •๋ณด ์—…๋ฐ์ดํŠธ - - `auto-updated`์™€ `needs-review` ๋ผ๋ฒจ ์ถ”๊ฐ€ - - PR์„ "ready for review" ์ƒํƒœ๋กœ ์„ค์ • - -2. **๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค** - - ๋ฆฌ๋ทฐ์–ด๋Š” ๋ผ๋ฒจ์„ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ ์•Œ๋ฆผ์„ ๋ฐ›์Œ - - ์ด์ „ ์Šน์ธ์€ ์œ ์ง€๋˜์ง€๋งŒ ์žฌ๊ฒ€ํ†  ๊ถŒ์žฅ - - PR ์„ค๋ช…์— ๋ช…ํ™•ํ•œ "Updated" ์ƒํƒœ์™€ ํƒ€์ž„์Šคํƒฌํ”„ ํ‘œ์‹œ - -3. **์žฅ์ ** - - PR ํžˆ์Šคํ† ๋ฆฌ์™€ ํ† ๋ก  ๋‚ด์šฉ ๋ณด์กด - - ์ˆ˜๋™ ๊ฐœ์ž… ๋ถˆํ•„์š” - - ๋ชจ๋“  ๋ฒ ํƒ€ ๋ฒ„์ „์˜ ๋ช…ํ™•ํ•œ ๊ฐ์‚ฌ ์ถ”์  + - develop โ†’ staging PR์ด ์ƒˆ ์ปค๋ฐ‹ ๋ˆ„์  + - ๊ฐ ์ถ”๊ฐ€์‚ฌํ•ญ๋งˆ๋‹ค PR ์„ค๋ช… ์—…๋ฐ์ดํŠธ + - ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ/์ˆ˜์ •์„ ์œ„ํ•œ ๋‹จ์ผ PR + +2. **๋ฒ ํƒ€ ๋ฒ„์ „ ๊ด€๋ฆฌ** + - ๊ฐ staging ๋จธ์ง€๋งˆ๋‹ค ์ƒˆ ๋ฒ ํƒ€ ๋ฒ„์ „ ์ƒ์„ฑ + - ์ด์ „ ๋ฒ ํƒ€ ๋ฒ„์ „๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ + - ๋ช…ํ™•ํ•œ ๋ฒ„์ „ ์ง„ํ–‰ ์ถ”์  + +3. **๋™๊ธฐํ™”** + - main ์—…๋ฐ์ดํŠธ๊ฐ€ develop/staging์œผ๋กœ ๋˜๋Œ์•„๊ฐ + - ๋ธŒ๋žœ์น˜ ๊ฐ„ ์ฐจ์ด ๋ฐฉ์ง€ + - ์„ ํ˜• ํžˆ์Šคํ† ๋ฆฌ ์œ ์ง€ ### ์˜ˆ์‹œ ํ”Œ๋กœ์šฐ ``` -1. v1.2.0-beta.1234567890 โ†’ PR #123 ์ƒ์„ฑ -2. develop์— ์ƒˆ๋กœ์šด ์ˆ˜์ •์‚ฌํ•ญ ํ‘ธ์‹œ -3. v1.2.1-beta.2345678901 โ†’ PR #123 ์ž๋™ ์—…๋ฐ์ดํŠธ -4. ๋ฆฌ๋ทฐ์–ด๊ฐ€ "auto-updated" ๋ผ๋ฒจ ํ™•์ธ ํ›„ ์žฌ๊ฒ€ํ†  -5. ์Šน์ธ ํ›„ main์œผ๋กœ ๋จธ์ง€ํ•˜๋ฉด ์•ˆ์ • ๋ฆด๋ฆฌ์Šค ํŠธ๋ฆฌ๊ฑฐ +1. ๊ธฐ๋Šฅ A๋ฅผ develop์— ๋จธ์ง€ โ†’ staging์œผ๋กœ ์ž๋™ PR #123 +2. ๊ธฐ๋Šฅ B๋ฅผ develop์— ๋จธ์ง€ โ†’ PR #123 ์—…๋ฐ์ดํŠธ +3. PR #123 ์Šน์ธ โ†’ v1.2.0-beta.1234567890 +4. main์œผ๋กœ ์ž๋™ PR #124 ์ƒ์„ฑ +5. PR #124 ์Šน์ธ โ†’ main์— ๋ฒ„์ „ 1.2.0 +6. v1.2.0 ํƒœ๊ทธ ์ƒ์„ฑ โ†’ npm์— ํผ๋ธ”๋ฆฌ์‹œ +7. develop/staging์ด main๊ณผ ๋™๊ธฐํ™” ``` +## ๋ฆด๋ฆฌ์Šค ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### ๊ฐœ๋ฐœ์ž์šฉ +- [ ] develop์—์„œ feature/fix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ +- [ ] ์ ์ ˆํ•œ ๋ฒ„์ „ bump์™€ ํ•จ๊ป˜ changeset ์ถ”๊ฐ€ +- [ ] develop์œผ๋กœ PR ์ƒ์„ฑ +- [ ] ๋ชจ๋“  ์ฒดํฌ ํ†ต๊ณผ ํ™•์ธ + +### QA ํŒ€์šฉ +- [ ] staging PR ๋‚ด์šฉ ๊ฒ€ํ†  +- [ ] npm์—์„œ ๋ฒ ํƒ€ ๋ฒ„์ „ ํ…Œ์ŠคํŠธ +- [ ] ์ค€๋น„๋˜๋ฉด staging PR ์Šน์ธ + +### ๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ์ž์šฉ +- [ ] staging์—์„œ ์˜จ main PR ๊ฒ€ํ†  +- [ ] main PR ์Šน์ธ (๋ฒ„์ „ ์—…๋ฐ์ดํŠธ ํŠธ๋ฆฌ๊ฑฐ) +- [ ] ๋™๊ธฐํ™” ์™„๋ฃŒ ๋Œ€๊ธฐ +- [ ] ๋ฒ„์ „ ํƒœ๊ทธ ์ƒ์„ฑ ๋ฐ ํ‘ธ์‹œ: + ```bash + git checkout main + git pull origin main + git tag v1.2.0 + git push origin v1.2.0 + ``` +- [ ] npm ๋ฐฐํฌ ํ™•์ธ +- [ ] GitHub Release ์ƒ์„ฑ ํ™•์ธ + ## ๋ฌธ์ œ ํ•ด๊ฒฐ -### ๋ฒ ํƒ€ ๋ฒ„์ „์ด ํผ๋ธ”๋ฆฌ์‹œ๋˜์ง€ ์•Š๋‚˜์š”? -- changesets๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ -- ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š”์ง€ ๊ฒ€์ฆ -- npm ํ† ํฐ ๊ถŒํ•œ ํ™•์ธ +### ์ž๋™ PR์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋‚˜์š”? +- GitHub Actions ์‹คํ–‰ ํ™•์ธ +- ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ๊ฐ€ ๋ด‡ PR์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธ +- ๊ธฐ์กด ์—ด๋ฆฐ PR์ด ์žˆ๋Š”์ง€ ํ™•์ธ -### ํŒจํ‚ค์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋‚˜์š”? -- changeset์— ํŒจํ‚ค์ง€ ์ด๋ฆ„์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ -- ํŒจํ‚ค์ง€์— ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ -- package.json์˜ ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆ +### ๋ฒ ํƒ€ ๋ฒ„์ „์ด ํผ๋ธ”๋ฆฌ์‹œ๋˜์ง€ ์•Š๋‚˜์š”? +- changesets๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธ +- staging์—์„œ ๋นŒ๋“œ ์„ฑ๊ณต ํ™•์ธ +- npm ํ† ํฐ ์œ ํšจ์„ฑ ํ™•์ธ -### CI์—์„œ๋Š” ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๋กœ์ปฌ์—์„œ๋Š” ์—†๋‚˜์š”? -- ๋กœ์ปฌ์—์„œ `pnpm typecheck` ์‹คํ–‰ -- ๋ชจ๋“  ์›Œํฌ์ŠคํŽ˜์ด์Šค ํŒจํ‚ค์ง€ ํ™•์ธ: `pnpm -r typecheck` -- ์˜์กด์„ฑ์ด ์ตœ์‹ ์ธ์ง€ ํ™•์ธ +### ๋™๊ธฐํ™” ์‹คํŒจ? +- ๋จธ์ง€ ์ถฉ๋Œ ํ™•์ธ +- ์›Œํฌํ”Œ๋กœ์šฐ ๋กœ๊ทธ ๊ฒ€ํ†  +- ์ˆ˜๋™ ๋™๊ธฐํ™” ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ -### PR์ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋‚˜์š”? -- GitHub Actions ๊ถŒํ•œ ํ™•์ธ -- GITHUB_TOKEN์ด PR ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์ฆ -- PR์ด ์—ด๋ฆฐ ์ƒํƒœ์ธ์ง€ ํ™•์ธ \ No newline at end of file +### ํƒœ๊ทธ ๋ฆด๋ฆฌ์Šค ์‹คํŒจ? +- ํƒœ๊ทธ๊ฐ€ ๋ฒ„์ „ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ (v*.*.*) +- npm ํ† ํฐ ๊ถŒํ•œ ํ™•์ธ +- ํŒจํ‚ค์ง€ ๋นŒ๋“œ ์„ฑ๊ณต ํ™•์ธ \ No newline at end of file diff --git a/RELEASE_STRATEGY.md b/RELEASE_STRATEGY.md index f4c06b3..0d7a699 100644 --- a/RELEASE_STRATEGY.md +++ b/RELEASE_STRATEGY.md @@ -4,43 +4,43 @@ ## Overview -This document outlines the release strategy for the vue3-pivottable monorepo, which uses Changesets for version management and supports independent package releases. +This document outlines the release strategy for the vue3-pivottable monorepo, which uses automated workflows, Changesets for version management, and tag-based releases for production deployment. ## Release Flow ```mermaid sequenceDiagram - participant F as feature branch + participant F as feature/fix branch participant D as develop + participant S as staging participant M as main - participant R as release/vX.X.X + participant T as Tags participant NPM as npm Registry Note over F,D: 1. Feature Development F->>D: PR with changesets D->>D: Code Review & Merge - Note over D,NPM: 2. Beta Release (Automatic) - D->>D: Changesets consumed - D->>D: Version bump + beta suffix - D->>D: Quality checks (lint, typecheck) - D->>D: Build all packages - D->>NPM: Publish @beta - D->>D: Commit changes + Note over D,S: 2. Auto PR to Staging + D->>S: Automatic PR creation + D->>S: Additional commits accumulate - Note over D,M: 3. Production Preparation - D->>M: PR (beta versions, no changesets) - M->>M: Review & Merge + Note over S,NPM: 3. Beta Release (PR Approval) + S->>S: Beta version generation + S->>S: Quality checks & Build + S->>NPM: Publish @beta + S->>M: Auto PR to main - Note over M,NPM: 4. Stable Release (Automatic) - M->>R: Create release branch - R->>R: Remove beta suffix only - R->>R: Quality checks & Build - R->>NPM: Publish @latest + Note over M,T: 4. Version Update (PR Approval) + M->>M: Changeset version update + M->>M: Update package.json & CHANGELOG + M->>D: Auto sync to develop + M->>S: Auto sync to staging - Note over R,M: 5. Sync Back - R->>M: PR to update main - M->>M: Merge (main now has stable versions) + Note over T,NPM: 5. Production Release (Tag) + T->>T: Create version tag (v1.2.0) + T->>NPM: Publish @latest + T->>T: Create GitHub Release ``` ## Branch Responsibilities @@ -48,30 +48,42 @@ sequenceDiagram ### develop Branch - **Purpose**: Integration branch for all features - **Automatic Actions**: - - Consume changesets (files are deleted) - - Bump versions based on changesets - - Add beta suffix with timestamp - - Run quality checks (ESLint, TypeScript) - - Build all packages - - Publish to npm with @beta tag - - Commit version changes back to develop + - Trigger auto PR to staging on push + - Accumulate changes in existing staging PR + - Continuous integration checks + +### staging Branch +- **Purpose**: QA testing and beta releases +- **Automatic Actions on PR merge**: + - Check for accumulated changesets + - If changesets exist: + - Consume changesets (delete files) + - Generate beta version (x.y.z-beta.timestamp) + - Run quality checks (ESLint, TypeScript) + - Build all packages + - Publish to npm with @beta tag + - Create auto PR to main + - If no changesets: skip release process ### main Branch -- **Purpose**: Production-ready code only -- **Protection**: Cannot push directly -- **Automatic Actions**: - - Create release/vX.X.X branch - - No changeset processing (already done in develop) - - Trigger stable release process - -### release/vX.X.X Branch -- **Purpose**: Temporary branch for stable releases +- **Purpose**: Production-ready code +- **Protection**: No direct commits (only PRs) +- **Automatic Actions on PR merge**: + - Execute `changeset version` + - Update package.json versions + - Generate/update CHANGELOG.md + - Commit version changes + - Sync changes to develop and staging + - **No npm publish** + +### Tags (v*.*.*) +- **Purpose**: Trigger production releases +- **Created**: Manually after main update - **Automatic Actions**: - - Remove beta suffix from versions - - Run quality checks + - Checkout tagged commit - Build all packages - Publish to npm with @latest tag - - Create PR back to main + - Create GitHub Release ## Package Independence @@ -114,14 +126,16 @@ This ensures each package: # Changeset for bug fix in main package "vue-pivottable": patch -# Result in develop: +# Result in staging: vue-pivottable: 1.1.1 โ†’ 1.1.2-beta.1234567890 @vue-pivottable/plotly-renderer: 2.0.0 (unchanged) @vue-pivottable/lazy-table-renderer: 1.0.13 (unchanged) -# Result in main/release: -vue-pivottable: 1.1.2-beta.1234567890 โ†’ 1.1.2 -# Other packages not published +# Result after main merge: +vue-pivottable: 1.1.2 (version updated, not published) + +# Result after tag v1.1.2: +vue-pivottable: 1.1.2 โ†’ npm @latest ``` ### Scenario 2: Multiple Package Updates @@ -130,15 +144,16 @@ vue-pivottable: 1.1.2-beta.1234567890 โ†’ 1.1.2 "vue-pivottable": minor "@vue-pivottable/plotly-renderer": minor -# Result in develop: +# Result in staging: vue-pivottable: 1.1.1 โ†’ 1.2.0-beta.1234567890 @vue-pivottable/plotly-renderer: 2.0.0 โ†’ 2.1.0-beta.1234567890 -@vue-pivottable/lazy-table-renderer: 1.0.13 (unchanged) -# Result in main/release: -vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 -@vue-pivottable/plotly-renderer: 2.1.0-beta.1234567890 โ†’ 2.1.0 -# lazy-table-renderer not published +# Result after main merge: +vue-pivottable: 1.2.0 (updated) +@vue-pivottable/plotly-renderer: 2.1.0 (updated) + +# Result after tag v1.2.0: +Both packages โ†’ npm @latest ``` ## Quality Gates @@ -158,19 +173,30 @@ vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 ## Workflow Files ### 1. `.github/workflows/pr-check.yml` -- **Triggers**: PR to main or develop +- **Triggers**: PR to any branch - **Checks**: Lint, TypeCheck, Build, Changesets - **Purpose**: Ensure code quality before merge -### 2. `.github/workflows/release-develop.yml` +### 2. `.github/workflows/integrate-develop.yml` - **Triggers**: Push to develop -- **Actions**: Version, Build, Publish @beta -- **Key Feature**: Consumes changesets +- **Actions**: Create/update PR to staging +- **Key Feature**: Accumulates multiple changes + +### 3. `.github/workflows/release-staging.yml` +- **Triggers**: Push to staging +- **Condition**: When changesets exist (accumulated from develop) +- **Actions**: Beta version, Build, Publish @beta +- **Key Feature**: Consumes changesets, Auto PR to main -### 3. `.github/workflows/release.yml` -- **Triggers**: Push to main -- **Actions**: Remove beta suffix, Build, Publish @latest -- **Key Feature**: No changeset needed +### 4. `.github/workflows/update-version.yml` +- **Triggers**: Push to main (with beta versions) +- **Actions**: Update versions, sync branches +- **Key Feature**: No npm publish + +### 5. `.github/workflows/release-tag.yml` +- **Triggers**: Tag push (v*.*.*) +- **Actions**: Build, Publish @latest +- **Key Feature**: Production deployment ## Security @@ -181,15 +207,16 @@ vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 ### Branch Protection - main: Requires PR, no direct push -- develop: Open for CI commits -- release/*: Temporary, auto-created +- staging: Requires PR, no direct push +- develop: Requires PR, no direct push ## Commands Reference | Command | Description | |---------|-------------| -| `pnpm changeset add` | Add a changeset for your changes | +| `pnpm changeset` | Add a changeset for your changes | | `pnpm changeset status` | Check pending changesets | +| `pnpm changeset version` | Apply changesets to versions | | `pnpm build:all` | Build all packages | | `pnpm typecheck` | Run TypeScript checks | | `pnpm lint` | Run ESLint | @@ -198,60 +225,87 @@ vue-pivottable: 1.2.0-beta.1234567890 โ†’ 1.2.0 ## Best Practices 1. **Always add changesets** for changes that should trigger releases -2. **Test in beta first** - Check npm @beta before approving to main -3. **Independent versions** - Don't bump unchanged packages -4. **Quality first** - All checks must pass before publish +2. **Test in beta first** - staging provides beta testing environment +3. **Review auto PRs** - Check automated PRs before approving +4. **Tag after main update** - Create tags only after version update in main ## Handling Updates During Release Process -### Scenario: Changes to develop after PR to main +### Scenario: Continuous Development Flow -When a PR from develop to main is already open and new changes are pushed to develop: +The workflow handles ongoing development seamlessly: -1. **Automatic PR Update** - - The release-develop workflow automatically detects existing PR - - Updates PR title with new beta version - - Updates PR description with timestamp and new version info - - Adds `auto-updated` and `needs-review` labels - - Sets PR back to "ready for review" state +1. **Automatic PR Updates** + - develop โ†’ staging PR accumulates new commits + - PR description updates with each addition + - Single PR for multiple features/fixes -2. **Review Process** - - Reviewers are notified of the update via labels - - Previous approvals remain but re-review is recommended - - PR description shows clear "Updated" status with timestamp +2. **Beta Version Management** + - Each staging merge creates new beta version + - Previous beta versions remain available + - Clear version progression tracking -3. **Benefits** - - PR history and discussions are preserved - - No manual intervention required - - Clear audit trail of all beta versions +3. **Synchronization** + - main updates flow back to develop/staging + - Prevents divergence between branches + - Maintains linear history ### Example Flow ``` -1. v1.2.0-beta.1234567890 โ†’ PR #123 created -2. New fix pushed to develop -3. v1.2.1-beta.2345678901 โ†’ PR #123 automatically updated -4. Reviewers see "auto-updated" label and re-review -5. Once approved, merge to main triggers stable release +1. Feature A merged to develop โ†’ Auto PR #123 to staging +2. Feature B merged to develop โ†’ PR #123 updated +3. PR #123 approved โ†’ v1.2.0-beta.1234567890 +4. Auto PR #124 to main created +5. PR #124 approved โ†’ Version 1.2.0 in main +6. Tag v1.2.0 created โ†’ Published to npm +7. develop/staging synced with main ``` +## Release Checklist + +### For Developers +- [ ] Create feature/fix branch from develop +- [ ] Add changeset with appropriate version bump +- [ ] Create PR to develop +- [ ] Ensure all checks pass + +### For QA Team +- [ ] Review staging PR contents +- [ ] Test beta version from npm +- [ ] Approve staging PR when ready + +### For Release Manager +- [ ] Review main PR from staging +- [ ] Approve main PR (triggers version update) +- [ ] Wait for sync completion +- [ ] Create and push version tag: + ```bash + git checkout main + git pull origin main + git tag v1.2.0 + git push origin v1.2.0 + ``` +- [ ] Verify npm deployment +- [ ] Check GitHub Release creation + ## Troubleshooting -### Beta version not publishing? -- Check if changesets exist -- Verify build succeeds -- Check npm token permissions +### Auto PR not created? +- Check GitHub Actions runs +- Verify branch protections allow bot PRs +- Check for existing open PRs -### Package not updating? -- Ensure changeset includes the package name -- Check if package has build script -- Verify package.json name matches +### Beta version not publishing? +- Verify changesets were added +- Check build success in staging +- Verify npm token validity -### Type errors in CI but not locally? -- Run `pnpm typecheck` locally -- Check all workspace packages: `pnpm -r typecheck` -- Ensure dependencies are up to date +### Sync failed? +- Check for merge conflicts +- Review workflow logs +- Manual sync may be needed -### PR not updating automatically? -- Check GitHub Actions permissions -- Verify GITHUB_TOKEN has write access to PRs -- Check if PR is in open state \ No newline at end of file +### Tag release failed? +- Ensure tag matches version pattern (v*.*.*) +- Check npm token permissions +- Verify package builds succeed \ No newline at end of file diff --git a/docs/GIT_FLOW_STRATEGY.md b/docs/GIT_FLOW_STRATEGY.md new file mode 100644 index 0000000..b8d36e5 --- /dev/null +++ b/docs/GIT_FLOW_STRATEGY.md @@ -0,0 +1,339 @@ +# Git Flow ์ „๋žต ๋ฌธ์„œ + +## ๋ชฉ์ฐจ +1. [๊ฐœ์š”](#๊ฐœ์š”) +2. [๋ธŒ๋žœ์น˜ ์ „๋žต](#๋ธŒ๋žœ์น˜-์ „๋žต) +3. [์ž๋™ํ™”๋œ ์›Œํฌํ”Œ๋กœ์šฐ](#์ž๋™ํ™”๋œ-์›Œํฌํ”Œ๋กœ์šฐ) +4. [๋ฒ„์ „ ๊ด€๋ฆฌ ์ „๋žต](#๋ฒ„์ „-๊ด€๋ฆฌ-์ „๋žต) +5. [CI/CD ํŒŒ์ดํ”„๋ผ์ธ](#cicd-ํŒŒ์ดํ”„๋ผ์ธ) +6. [ํŒ€ ๊ฐ€์ด๋“œ๋ผ์ธ](#ํŒ€-๊ฐ€์ด๋“œ๋ผ์ธ) +7. [์‹ค์ „ ๊ฐ€์ด๋“œ](#์‹ค์ „-๊ฐ€์ด๋“œ) + +## ๊ฐœ์š” + +์ด ๋ฌธ์„œ๋Š” vue3-pivottable ํ”„๋กœ์ ํŠธ์˜ Git Flow ์ „๋žต์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™๊ณผ ์ž๋™ํ™”๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์กฐํ•ฉํ•˜์—ฌ, ์•ˆ์ •์ ์ด๋ฉด์„œ๋„ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ์›์น™ +- **์ž๋™ํ™”๋œ PR ์ƒ์„ฑ**: ๋ธŒ๋žœ์น˜ ๊ฐ„ ์ž๋™ PR๋กœ ์ˆ˜๋™ ์ž‘์—… ์ตœ์†Œํ™” +- **๋ช…ํ™•ํ•œ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ**: develop(๊ฐœ๋ฐœ) โ†’ staging(QA) โ†’ main(ํ”„๋กœ๋•์…˜) +- **ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ๋ฆด๋ฆฌ์ฆˆ**: ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ์™€ ์ž๋™ํ™”๋ฅผ ์–‘๋ฆฝ +- **์ง€์†์  ๋™๊ธฐํ™”**: ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ + +## ๋ธŒ๋žœ์น˜ ์ „๋žต + +### ๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ + +``` +main (production) - ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ + โ”œโ”€โ”€ hotfix/* - ๊ธด๊ธ‰ ์ˆ˜์ • + โ””โ”€โ”€ staging (QA) - ๋ฒ ํƒ€ ๋ฐฐํฌ + โ””โ”€โ”€ develop (integration) - ๊ฐœ๋ฐœ ํ†ตํ•ฉ + โ”œโ”€โ”€ feature/* - ์ƒˆ ๊ธฐ๋Šฅ + โ””โ”€โ”€ fix/* - ๋ฒ„๊ทธ ์ˆ˜์ • +``` + +### ๋ธŒ๋žœ์น˜๋ณ„ ์—ญํ•  + +#### develop (๊ฐœ๋ฐœ ํ†ตํ•ฉ) +- **๋ชฉ์ **: ๋ชจ๋“  ๊ฐœ๋ฐœ ์ž‘์—…์˜ ํ†ตํ•ฉ์  +- **์ž๋™ํ™”**: PR ์Šน์ธ ์‹œ staging์œผ๋กœ ์ž๋™ PR ์ƒ์„ฑ +- **ํŠน์ง•**: ์ง€์†์  ํ†ตํ•ฉ(CI) ์‹คํ–‰ + +#### staging (QA/๋ฒ ํƒ€) +- **๋ชฉ์ **: QA ํ…Œ์ŠคํŠธ ๋ฐ ๋ฒ ํƒ€ ๋ฐฐํฌ +- **๋ฐฐํฌ**: npm beta ํƒœ๊ทธ +- **๋ฒ„์ „**: x.y.z-beta.timestamp +- **์ž๋™ํ™”**: + - develop์—์„œ ์ž๋™ PR ์ˆ˜์‹  (changesets ๋ˆ„์ ) + - PR ์Šน์ธ ์‹œ changesets ํ™•์ธ + - changesets ์žˆ์„ ๋•Œ๋งŒ ๋ฒ ํƒ€ ๋ฐฐํฌ + - ๋ฐฐํฌ ํ›„ main์œผ๋กœ ์ž๋™ PR ์ƒ์„ฑ + +#### main (ํ”„๋กœ๋•์…˜) +- **๋ชฉ์ **: ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๊ด€๋ฆฌ +- **๋ฐฐํฌ**: ํƒœ๊ทธ ์ƒ์„ฑ ์‹œ npm latest +- **์ž๋™ํ™”**: + - staging์—์„œ ์ž๋™ PR ์ˆ˜์‹  + - ์Šน์ธ ์‹œ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ (๋ฐฐํฌ๋Š” ์•ˆ ํ•จ) + - develop/staging ์ž๋™ ๋™๊ธฐํ™” + +#### feature/* & fix/* +- **์ƒ์„ฑ**: develop์—์„œ ๋ถ„๊ธฐ +- **๋จธ์ง€**: develop์œผ๋กœ PR +- **๋„ค์ด๋ฐ**: + - feature/๊ธฐ๋Šฅ๋ช… + - fix/์ด์Šˆ๋ฒˆํ˜ธ-์„ค๋ช… + +#### hotfix/* +- **์ƒ์„ฑ**: main์—์„œ ๋ถ„๊ธฐ +- **๋จธ์ง€**: main์œผ๋กœ ์ง์ ‘ PR +- **์šฉ๋„**: ํ”„๋กœ๋•์…˜ ๊ธด๊ธ‰ ์ˆ˜์ • + +## ์ž๋™ํ™”๋œ ์›Œํฌํ”Œ๋กœ์šฐ + +### ์ „์ฒด ํ”Œ๋กœ์šฐ ๋‹ค์ด์–ด๊ทธ๋žจ + +```mermaid +graph TD + A[feature/fix ๋ธŒ๋žœ์น˜] -->|PR ์Šน์ธ| B[develop] + B -->|์ž๋™ PR ์ƒ์„ฑ| C[staging PR ๋Œ€๊ธฐ] + C -->|์ถ”๊ฐ€ ์ปค๋ฐ‹ ๋ˆ„์ | C + C -->|PR ์Šน์ธ| D[staging] + D -->|๋ฒ ํƒ€ ๋ฐฐํฌ| E[npm beta] + D -->|์ž๋™ PR ์ƒ์„ฑ| F[main PR ๋Œ€๊ธฐ] + F -->|PR ์Šน์ธ| G[main] + G -->|๋ฒ„์ „ ์—…๋ฐ์ดํŠธ| H[develop/staging ๋™๊ธฐํ™”] + G -->|ํƒœ๊ทธ ์ƒ์„ฑ| I[npm latest ๋ฐฐํฌ] +``` + +### ์ƒ์„ธ ํ”„๋กœ์„ธ์Šค + +#### 1. ๊ฐœ๋ฐœ โ†’ ์Šคํ…Œ์ด์ง• (์ž๋™) + +**ํŠธ๋ฆฌ๊ฑฐ**: develop PR ์Šน์ธ +**๋™์ž‘**: +1. develop โ†’ staging ์ž๋™ PR ์ƒ์„ฑ +2. ๊ธฐ์กด PR์ด ์žˆ์œผ๋ฉด ์ปค๋ฐ‹ ์ถ”๊ฐ€ +3. PR ์„ค๋ช…์— ํฌํ•จ๋œ ๊ธฐ๋Šฅ ๋ชฉ๋ก ์ž๋™ ์—…๋ฐ์ดํŠธ + +**ํŠน์ง•**: +- ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ ์‚ฌํ•ญ์ด ํ•˜๋‚˜์˜ PR์— ๋ˆ„์  +- QA ํŒ€์ด ์ผ๊ด„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ + +#### 2. ์Šคํ…Œ์ด์ง• ์Šน์ธ โ†’ ๋ฒ ํƒ€ ๋ฐฐํฌ + +**ํŠธ๋ฆฌ๊ฑฐ**: staging PR ์Šน์ธ +**๋™์ž‘**: +1. ๋ˆ„์ ๋œ changesets ํ™•์ธ +2. changesets๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ: + - changesets ์†Œ๋น„ (ํŒŒ์ผ ์‚ญ์ œ) + - ๋ฒ ํƒ€ ๋ฒ„์ „ ์ž๋™ ์ƒ์„ฑ (x.y.z-beta.timestamp) + - npm beta ํƒœ๊ทธ๋กœ ๋ฐฐํฌ + - GitHub pre-release ์ƒ์„ฑ + - main์œผ๋กœ ์ž๋™ PR ์ƒ์„ฑ +3. changesets๊ฐ€ ์—†์œผ๋ฉด ๋ฆด๋ฆฌ์ฆˆ ๊ฑด๋„ˆ๋›ฐ๊ธฐ + +#### 3. ๋ฉ”์ธ ์Šน์ธ โ†’ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ + +**ํŠธ๋ฆฌ๊ฑฐ**: main PR ์Šน์ธ +**๋™์ž‘**: +1. Changeset version ์‹คํ–‰ +2. package.json ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ +3. CHANGELOG.md ์ƒ์„ฑ +4. ๋ณ€๊ฒฝ์‚ฌํ•ญ main์— ์ปค๋ฐ‹ +5. develop๊ณผ staging ์ž๋™ ๋™๊ธฐํ™” +6. **npm ๋ฐฐํฌ๋Š” ํ•˜์ง€ ์•Š์Œ** + +#### 4. ํƒœ๊ทธ ์ƒ์„ฑ โ†’ ์ •์‹ ๋ฐฐํฌ + +**ํŠธ๋ฆฌ๊ฑฐ**: v*.*.* ํƒœ๊ทธ ํ‘ธ์‹œ +**๋™์ž‘**: +1. ํƒœ๊ทธ๋œ ์ปค๋ฐ‹์—์„œ ์ฒดํฌ์•„์›ƒ +2. npm latest ํƒœ๊ทธ๋กœ ๋ฐฐํฌ +3. GitHub Release ์ƒ์„ฑ +4. ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ ์ž๋™ ์ƒ์„ฑ + +### ๋™๊ธฐํ™” ์ „๋žต + +main์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋™๊ธฐํ™”: +1. main โ†’ develop (์ž๋™ ๋จธ์ง€) +2. main โ†’ staging (์ž๋™ ๋จธ์ง€) + +**๋™๊ธฐํ™” ์‹œ ์ฃผ์˜์‚ฌํ•ญ**: +- ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์Œ (์ˆœ์ฐจ์  ๋จธ์ง€์ด๋ฏ€๋กœ) +- ๋ฒ ํƒ€ ๋ฒ„์ „์ด ์žˆ๋Š” staging์€ ์žฌ๋ฐฐํฌํ•˜์ง€ ์•Š์Œ +- ๋™๊ธฐํ™” ์‹คํŒจ ์‹œ ์•Œ๋ฆผ ๋ฐœ์†ก + +## ๋ฒ„์ „ ๊ด€๋ฆฌ ์ „๋žต + +### ๋ฒ„์ „ ํ˜•์‹ +- **๊ฐœ๋ฐœ**: ์ˆ˜๋™ ๋ฒ„์ „ ๊ด€๋ฆฌ ์—†์Œ +- **์Šคํ…Œ์ด์ง•**: `1.2.0-beta.1234567890` +- **๋ฉ”์ธ**: `1.2.0` (ํƒœ๊ทธ ์ƒ์„ฑ ์ „๊นŒ์ง€ ๋ฐฐํฌ ์•ˆ ํ•จ) +- **ํƒœ๊ทธ**: `v1.2.0` (์ •์‹ ๋ฆด๋ฆฌ์ฆˆ) + +### Changesets ํ™œ์šฉ +- ๋ชจ๋“  PR์— changeset ํ•„์ˆ˜ +- staging โ†’ main PR ์Šน์ธ ์‹œ ์ž๋™ ์ ์šฉ +- ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์™€ CHANGELOG ์ž๋™ ์ƒ์„ฑ + +### npm ํƒœ๊ทธ ์ „๋žต +- `beta`: staging ๋ธŒ๋žœ์น˜ ์ž๋™ ๋ฐฐํฌ +- `latest`: ํƒœ๊ทธ ์ƒ์„ฑ ์‹œ์—๋งŒ ๋ฐฐํฌ + +## CI/CD ํŒŒ์ดํ”„๋ผ์ธ + +### 1. PR ์ฒดํฌ (pr-check.yml) +**ํŠธ๋ฆฌ๊ฑฐ**: ๋ชจ๋“  PR +**๊ฒ€์ฆ ํ•ญ๋ชฉ**: +- Lint & TypeScript ์ฒดํฌ +- ๋นŒ๋“œ ํ…Œ์ŠคํŠธ +- Changeset ์กด์žฌ ์—ฌ๋ถ€ +- ํ…Œ์ŠคํŠธ ์‹คํ–‰ + +### 2. ๊ฐœ๋ฐœ ํ†ตํ•ฉ (integrate-develop.yml) +**ํŠธ๋ฆฌ๊ฑฐ**: develop push +**์ž‘์—…**: +- staging์œผ๋กœ ์ž๋™ PR ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ +- PR ๋ผ๋ฒจ ์ž๋™ ์ถ”๊ฐ€ + +### 3. ๋ฒ ํƒ€ ๋ฆด๋ฆฌ์ฆˆ (release-staging.yml) +**ํŠธ๋ฆฌ๊ฑฐ**: staging push +**์กฐ๊ฑด**: changesets ์กด์žฌ ์‹œ (develop์—์„œ ๋ˆ„์ ๋จ) +**์ž‘์—…**: +1. changesets ์†Œ๋น„ (ํŒŒ์ผ ์‚ญ์ œ) +2. ๋ฒ ํƒ€ ๋ฒ„์ „ ์ƒ์„ฑ +3. npm beta ๋ฐฐํฌ +4. main์œผ๋กœ ์ž๋™ PR ์ƒ์„ฑ + +### 4. ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ (update-version.yml) +**ํŠธ๋ฆฌ๊ฑฐ**: main push +**์กฐ๊ฑด**: ๋ฒ ํƒ€ ๋ฒ„์ „ ์กด์žฌ ์‹œ +**์ž‘์—…**: +1. Changeset version ์‹คํ–‰ +2. ๋ฒ„์ „ ์ปค๋ฐ‹ +3. develop/staging ๋™๊ธฐํ™” + +### 5. ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ (release-tag.yml) +**ํŠธ๋ฆฌ๊ฑฐ**: ํƒœ๊ทธ ํ‘ธ์‹œ (v*.*.*) +**์ž‘์—…**: +1. npm latest ๋ฐฐํฌ +2. GitHub Release ์ƒ์„ฑ + +## ํŒ€ ๊ฐ€์ด๋“œ๋ผ์ธ + +### ๋ธŒ๋žœ์น˜ ์ž‘์—… ๊ทœ์น™ + +#### ์ผ๋ฐ˜ ๊ฐœ๋ฐœ +1. develop์—์„œ feature/fix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ +2. ์ž‘์—… ์™„๋ฃŒ ํ›„ develop์œผ๋กœ PR +3. Changeset ์ถ”๊ฐ€ ํ•„์ˆ˜ +4. ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ›„ ์Šน์ธ + +#### ๊ธด๊ธ‰ ์ˆ˜์ • +1. main์—์„œ hotfix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ +2. ์ˆ˜์ • ํ›„ main์œผ๋กœ ์ง์ ‘ PR +3. ์Šน์ธ ํ›„ ์ž๋™ ๋™๊ธฐํ™” ํ™•์ธ + +### ๋ฆด๋ฆฌ์ฆˆ ๋‹ด๋‹น์ž ๊ฐ€์ด๋“œ + +#### ์ •์‹ ๋ฆด๋ฆฌ์ฆˆ ์ ˆ์ฐจ +1. main PR ์Šน์ธ (๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๋จ) +2. ๋™๊ธฐํ™” ์™„๋ฃŒ ํ™•์ธ +3. ํƒœ๊ทธ ์ƒ์„ฑ ๋ฐ ํ‘ธ์‹œ: + ```bash + git checkout main + git pull origin main + git tag v1.2.0 + git push origin v1.2.0 + ``` +4. ๋ฐฐํฌ ๋ชจ๋‹ˆํ„ฐ๋ง + +### Changeset ์ž‘์„ฑ ๊ฐ€์ด๋“œ + +**์–ธ์ œ ํ•„์š”ํ•œ๊ฐ€?** +- ๋ชจ๋“  ๊ธฐ๋Šฅ ์ถ”๊ฐ€/์ˆ˜์ •/๋ฒ„๊ทธ ํ”ฝ์Šค +- ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ชจ๋“  ๋ณ€๊ฒฝ + +**๋ฒ„์ „ ์„ ํƒ ๊ธฐ์ค€**: +- **Major**: Breaking changes +- **Minor**: ์ƒˆ ๊ธฐ๋Šฅ (ํ•˜์œ„ ํ˜ธํ™˜) +- **Patch**: ๋ฒ„๊ทธ ์ˆ˜์ • + +## ์‹ค์ „ ๊ฐ€์ด๋“œ + +### ์‹œ๋‚˜๋ฆฌ์˜ค 1: ์ƒˆ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ + +1. **๋ธŒ๋žœ์น˜ ์ƒ์„ฑ** + - develop โ†’ feature/new-feature + +2. **๊ฐœ๋ฐœ ๋ฐ PR** + - Changeset ์ถ”๊ฐ€ + - develop์œผ๋กœ PR ์ƒ์„ฑ + +3. **์ž๋™ ํ”„๋กœ์„ธ์Šค** + - PR ์Šน์ธ โ†’ staging ์ž๋™ PR + - staging ์Šน์ธ โ†’ ๋ฒ ํƒ€ ๋ฐฐํฌ + - main ์ž๋™ PR ๋Œ€๊ธฐ + +### ์‹œ๋‚˜๋ฆฌ์˜ค 2: ๋ฒ ํƒ€ ํ…Œ์ŠคํŠธ ์ค‘ ๋ฒ„๊ทธ ๋ฐœ๊ฒฌ + +1. **์ˆ˜์ • ์ž‘์—…** + - develop โ†’ fix/bug-in-beta + - ๋ฒ„๊ทธ ์ˆ˜์ • ํ›„ PR + +2. **์ž๋™ ์—…๋ฐ์ดํŠธ** + - ๊ธฐ์กด staging PR์— ์ปค๋ฐ‹ ์ถ”๊ฐ€ + - QA ์žฌํ…Œ์ŠคํŠธ + +### ์‹œ๋‚˜๋ฆฌ์˜ค 3: ํ”„๋กœ๋•์…˜ ๊ธด๊ธ‰ ํŒจ์น˜ + +1. **Hotfix ์ƒ์„ฑ** + - main โ†’ hotfix/critical-bug + +2. **๋น ๋ฅธ ๋ฐฐํฌ** + - main PR ์Šน์ธ + - ์ฆ‰์‹œ ํƒœ๊ทธ ์ƒ์„ฑํ•˜์—ฌ ๋ฐฐํฌ + +### ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด + +**๊ฐœ๋ฐœ**: +```bash +# feature ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ +git checkout develop +git pull origin develop +git checkout -b feature/my-feature + +# changeset ์ถ”๊ฐ€ +pnpm changeset +``` + +**๋ฆด๋ฆฌ์ฆˆ**: +```bash +# ํƒœ๊ทธ ์ƒ์„ฑ (๋ฆด๋ฆฌ์ฆˆ ๋‹ด๋‹น์ž) +git checkout main +git pull origin main +git tag v1.2.0 +git push origin v1.2.0 +``` + +### ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… + +**๋ฌธ์ œ: ์ž๋™ PR์— ์ถฉ๋Œ ๋ฐœ์ƒ** +- develop์„ ์ตœ์‹ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ›„ ์žฌ์‹œ๋„ +- ์ˆ˜๋™์œผ๋กœ ์ถฉ๋Œ ํ•ด๊ฒฐ ํ›„ ํ‘ธ์‹œ + +**๋ฌธ์ œ: ๋™๊ธฐํ™” ์‹คํŒจ** +- ์›Œํฌํ”Œ๋กœ์šฐ ๋กœ๊ทธ ํ™•์ธ +- ์ˆ˜๋™ ๋™๊ธฐํ™” ํ•„์š”์‹œ ๊ด€๋ฆฌ์ž ๋ฌธ์˜ + +**๋ฌธ์ œ: ๋ฒ ํƒ€ ๋ฒ„์ „์ด main์— ๋ฐ˜์˜ ์•ˆ ๋จ** +- staging์— ๋ฒ ํƒ€ ํƒœ๊ทธ ํ™•์ธ +- main PR์ด ์ž๋™ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ + +## ํ”„๋กœ์ ํŠธ ์ž๋™ํ™” ๋„๊ตฌ + +### Changesets +- ๋ฒ„์ „ ๊ด€๋ฆฌ ์ž๋™ํ™” +- CHANGELOG ์ž๋™ ์ƒ์„ฑ +- ๋ชจ๋…ธ๋ ˆํฌ ์ง€์› + +### pnpm Workspace +``` +vue3-pivottable/ +โ”œโ”€โ”€ packages/ +โ”‚ โ”œโ”€โ”€ plotly-renderer/ +โ”‚ โ””โ”€โ”€ lazy-table-renderer/ +โ””โ”€โ”€ pnpm-workspace.yaml +``` + +### ๋ฆด๋ฆฌ์ฆˆ ์Šคํฌ๋ฆฝํŠธ +- `scripts/release-packages.cjs` +- ํ™˜๊ฒฝ๋ณ€์ˆ˜: + - NPM_TOKEN + - NPM_TOKEN_SUMIN + - RELEASE_TAG + +--- + +*์ด ๋ฌธ์„œ๋Š” ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ PR์„ ํ†ตํ•ด ์ œ์•ˆํ•ด์ฃผ์„ธ์š”.* \ No newline at end of file diff --git a/packages/lazy-table-renderer/README.md b/packages/lazy-table-renderer/README.md index 8f9f083..eb85407 100644 --- a/packages/lazy-table-renderer/README.md +++ b/packages/lazy-table-renderer/README.md @@ -21,7 +21,7 @@ This component inherits all standard props from the `vue-pivottable` package, wi | Prop | Type | Default | Description | | ------------ | ------ | ------- | ----------------------------------------------------------- | -| `chunkSize` | Number | `20` | Number of rows rendered per chunk | +| `chunkSize` | Number | `50` | Number of rows rendered per chunk | | `bufferSize` | Number | `1` | Number of chunks rendered before and after the visible area | All other props behave the same as in the original [`vue-pivottable`](https://github.com/vue-pivottable/vue3-pivottable) package.