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
This commit is contained in:
parent
fac997c53b
commit
3ceb2b85da
|
@ -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.
|
||||
|
|
|
@ -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`";
|
||||
|
||||
|
||||
####################################################################################################
|
||||
|
|
|
@ -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`));
|
Loading…
Reference in New Issue