Skip to content

Commit c5d34ba

Browse files
committed
feat: created workflows for npm publish preview , production and cleanup
1 parent 798d1e7 commit c5d34ba

File tree

4 files changed

+336
-0
lines changed

4 files changed

+336
-0
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
name: Cleanup Preview Packages
2+
3+
on:
4+
pull_request:
5+
types: [closed]
6+
workflow_run:
7+
workflows: ["Publish Production Packages"]
8+
types: [completed]
9+
10+
env:
11+
NODE_VERSION: '20'
12+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
13+
14+
jobs:
15+
cleanup-preview:
16+
runs-on: ubuntu-latest
17+
if: github.event_name == 'pull_request' || github.event.workflow_run.conclusion == 'success'
18+
19+
steps:
20+
- uses: actions/checkout@v4
21+
22+
- name: Setup Node.js
23+
uses: actions/setup-node@v4
24+
with:
25+
node-version: ${{ env.NODE_VERSION }}
26+
registry-url: 'https://registry.npmjs.org'
27+
28+
- name: Get package names
29+
id: packages
30+
run: |
31+
PACKAGES=$(find packages -name "package.json" -exec node -p "require('{}').name" \; | jq -R -s -c 'split("\n")[:-1]')
32+
echo "packages=$PACKAGES" >> $GITHUB_OUTPUT
33+
34+
- name: Cleanup preview versions
35+
run: |
36+
for package in $(echo '${{ steps.packages.outputs.packages }}' | jq -r '.[]'); do
37+
echo "Checking preview versions for $package..."
38+
39+
# Get all preview versions
40+
PREVIEW_VERSIONS=$(npm view $package versions --json | jq -r '.[]' | grep -E "0\.0\.0-pr-" || true)
41+
42+
if [ -n "$PREVIEW_VERSIONS" ]; then
43+
echo "Found preview versions for $package:"
44+
echo "$PREVIEW_VERSIONS"
45+
46+
# For closed PRs, clean up versions for this specific PR
47+
if [ "${{ github.event_name }}" = "pull_request" ]; then
48+
PR_NUMBER=${{ github.event.number }}
49+
PR_VERSIONS=$(echo "$PREVIEW_VERSIONS" | grep "pr-${PR_NUMBER}-" || true)
50+
51+
if [ -n "$PR_VERSIONS" ]; then
52+
echo "Cleaning up PR-specific versions..."
53+
for version in $PR_VERSIONS; do
54+
echo "Deprecating $package@$version"
55+
npm deprecate "$package@$version" "Preview version for closed PR #${PR_NUMBER}" || true
56+
done
57+
fi
58+
else
59+
# For successful production releases, clean up old preview versions (keep last 10)
60+
OLD_VERSIONS=$(echo "$PREVIEW_VERSIONS" | head -n -10)
61+
if [ -n "$OLD_VERSIONS" ]; then
62+
echo "Cleaning up old preview versions..."
63+
for version in $OLD_VERSIONS; do
64+
echo "Deprecating $package@$version"
65+
npm deprecate "$package@$version" "Outdated preview version" || true
66+
done
67+
fi
68+
fi
69+
fi
70+
done
71+
env:
72+
NODE_AUTH_TOKEN: ${{ env.NPM_TOKEN }}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
name: Publish Preview Packages
2+
3+
on:
4+
pull_request:
5+
paths:
6+
- 'packages/**'
7+
types: [opened, synchronize, reopened]
8+
9+
env:
10+
NODE_VERSION: '20'
11+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
12+
13+
jobs:
14+
detect-changes:
15+
runs-on: ubuntu-latest
16+
outputs:
17+
packages: ${{ steps.changes.outputs.packages }}
18+
steps:
19+
- uses: actions/checkout@v4
20+
with:
21+
fetch-depth: 0
22+
23+
- name: Detect changed packages
24+
id: changes
25+
run: |
26+
# Get changed files in packages/
27+
CHANGED_FILES=$(git diff --name-only origin/feat/v3...HEAD | grep '^packages/' || true)
28+
29+
if [ -z "$CHANGED_FILES" ]; then
30+
echo "packages=[]" >> $GITHUB_OUTPUT
31+
exit 0
32+
fi
33+
34+
# Extract unique package names
35+
PACKAGES=$(echo "$CHANGED_FILES" | cut -d'/' -f1-2 | sort -u | jq -R -s -c 'split("\n")[:-1]')
36+
echo "packages=$PACKAGES" >> $GITHUB_OUTPUT
37+
echo "Changed packages: $PACKAGES"
38+
39+
publish-preview:
40+
needs: detect-changes
41+
if: needs.detect-changes.outputs.packages != '[]'
42+
runs-on: ubuntu-latest
43+
strategy:
44+
matrix:
45+
package: ${{ fromJson(needs.detect-changes.outputs.packages) }}
46+
47+
steps:
48+
- uses: actions/checkout@v4
49+
50+
- name: Setup Node.js
51+
uses: actions/setup-node@v4
52+
with:
53+
node-version: ${{ env.NODE_VERSION }}
54+
registry-url: 'https://registry.npmjs.org'
55+
cache: 'yarn'
56+
57+
- name: Install dependencies
58+
run: yarn install --frozen-lockfile
59+
60+
- name: Generate preview version
61+
id: version
62+
run: |
63+
cd ${{ matrix.package }}
64+
CURRENT_VERSION=$(node -p "require('./package.json').version")
65+
PR_NUMBER=${{ github.event.number }}
66+
SHORT_SHA=$(echo ${{ github.event.pull_request.head.sha }} | cut -c1-7)
67+
PREVIEW_VERSION="0.0.0-pr-${PR_NUMBER}-${SHORT_SHA}-$(date +%s)"
68+
echo "preview_version=$PREVIEW_VERSION" >> $GITHUB_OUTPUT
69+
echo "current_version=$CURRENT_VERSION" >> $GITHUB_OUTPUT
70+
echo "package_name=$(node -p "require('./package.json').name")" >> $GITHUB_OUTPUT
71+
72+
- name: Update package version
73+
run: |
74+
cd ${{ matrix.package }}
75+
npm version ${{ steps.version.outputs.preview_version }} --no-git-tag-version
76+
77+
- name: Build package
78+
run: |
79+
cd ${{ matrix.package }}
80+
if [ -f "package.json" ] && grep -q '"build"' package.json; then
81+
yarn build
82+
fi
83+
if [ -f "package.json" ] && grep -q '"prepare"' package.json; then
84+
yarn prepare
85+
fi
86+
87+
- name: Publish preview package
88+
run: |
89+
cd ${{ matrix.package }}
90+
npm publish --tag preview
91+
env:
92+
NODE_AUTH_TOKEN: ${{ env.NPM_TOKEN }}
93+
94+
- name: Comment on PR
95+
uses: actions/github-script@v7
96+
with:
97+
script: |
98+
const packageName = '${{ steps.version.outputs.package_name }}';
99+
const previewVersion = '${{ steps.version.outputs.preview_version }}';
100+
101+
const body = `📦 **Preview package published for \`${{ matrix.package }}\`**
102+
103+
\`\`\`bash
104+
npm install ${packageName}@${previewVersion}
105+
# or
106+
yarn add ${packageName}@${previewVersion}
107+
\`\`\`
108+
109+
This preview version will be available for testing until the PR is merged or closed.`;
110+
111+
github.rest.issues.createComment({
112+
issue_number: context.issue.number,
113+
owner: context.repo.owner,
114+
repo: context.repo.repo,
115+
body: body
116+
});
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
name: Publish Production Packages
2+
3+
on:
4+
push:
5+
branches:
6+
- feat/v3
7+
paths:
8+
- 'packages/**'
9+
10+
env:
11+
NODE_VERSION: '20'
12+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
13+
14+
jobs:
15+
detect-changes:
16+
runs-on: ubuntu-latest
17+
outputs:
18+
packages: ${{ steps.changes.outputs.packages }}
19+
has_changes: ${{ steps.changes.outputs.has_changes }}
20+
steps:
21+
- uses: actions/checkout@v4
22+
with:
23+
fetch-depth: 0
24+
25+
- name: Detect changed packages
26+
id: changes
27+
run: |
28+
# Get changed files in the last commit
29+
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD | grep '^packages/' || true)
30+
31+
if [ -z "$CHANGED_FILES" ]; then
32+
echo "packages=[]" >> $GITHUB_OUTPUT
33+
echo "has_changes=false" >> $GITHUB_OUTPUT
34+
exit 0
35+
fi
36+
37+
# Extract unique package names
38+
PACKAGES=$(echo "$CHANGED_FILES" | cut -d'/' -f1-2 | sort -u | jq -R -s -c 'split("\n")[:-1]')
39+
echo "packages=$PACKAGES" >> $GITHUB_OUTPUT
40+
echo "has_changes=true" >> $GITHUB_OUTPUT
41+
echo "Changed packages: $PACKAGES"
42+
43+
release:
44+
needs: detect-changes
45+
if: needs.detect-changes.outputs.has_changes == 'true'
46+
runs-on: ubuntu-latest
47+
48+
steps:
49+
- uses: actions/checkout@v4
50+
with:
51+
fetch-depth: 0
52+
token: ${{ secrets.GITHUB_TOKEN }}
53+
54+
- name: Setup Node.js
55+
uses: actions/setup-node@v4
56+
with:
57+
node-version: ${{ env.NODE_VERSION }}
58+
registry-url: 'https://registry.npmjs.org'
59+
cache: 'yarn'
60+
61+
- name: Install dependencies
62+
run: yarn install --frozen-lockfile
63+
64+
- name: Build all packages
65+
run: |
66+
for package in $(echo '${{ needs.detect-changes.outputs.packages }}' | jq -r '.[]'); do
67+
echo "Building $package..."
68+
cd $package
69+
if [ -f "package.json" ] && grep -q '"build"' package.json; then
70+
yarn build
71+
fi
72+
if [ -f "package.json" ] && grep -q '"prepare"' package.json; then
73+
yarn prepare
74+
fi
75+
cd - > /dev/null
76+
done
77+
78+
- name: Create Release Pull Request or Publish
79+
id: changesets
80+
uses: changesets/action@v1
81+
with:
82+
publish: yarn release
83+
version: yarn changeset:version
84+
commit: 'chore: update package versions'
85+
title: 'chore: release packages'
86+
env:
87+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
88+
NODE_AUTH_TOKEN: ${{ env.NPM_TOKEN }}
89+
90+
- name: Create release summary
91+
if: steps.changesets.outputs.published == 'true'
92+
run: |
93+
echo "## 🎉 Packages Published" >> $GITHUB_STEP_SUMMARY
94+
echo '${{ steps.changesets.outputs.publishedPackages }}' | jq -r '.[] | "- **\(.name)@\(.version)**"' >> $GITHUB_STEP_SUMMARY
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: Validate Packages
2+
3+
on:
4+
pull_request:
5+
paths:
6+
- 'packages/**'
7+
8+
env:
9+
NODE_VERSION: '20'
10+
11+
jobs:
12+
validate:
13+
runs-on: ubuntu-latest
14+
15+
steps:
16+
- uses: actions/checkout@v4
17+
18+
- name: Setup Node.js
19+
uses: actions/setup-node@v4
20+
with:
21+
node-version: ${{ env.NODE_VERSION }}
22+
cache: 'yarn'
23+
24+
- name: Install dependencies
25+
run: yarn install --frozen-lockfile
26+
27+
- name: Validate package structure
28+
run: |
29+
for package_dir in packages/*/; do
30+
if [ -f "$package_dir/package.json" ]; then
31+
echo "Validating $package_dir..."
32+
cd "$package_dir"
33+
34+
# Check if package.json is valid
35+
node -p "JSON.stringify(require('./package.json'), null, 2)" > /dev/null
36+
37+
# Check if build script exists and works
38+
if grep -q '"build"' package.json; then
39+
echo "Running build for $package_dir..."
40+
yarn build
41+
fi
42+
43+
# Check if prepare script exists and works
44+
if grep -q '"prepare"' package.json; then
45+
echo "Running prepare for $package_dir..."
46+
yarn prepare
47+
fi
48+
49+
cd - > /dev/null
50+
fi
51+
done
52+
53+
- name: Run changesets status
54+
run: yarn changeset:status

0 commit comments

Comments
 (0)