|
1 | | -name: Validate corrupted Node.js SDK |
| 1 | +name: Validate Node.js |
2 | 2 |
|
3 | 3 | on: |
4 | 4 | workflow_dispatch: |
|
8 | 8 | runs-on: ${{ matrix.os }} |
9 | 9 |
|
10 | 10 | strategy: |
| 11 | + fail-fast: false |
11 | 12 | matrix: |
12 | 13 | os: [ubuntu-latest, macos-latest, windows-latest] |
| 14 | + package-manager: [npm, pnpm, yarn] |
13 | 15 |
|
14 | 16 | steps: |
15 | | - # Checkout repository |
16 | 17 | - uses: actions/checkout@v6 |
17 | 18 |
|
18 | | - # Setup Node.js |
19 | 19 | - name: Setup Node.js |
20 | 20 | uses: actions/setup-node@v6 |
21 | 21 | with: |
22 | 22 | node-version: '21' |
23 | 23 |
|
24 | | - # Setup pnpm only when pnpm-lock.yaml exists |
| 24 | + # Setup pnpm only when selected |
25 | 25 | - name: Setup pnpm |
26 | | - if: hashFiles('pnpm-lock.yaml') != '' |
| 26 | + if: matrix.package-manager == 'pnpm' |
27 | 27 | uses: pnpm/action-setup@v4 |
28 | 28 | with: |
29 | 29 | version: 10 |
30 | | - run_install: false |
| 30 | + |
31 | 31 |
|
32 | | - # Normalize runner architecture (x64 / arm64) |
| 32 | + # Normalize runner architecture |
33 | 33 | - name: Normalize runner architecture |
34 | 34 | shell: bash |
35 | 35 | run: | |
36 | 36 | echo "ARCH=$(echo '${{ runner.arch }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV |
37 | 37 |
|
38 | | - # Detect package manager and its cache path |
39 | | - - name: Detect package manager and cache path |
| 38 | + # Validate lockfile & define cache path |
| 39 | + - name: Configure package manager |
40 | 40 | shell: bash |
41 | 41 | run: | |
42 | 42 | set -e |
43 | 43 |
|
44 | | - if [ -f pnpm-lock.yaml ]; then |
45 | | - PACKAGE_MANAGER=pnpm |
46 | | - CACHE_PATH=$(pnpm store path) |
47 | | - LOCK_PATTERN="**/pnpm-lock.yaml" |
48 | | - elif [ -f yarn.lock ]; then |
49 | | - PACKAGE_MANAGER=yarn |
50 | | - CACHE_PATH=$(yarn cache dir) |
51 | | - LOCK_PATTERN="**/yarn.lock" |
52 | | - else |
53 | | - PACKAGE_MANAGER=npm |
54 | | - CACHE_PATH=$(npm config get cache) |
55 | | - LOCK_PATTERN="**/package-lock.json" |
56 | | - fi |
| 44 | + case "${{ matrix.package-manager }}" in |
| 45 | + pnpm) |
| 46 | + [ -f pnpm-lock.yaml ] || { echo "pnpm-lock.yaml not found"; exit 1; } |
| 47 | + echo "NODE_CACHE=$(pnpm store path)" >> $GITHUB_ENV |
| 48 | + echo "LOCKFILE=pnpm-lock.yaml" >> $GITHUB_ENV |
| 49 | + ;; |
| 50 | + yarn) |
| 51 | + [ -f yarn.lock ] || { echo "yarn.lock not found"; exit 1; } |
| 52 | + echo "NODE_CACHE=$(yarn cache dir)" >> $GITHUB_ENV |
| 53 | + echo "LOCKFILE=yarn.lock" >> $GITHUB_ENV |
| 54 | + ;; |
| 55 | + npm) |
| 56 | + [ -f package-lock.json ] || { echo "package-lock.json not found"; exit 1; } |
| 57 | + echo "NODE_CACHE=$(npm config get cache)" >> $GITHUB_ENV |
| 58 | + echo "LOCKFILE=package-lock.json" >> $GITHUB_ENV |
| 59 | + ;; |
| 60 | + esac |
57 | 61 |
|
58 | | - echo "PACKAGE_MANAGER=$PACKAGE_MANAGER" >> $GITHUB_ENV |
59 | | - echo "NODE_CACHE=$CACHE_PATH" >> $GITHUB_ENV |
60 | | - echo "LOCK_PATTERN=$LOCK_PATTERN" >> $GITHUB_ENV |
| 62 | + echo "PACKAGE_MANAGER=${{ matrix.package-manager }}" >> $GITHUB_ENV |
61 | 63 |
|
62 | | - # Debug resolved values |
63 | | - - name: Debug cache variables |
64 | | - shell: bash |
65 | | - run: | |
66 | | - echo "OS=${{ runner.os }}" |
67 | | - echo "ARCH=$ARCH" |
68 | | - echo "PACKAGE_MANAGER=$PACKAGE_MANAGER" |
69 | | - echo "NODE_CACHE=$NODE_CACHE" |
70 | | - echo "LOCK_PATTERN=$LOCK_PATTERN" |
71 | | -
|
72 | | - # Restore dependency cache using a unified key format |
| 64 | + # Restore cache |
73 | 65 | - name: Restore Node cache |
74 | 66 | uses: actions/cache/restore@v5 |
75 | 67 | with: |
76 | 68 | path: ${{ env.NODE_CACHE }} |
77 | | - key: node-cache-${{ runner.os }}-${{ env.ARCH }}-${{ env.PACKAGE_MANAGER }}-${{ hashFiles(env.LOCK_PATTERN) }} |
| 69 | + key: node-cache-${{ runner.os }}-${{ env.ARCH }}-${{ env.PACKAGE_MANAGER }}-${{ hashFiles(env.LOCKFILE) }} |
78 | 70 |
|
79 | | - # Install dependencies based on detected package manager |
| 71 | + # Install dependencies |
80 | 72 | - name: Install dependencies |
81 | 73 | shell: bash |
82 | 74 | run: | |
83 | | - if [ "$PACKAGE_MANAGER" = "pnpm" ]; then |
84 | | - if pnpm install --frozen-lockfile; then |
85 | | - echo "pnpm frozen-lockfile install succeeded" |
86 | | - else |
87 | | - echo "pnpm lockfile incompatible — retrying without frozen-lockfile" |
88 | | - pnpm install --no-frozen-lockfile |
89 | | - fi |
90 | | - elif [ "$PACKAGE_MANAGER" = "yarn" ]; then |
91 | | - yarn install --frozen-lockfile |
92 | | - else |
93 | | - npm ci |
94 | | - fi |
95 | | -
|
96 | | - # Run build script if present |
97 | | - - name: Build |
98 | | - shell: bash |
99 | | - run: | |
100 | | - if [ "$PACKAGE_MANAGER" = "pnpm" ]; then |
101 | | - pnpm run build |
102 | | - elif [ "$PACKAGE_MANAGER" = "yarn" ]; then |
103 | | - yarn build |
104 | | - else |
105 | | - npm run build --if-present |
106 | | - fi |
| 75 | + case "$PACKAGE_MANAGER" in |
| 76 | + pnpm) |
| 77 | + pnpm install --frozen-lockfile || pnpm install --no-frozen-lockfile |
| 78 | + ;; |
| 79 | + yarn) |
| 80 | + yarn install --frozen-lockfile |
| 81 | + ;; |
| 82 | + npm) |
| 83 | + npm ci |
| 84 | + ;; |
| 85 | + esac |
0 commit comments