

























@@ -1,168 +1,53 @@
1-name: Setup pnpm + store cache
2-description: Prepare pnpm via corepack and restore pnpm store cache.
1+name: Setup pnpm
2+description: Prepare pnpm from the repository packageManager and restore its store cache.
33inputs:
4-pnpm-version:
5-description: pnpm version to activate via corepack.
6-required: false
7-default: "11.0.8"
8-node-version:
9-description: Expected Node.js version already installed by actions/setup-node.
10-required: false
11-default: "24.x"
12-cache-key-suffix:
13-description: Suffix appended to the cache key.
4+package-manager-file:
5+description: package.json file that owns the packageManager pnpm pin.
146required: false
15-default: "node24-pnpm11"
16-use-restore-keys:
17-description: Whether to use restore-keys fallback for actions/cache.
7+default: "package.json"
8+lockfile-path:
9+description: pnpm lockfile used to key the store cache.
1810required: false
19-default: "true"
11+default: "pnpm-lock.yaml"
2012use-actions-cache:
21-description: Whether to restore pnpm store with actions/cache.
13+description: Whether pnpm/action-setup should cache the pnpm store.
2214required: false
2315default: "true"
2416outputs:
25-cache-enabled:
26-description: Whether actions/cache restore was enabled.
27-value: ${{ steps.pnpm-cache-config.outputs.enabled }}
28-cache-hit:
29-description: Whether the pnpm store cache had an exact key hit.
30-value: ${{ steps.pnpm-cache-restore.outputs.cache-hit }}
31-cache-matched-key:
32-description: Cache key matched by restore, if any.
33-value: ${{ steps.pnpm-cache-restore.outputs.cache-matched-key }}
34-primary-key:
35-description: Primary pnpm store cache key.
36-value: ${{ steps.pnpm-cache-config.outputs.primary-key }}
37-store-path:
38-description: Resolved pnpm store path.
39-value: ${{ steps.pnpm-store.outputs.path }}
17+pnpm-version:
18+description: Resolved pnpm version activated by the setup action.
19+value: ${{ steps.pnpm-version.outputs.pnpm-version }}
20+project-dir:
21+description: Directory containing the packageManager file used for pnpm resolution.
22+value: ${{ steps.setup-pnpm.outputs.project-dir }}
4023runs:
4124using: composite
4225steps:
43- - name: Setup pnpm (corepack retry)
26+ - name: Validate pnpm setup inputs
27+id: setup-pnpm
4428shell: bash
4529env:
46-COREPACK_ENABLE_DOWNLOAD_PROMPT: "0"
47-PNPM_VERSION: ${{ inputs.pnpm-version }}
48-REQUESTED_NODE_VERSION: ${{ inputs.node-version }}
30+PACKAGE_MANAGER_FILE: ${{ inputs.package-manager-file }}
4931run: |
5032 set -euo pipefail
51- if [[ ! "$PNPM_VERSION" =~ ^[0-9]+(\.[0-9]+){1,2}([.-][0-9A-Za-z.-]+)?$ ]]; then
52- echo "::error::Invalid pnpm-version input: '$PNPM_VERSION'"
53- exit 2
54- fi
55-56- requested_node="${REQUESTED_NODE_VERSION:-${NODE_VERSION:-}}"
57- requested_node="${requested_node#v}"
58-59- node_version_matches() {
60- local actual="$1"
61- local requested="$2"
62- if [[ -z "$requested" ]]; then
63- return 0
64- fi
65- case "$requested" in
66- *x)
67- [[ "${actual%%.*}" == "${requested%%.*}" ]]
68- ;;
69- *.*.*)
70- [[ "$actual" == "$requested" ]]
71- ;;
72- *.*)
73- [[ "$actual" == "$requested".* ]]
74- ;;
75- *)
76- [[ "${actual%%.*}" == "$requested" ]]
77- ;;
78- esac
79- }
80-81- active_node_version="$(node -p 'process.versions.node' 2>/dev/null || true)"
82- if ! node_version_matches "$active_node_version" "$requested_node"; then
83- node_roots=()
84- for root in \
85- "${RUNNER_TOOL_CACHE:-}" \
86- "${AGENT_TOOLSDIRECTORY:-}" \
87- "${ACTIONS_RUNNER_TOOL_CACHE:-}" \
88- "/opt/hostedtoolcache" \
89- "/home/runner/_work/_tool" \
90- "/Users/runner/hostedtoolcache" \
91- "/c/hostedtoolcache/windows"
92- do
93- if [[ -d "$root/node" ]]; then
94- node_roots+=("$root/node")
95- elif [[ "$(basename "$root")" == "node" && -d "$root" ]]; then
96- node_roots+=("$root")
97- fi
98- done
99-100- node_bin=""
101- for node_root in "${node_roots[@]}"; do
102- while IFS= read -r candidate; do
103- candidate_version="$("$candidate" -p 'process.versions.node' 2>/dev/null || true)"
104- if node_version_matches "$candidate_version" "$requested_node"; then
105- node_bin="$candidate"
106- break 2
107- fi
108- done < <(find "$node_root" \( -name node -o -name node.exe \) -type f 2>/dev/null | sort -r)
109- done
110-111- if [[ -n "$node_bin" ]]; then
112- echo "Using Node $("$node_bin" -p 'process.versions.node') from $node_bin"
113- export PATH="$(dirname "$node_bin"):$PATH"
114- hash -r
115- fi
116- fi
117-118- active_node_version="$(node -p 'process.versions.node' 2>/dev/null || true)"
119- if ! node_version_matches "$active_node_version" "$requested_node"; then
120- echo "::error::Expected Node '${requested_node}', but active node is '${active_node_version:-missing}' at $(command -v node || true)"
33+ project_dir="$(dirname "$PACKAGE_MANAGER_FILE")"
34+ if [[ ! -f "$PACKAGE_MANAGER_FILE" ]]; then
35+ echo "::error::package manager file not found: $PACKAGE_MANAGER_FILE"
12136 exit 1
12237 fi
38+ echo "project-dir=$project_dir" >> "$GITHUB_OUTPUT"
12339124- node -v
125- command -v node
126- command -v corepack
127- corepack enable
128- for attempt in 1 2 3; do
129- if corepack prepare "pnpm@$PNPM_VERSION" --activate; then
130- pnpm -v
131- exit 0
132- fi
133- echo "corepack prepare failed (attempt $attempt/3). Retrying..."
134- sleep $((attempt * 10))
135- done
136- exit 1
137-138- - name: Resolve pnpm store path
139-id: pnpm-store
140-shell: bash
141-run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT"
40+ - name: Setup pnpm from packageManager
41+uses: pnpm/action-setup@0e279bb959325dab635dd2c09392533439d90093
42+with:
43+package_json_file: ${{ inputs.package-manager-file }}
44+run_install: false
45+cache: ${{ inputs.use-actions-cache }}
46+cache_dependency_path: ${{ inputs.lockfile-path }}
14247143- - name: Resolve pnpm store cache keys
144-id: pnpm-cache-config
48+ - name: Record pnpm version
49+id: pnpm-version
14550shell: bash
14651env:
147-CACHE_KEY_SUFFIX: ${{ inputs.cache-key-suffix }}
148-LOCKFILE_HASH: ${{ hashFiles('pnpm-lock.yaml') }}
149-USE_ACTIONS_CACHE: ${{ inputs.use-actions-cache }}
150-USE_RESTORE_KEYS: ${{ inputs.use-restore-keys }}
151-run: |
152- set -euo pipefail
153- echo "enabled=$USE_ACTIONS_CACHE" >> "$GITHUB_OUTPUT"
154- echo "primary-key=${RUNNER_OS}-pnpm-store-${CACHE_KEY_SUFFIX}-${LOCKFILE_HASH}" >> "$GITHUB_OUTPUT"
155- if [ "$USE_RESTORE_KEYS" = "true" ]; then
156- echo "restore-keys=${RUNNER_OS}-pnpm-store-${CACHE_KEY_SUFFIX}-" >> "$GITHUB_OUTPUT"
157- else
158- echo "restore-keys=" >> "$GITHUB_OUTPUT"
159- fi
160-161- - name: Restore pnpm store cache
162-id: pnpm-cache-restore
163-if: inputs.use-actions-cache == 'true'
164-uses: actions/cache/restore@v5
165-with:
166-path: ${{ steps.pnpm-store.outputs.path }}
167-key: ${{ steps.pnpm-cache-config.outputs.primary-key }}
168-restore-keys: ${{ steps.pnpm-cache-config.outputs.restore-keys }}
52+PROJECT_DIR: ${{ steps.setup-pnpm.outputs.project-dir }}
53+run: echo "pnpm-version=$(cd "$PROJECT_DIR" && pnpm -v)" >> "$GITHUB_OUTPUT"
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。