From 3ceb2b85dade06ed67480cb42f9bd773d6c65914 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Sat, 14 Dec 2019 16:26:33 +0200 Subject: [PATCH] ci: avoid hard-coding path to local yarn executable (#34384) We keep a version of yarn in the repo, at `third_party/github.com/yarnpkg/`. All CI jobs (including Windows ones) should use that version for consistency (and easier updates). The path to the actual `yarn.js` script, however, changes depending on the version (e.g. `third_party/github.com/yarnpkg/v1.21.1/...`). (NOTE: The Windows jobs are currently not using this local version, but that should be fixed in a subsequent commit.) Previously, when updating the local version of yarn, we would potentially have to update the path in several places. This commit addresses the problem by adding a Node.js script that infers the correct path. The script can be used in all places where we need to use the local version of yarn (including both Linux and Windows CI jobs), thus eliminating the need to update the path in several places. PR Close #34384 --- .circleci/config.yml | 8 +++---- .circleci/env.sh | 1 + .circleci/get-vendored-yarn-path.js | 36 +++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 .circleci/get-vendored-yarn-path.js diff --git a/.circleci/config.yml b/.circleci/config.yml index 28bb6c3890..910da903e2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -129,10 +129,10 @@ commands: # Overwrite the yarn installed in the docker container with our own version. name: Overwrite yarn with our own version command: | - ourYarn=$(realpath ./third_party/github.com/yarnpkg/yarn/releases/download/v1.17.3/bin/yarn.js) - sudo chmod a+x $ourYarn - sudo ln -fs $ourYarn /usr/local/bin/yarn - - run: echo "Yarn version $(yarn --version)" + sudo chmod a+x $CI_LOCAL_YARN_PATH + sudo ln -fs $CI_LOCAL_YARN_PATH /usr/local/bin/yarn + - run: node --version + - run: yarn --version - run: # Configure git as the CircleCI `checkout` command does. # This is needed because we only checkout on the setup job. diff --git a/.circleci/env.sh b/.circleci/env.sh index f73ea88521..a6ccbddd7a 100755 --- a/.circleci/env.sh +++ b/.circleci/env.sh @@ -35,6 +35,7 @@ setPublicVar CI_COMMIT_RANGE "`[[ ${CIRCLE_PR_NUMBER:-false} != false ]] && echo setPublicVar CI_PULL_REQUEST "${CIRCLE_PR_NUMBER:-false}"; setPublicVar CI_REPO_NAME "$CIRCLE_PROJECT_REPONAME"; setPublicVar CI_REPO_OWNER "$CIRCLE_PROJECT_USERNAME"; +setPublicVar CI_LOCAL_YARN_PATH "`node $projectDir/.circleci/get-vendored-yarn-path.js`"; #################################################################################################### diff --git a/.circleci/get-vendored-yarn-path.js b/.circleci/get-vendored-yarn-path.js new file mode 100644 index 0000000000..da90083b26 --- /dev/null +++ b/.circleci/get-vendored-yarn-path.js @@ -0,0 +1,36 @@ +#!/usr/bin/env node +'use strict'; + +/** + * **Usage:** + * ``` + * node get-vendored-yarn-path + * ``` + * + * Returns the path to the vendored `yarn.js` script, so that it can be used for setting up yarn + * aliases/symlinks and use the local, vendored yarn script instead of a globally installed one. + * + * **Context:** + * We keep a version of yarn in the repo, at `third_party/github.com/yarnpkg/`. All CI jobs should + * use that version for consistency (and easier updates). The path to the actual `yarn.js` script, + * however, changes depending on the version (e.g. `third_party/github.com/yarnpkg/v1.21.1/...`). + * + * This script infers the correct path, so that we don't have to update the path in several places, + * when we update the version of yarn in `third_party/github.com/yarnpkg/`. + */ + +const {readdirSync} = require('fs'); +const {normalize} = require('path'); + +const yarnDownloadDir = `${__dirname}/../third_party/github.com/yarnpkg/yarn/releases/download`; +const yarnVersionSubdirs = readdirSync(yarnDownloadDir); + +// Based on our current process, there should be exactly one sub-directory inside +// `vendoredYarnDownloadDir` at all times. Throw, if that is not the case. +if (yarnVersionSubdirs.length !== 1) { + throw new Error( + `Expected exactly 1 yarn version in '${yarnDownloadDir}', but found ` + + `${yarnVersionSubdirs.length}: ${yarnVersionSubdirs.join(', ')}`); +} + +console.log(normalize(`${yarnDownloadDir}/${yarnVersionSubdirs[0]}/bin/yarn.js`));