-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add alternative command to run npm ci
with cache
#96
base: trunk
Are you sure you want to change the base?
Changes from all commits
f3e98ac
53d9684
84d6b95
574c11b
154bde2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
#!/bin/bash -eu | ||
|
||
# Ensure package.json is present | ||
if [ ! -f package.json ]; then | ||
echo "No package.json found!" | ||
exit 1 | ||
fi | ||
|
||
# Ensure package-lock.json is present | ||
if [ ! -f package-lock.json ]; then | ||
echo "No package-lock.json found!" | ||
exit 1 | ||
fi | ||
|
||
PLATFORM=$(uname -s) | ||
ARCHITECTURE=$(uname -m) | ||
NODE_VERSION=$(node --version) | ||
PACKAGE_HASH=$(hash_file package-lock.json) | ||
|
||
# See https://www.npmjs.com/package/patch-package#circleci | ||
if [ -d patches ]; then | ||
PATCHES_HASH=$(hash_directory patches/) | ||
else | ||
PATCHES_HASH=nopatch | ||
fi | ||
|
||
CACHEKEY="$BUILDKITE_PIPELINE_SLUG-npm-$PLATFORM-$ARCHITECTURE-node-$NODE_VERSION-$PACKAGE_HASH-$PATCHES_HASH" | ||
|
||
LOCAL_NPM_CACHE=./vendor/npm | ||
mkdir -p $LOCAL_NPM_CACHE | ||
echo "--- :npm: Set npm to use $LOCAL_NPM_CACHE for cache" | ||
npm set cache $LOCAL_NPM_CACHE | ||
echo "npm cache set to $(npm get cache)" | ||
Comment on lines
+29
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Might be worth making this configurable? |
||
|
||
echo "--- :npm: Restore npm cache if present" | ||
restore_cache "$CACHEKEY" | ||
|
||
echo "--- :npm: Install Node dependencies" | ||
|
||
# To avoid constant ECONNRESET errors a limit is set for Linux, | ||
# as this is not happening with the Mac jobs. | ||
# This issue is being tracked here: | ||
# https://github.com/npm/cli/issues/4652 | ||
if [ "$PLATFORM" = "Linux" ]; then | ||
MAX_SOCKETS=1 | ||
else | ||
# Default value from npm. | ||
# TODO: Link to source | ||
MAX_SOCKETS=15 | ||
Comment on lines
+47
to
+49
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The code this script was extracted from had the comment about 15 being the default. I had a quick look and couldn't find a reference. Need to look more and document. |
||
fi | ||
|
||
npm ci \ | ||
--unsafe-perm \ | ||
--prefer-offline \ | ||
--no-audit \ | ||
--no-progress \ | ||
--maxsockets "$MAX_SOCKETS" \ | ||
"$@" # TODO: Use approach from other commands where only a subset of flags are allowed | ||
|
||
echo "--- :npm: Save cache if necessary" | ||
# Notice that we don't cache the local node_modules. | ||
# Those get regenerated by npm ci as per Node reccomendations. | ||
# What we are caching is the root npm folder, which stores pacakge downloads so they are available if the package.json resolution demands them. | ||
# | ||
# npm stores temporary files in its cache that we don't want to extract because they might run into naming conflicts. | ||
# So, before archiving it, we remove those tmp files. | ||
# | ||
# Example: https://buildkite.com/automattic/gutenberg-mobile/builds/8857#018e37eb-7afc-4280-b736-cba76f02f1a3/524 | ||
rm -rf "$LOCAL_NPM_CACHE/_cacache/tmp" | ||
save_cache "$LOCAL_NPM_CACHE" "$CACHEKEY" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Me being pedantic:
package.json
package.json
is a file