diff --git a/test-infra/uncached-npm-install.sh b/test-infra/uncached-npm-install.sh
index 7c728aa645bca146fe413caf869a6420e86b6fc2..a2d41445d8ec116fadf0766638dfc1a7f537d24f 100755
--- a/test-infra/uncached-npm-install.sh
+++ b/test-infra/uncached-npm-install.sh
@@ -2,5 +2,14 @@
 set -e
 cd ..  # /bootstrap/
 cp test-infra/npm-shrinkwrap.json npm-shrinkwrap.json
-npm install
+# npm is flaky, so try multiple times
+MAXTRIES=3
+TRIES=1
+while ! npm install; do
+    if [ $TRIES -ge $MAXTRIES ]; then
+        exit 1
+    fi
+    TRIES=$(($TRIES + 1))
+    echo "Retrying npm install (Try $TRIES of $MAXTRIES)..."
+done
 rm npm-shrinkwrap.json