Skip to content

Commit 53cba60

Browse files
committed
CI: Use pnpm rather than yarn with Hardhat
1 parent 689b248 commit 53cba60

File tree

1 file changed

+41
-16
lines changed

1 file changed

+41
-16
lines changed

.circleci/config.yml

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ commands:
2828
steps:
2929
- run:
3030
name: Versions
31-
command: npm version
31+
command: |
32+
npm version
33+
yarn --version
34+
pnpm version || >&2 echo "pnpm not installed"
3235
3336
update-npm:
3437
steps:
@@ -52,14 +55,23 @@ commands:
5255
default: package.json
5356
steps:
5457
- restore_cache:
55-
key: <<parameters.cache-id>>-dependency-cache-v2-{{ .Environment.CIRCLE_JOB }}-{{ checksum "<<parameters.path>>/<<parameters.dependency-file>>" }}
58+
name: "Restoring <<parameters.cache-id>> cache"
59+
key: <<parameters.cache-id>>-dependency-cache-v4-{{ .Environment.CIRCLE_JOB }}-{{ checksum "<<parameters.path>>/<<parameters.dependency-file>>" }}
5660
- run:
5761
name: "<<parameters.package-manager>> install in <<parameters.path>>"
5862
command: |
5963
cd "<<parameters.path>>"
60-
[[ -e node_modules/ ]] || <<parameters.package-manager>> install
64+
if [[ ! -e node_modules/ ]]; then
65+
if [[ "<<parameters.package-manager>>" == "pnpm" ]]; then
66+
# Create a flat node_modules without symlinks. Same as the node_modules created by npm or Yarn.
67+
<<parameters.package-manager>> install --node-linker=hoisted
68+
else
69+
<<parameters.package-manager>> install
70+
fi
71+
fi
6172
- save_cache:
62-
key: <<parameters.cache-id>>-dependency-cache-v2-{{ .Environment.CIRCLE_JOB }}-{{ checksum "<<parameters.path>>/<<parameters.dependency-file>>" }}
73+
name: "Saving <<parameters.cache-id>> cache"
74+
key: <<parameters.cache-id>>-dependency-cache-v4-{{ .Environment.CIRCLE_JOB }}-{{ checksum "<<parameters.path>>/<<parameters.dependency-file>>" }}
6375
paths:
6476
- "<<parameters.path>>/node_modules/"
6577

@@ -71,13 +83,15 @@ commands:
7183
cd truffle/
7284
echo "export _TRUFFLE_COMMIT_ID=$(git rev-parse --verify HEAD)" >> $BASH_ENV
7385
- restore_cache:
86+
name: "Restoring truffle cache"
7487
key: truffle-dependency-cache-{{ checksum "truffle/yarn.lock" }}-{{ .Environment._TRUFFLE_COMMIT_ID }}
7588
- run:
7689
name: yarn install in truffle
7790
command: |
7891
cd truffle/
7992
[[ -e node_modules/ ]] || yarn install
8093
- save_cache:
94+
name: "Saving truffle cache"
8195
key: truffle-dependency-cache-{{ checksum "truffle/yarn.lock" }}-{{ .Environment._TRUFFLE_COMMIT_ID }}
8296
paths:
8397
- truffle/
@@ -93,7 +107,7 @@ commands:
93107
default: solc-js.tgz
94108
package-manager:
95109
type: enum
96-
enum: ["npm", "yarn"]
110+
enum: ["npm", "yarn", "pnpm"]
97111
default: npm
98112
steps:
99113
- run:
@@ -109,13 +123,22 @@ commands:
109123
mv package.json original-package.json
110124
# NOTE: The 'overrides' feature requires npm >= 8.3. Yarn requires `resolutions` instead.
111125
jq ". + {overrides: {solc: \"${absolute_tarball_path}\"}} + {resolutions: {solc: \"${absolute_tarball_path}\"}}" original-package.json > package.json
112-
"<<parameters.package-manager>>" install
126+
if [[ "<<parameters.package-manager>>" == "pnpm" ]]; then
127+
<<parameters.package-manager>> install --no-frozen-lockfile --node-linker=hoisted
128+
else
129+
<<parameters.package-manager>> install --no-frozen-lockfile
130+
fi
113131
- run:
114132
name: "Sanity check: all transitive dependencies successfully replaced with the tarball"
115133
command: |
116134
solc_version=$(jq --raw-output .version solc-js/package.json)
117135
cd "<<parameters.path>>"
118-
if "<<parameters.package-manager>>" list --pattern solc | grep 'solc@' | grep -v "solc@${solc_version}"; then
136+
if [[ "<<parameters.package-manager>>" == "pnpm" ]]; then
137+
dependency_version=$(pnpm list --depth Infinity solc | grep "solc" | grep -v "solc ${solc_version}" || true)
138+
else
139+
dependency_version=$(<<parameters.package-manager>> list solc | grep "solc@" | grep -v "solc@${solc_version}" || true)
140+
fi
141+
if [[ -n "${dependency_version}" ]]; then
119142
echo "Another version of solc-js is still present in the dependency tree."
120143
exit 1
121144
fi
@@ -142,11 +165,11 @@ commands:
142165
- install-dependencies:
143166
cache-id: hardhat
144167
path: hardhat
145-
package-manager: yarn
146-
dependency-file: yarn.lock
168+
package-manager: pnpm
169+
dependency-file: pnpm-lock.yaml
147170
- inject-solc-js-tarball:
148171
path: hardhat/
149-
package-manager: yarn
172+
package-manager: pnpm
150173

151174
provision-truffle-with-packaged-solcjs:
152175
description: "Clones Truffle repository and configures it to use a local clone of solc-js."
@@ -220,17 +243,18 @@ jobs:
220243
hardhat_default_solc_version=$(jq --raw-output '.dependencies.solc' hardhat/packages/hardhat-core/package.json)
221244
mkdir hardhat-default-solc/
222245
pushd hardhat-default-solc/
223-
npm install "solc@${hardhat_default_solc_version}"
246+
pnpm install --node-linker=hoisted "solc@${hardhat_default_solc_version}"
224247
popd
225248
ln -sf ../../../hardhat-default-solc/node_modules/solc/soljson.js hardhat/node_modules/solc/soljson.js
226249
- run:
227250
name: Run hardhat-core test suite with its default solc binary
228251
command: |
229252
cd hardhat/packages/hardhat-core
230-
# TODO: yarn build should not be needed to run these tests. Remove it.
231-
# See https://github.com/NomicFoundation/hardhat/issues/2486 for details.
232-
yarn build
233-
yarn test
253+
# The install command is required again here to create the correct symlinks under the hardhat-core/node_modules
254+
# In our case that is something like: solc -> ../../../node_modules/.pnpm/file+..+solc-js.tgz/node_modules/solc
255+
# See: https://pnpm.io/symlinked-node-modules-structure
256+
pnpm install
257+
pnpm test
234258
235259
hardhat-core-latest-solc:
236260
docker:
@@ -247,7 +271,8 @@ jobs:
247271
export HARDHAT_TESTS_SOLC_PATH HARDHAT_TESTS_SOLC_VERSION
248272
249273
cd hardhat/packages/hardhat-core
250-
yarn test
274+
pnpm install
275+
pnpm test
251276
252277
hardhat-sample-project:
253278
docker:

0 commit comments

Comments
 (0)