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`));