From 7e824fdc5ed29e34b03b417c13000e9daf3865a1 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Fri, 28 Jul 2023 11:06:39 -0230 Subject: [PATCH] Fix non-preview draft PR builds (#20096) Certain draft PRs that add new dependencies have been failing because CI will try to use the GitHub npm registry, which we use for preview builds. This registry does not have non-preview package versions, so the installation will fail if new non-preview dependencies are needed. CI has been updated to only use the GitHub npm registry when preview builds are detected in the manifest. --- .circleci/config.yml | 20 +----------- .circleci/scripts/install-dependencies.sh | 40 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 19 deletions(-) create mode 100755 .circleci/scripts/install-dependencies.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index c35a42449..c8b82bc85 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -350,27 +350,9 @@ jobs: # required and add the new dependencies, and the cache will be persisted. - dependency-cache-v1- - gh/install - - run: - name: Set IS_DRAFT environment variable - command: | - PR_NUMBER="${CIRCLE_PULL_REQUEST##*/}" - if [ -n "$PR_NUMBER" ] - then - echo "IS_DRAFT=$(gh pr view --json isDraft --jq '.isDraft' "$PR_NUMBER")" >> "$BASH_ENV" - source "$BASH_ENV" - else - echo "Not a PR; skipping" - fi - run: name: Install dependencies - command: | - if [[ $IS_DRAFT == 'true' ]] - then - # Use GitHub registry on draft PRs, allowing the use of preview builds - METAMASK_NPM_REGISTRY=https://npm.pkg.github.com yarn --immutable - else - yarn --immutable - fi + command: .circleci/scripts/install-dependencies.sh - save_cache: key: dependency-cache-v1-{{ checksum "yarn.lock" }} paths: diff --git a/.circleci/scripts/install-dependencies.sh b/.circleci/scripts/install-dependencies.sh new file mode 100755 index 000000000..78c68c549 --- /dev/null +++ b/.circleci/scripts/install-dependencies.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +PR_NUMBER="${CIRCLE_PULL_REQUEST##*/}" +if [ -n "$PR_NUMBER" ] +then + IS_DRAFT="$(gh pr view --json isDraft --jq '.isDraft' "$PR_NUMBER")" +else + IS_DRAFT='false' +fi + +# Build query to see whether there are any "preview-like" packages in the manifest +# A "preview-like" package is a `@metamask`-scoped package with a prerelease version that has no period. +QUERY='.dependencies + .devDependencies' # Get list of all dependencies +QUERY+=' | with_entries( select(.key | startswith("@metamask") ) )' # filter to @metamask-scoped packages +QUERY+=' | to_entries[].value' # Get version ranges +QUERY+=' | select(test("^\\d+\\.\\d+\\.\\d+-[^.]+$"))' # Get pinned versions where the prerelease part has no "." + +# Use `-e` flag so that exit code indicates whether any matches were found +if jq -e "${QUERY}" < ./package.json +then + echo "Preview builds detected" + HAS_PREVIEW_BUILDS='true' +else + echo "No preview builds detected" + HAS_PREVIEW_BUILDS='false' +fi + +if [[ $IS_DRAFT == 'true' && $HAS_PREVIEW_BUILDS == 'true' ]] +then + # Use GitHub registry on draft PRs, allowing the use of preview builds + echo "Installing with preview builds" + METAMASK_NPM_REGISTRY=https://npm.pkg.github.com yarn --immutable +else + echo "Installing without preview builds" + yarn --immutable +fi