diff --git a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap index 30f6f6e5bac7e4cafdccc7a7046fd1cfd39a2905..5037b09dd13ae6fd36fda1db2deb7abe00dbe1f4 100644 --- a/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap +++ b/lib/manager/npm/extract/__snapshots__/index.spec.ts.snap @@ -15,6 +15,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -137,6 +138,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -299,6 +301,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -347,6 +350,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": "package-lock.json", "npmrc": undefined, @@ -413,6 +417,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -466,6 +471,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -601,6 +607,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -736,6 +743,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -871,6 +879,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -892,6 +901,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -1029,6 +1039,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -1050,6 +1061,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": "lerna.json", + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -1073,6 +1085,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -1210,6 +1223,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -1327,6 +1341,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined, @@ -1462,6 +1477,7 @@ Object { "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": true, }, "npmLock": undefined, "npmrc": undefined, diff --git a/lib/manager/npm/extract/index.ts b/lib/manager/npm/extract/index.ts index ebeb46e3c0e0918f1f38eed9b3200314f2735b29..7b2156cfce42f3481fdbe8bece18e5a517447ef6 100644 --- a/lib/manager/npm/extract/index.ts +++ b/lib/manager/npm/extract/index.ts @@ -369,6 +369,7 @@ export async function extractPackageFile( ...lockFiles, managerData: { lernaJsonFile, + yarnZeroInstall, }, lernaClient, lernaPackages, diff --git a/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap b/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap index 2ddd158992983bcef73502ce23e13cd3674ce227..36e86da88b919007c8e1893af4abd431fb3bf573 100644 --- a/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap +++ b/lib/manager/npm/post-update/__snapshots__/yarn.spec.ts.snap @@ -38,6 +38,33 @@ Object { } `; +exports[`manager/npm/post-update/yarn does not use global cache if zero install is detected 1`] = ` +Array [ + Object { + "cmd": "yarn install", + "options": Object { + "cwd": "some-dir", + "encoding": "utf-8", + "env": Object { + "CI": "true", + "HOME": "/home/user", + "HTTPS_PROXY": "https://example.com", + "HTTP_PROXY": "http://example.com", + "LANG": "en_US.UTF-8", + "LC_ALL": "en_US", + "NO_PROXY": "localhost", + "PATH": "/tmp/path", + "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", + "YARN_ENABLE_SCRIPTS": "0", + "YARN_HTTP_TIMEOUT": "100000", + }, + "maxBuffer": 10485760, + "timeout": 900000, + }, + }, +] +`; + exports[`manager/npm/post-update/yarn generates lock files using yarn v1.22.0 1`] = ` Array [ Object { @@ -159,6 +186,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_GLOBAL_FOLDER": "/tmp/renovate/cache/berry", @@ -187,6 +215,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_GLOBAL_FOLDER": "/tmp/renovate/cache/berry", @@ -210,6 +239,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_GLOBAL_FOLDER": "/tmp/renovate/cache/berry", @@ -238,6 +268,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_GLOBAL_FOLDER": "/tmp/renovate/cache/berry", "YARN_HTTP_TIMEOUT": "100000", @@ -260,6 +291,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_GLOBAL_FOLDER": "/tmp/renovate/cache/berry", "YARN_HTTP_TIMEOUT": "100000", @@ -287,6 +319,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_HTTP_TIMEOUT": "100000", }, @@ -308,6 +341,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_HTTP_TIMEOUT": "100000", }, @@ -434,6 +468,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_HTTP_TIMEOUT": "100000", @@ -461,6 +496,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_HTTP_TIMEOUT": "100000", @@ -483,6 +519,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_HTTP_TIMEOUT": "100000", @@ -596,6 +633,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_HTTP_TIMEOUT": "100000", @@ -618,6 +656,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_ENABLE_SCRIPTS": "0", "YARN_HTTP_TIMEOUT": "100000", @@ -645,6 +684,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_HTTP_TIMEOUT": "100000", }, @@ -666,6 +706,7 @@ Array [ "LC_ALL": "en_US", "NO_PROXY": "localhost", "PATH": "/tmp/path", + "YARN_ENABLE_GLOBAL_CACHE": "1", "YARN_ENABLE_IMMUTABLE_INSTALLS": "false", "YARN_HTTP_TIMEOUT": "100000", }, diff --git a/lib/manager/npm/post-update/yarn.spec.ts b/lib/manager/npm/post-update/yarn.spec.ts index 9b950ada230be6d5116d4872eb7272c55da841ba..b1a54229f28a03996318b2934df805e447754933 100644 --- a/lib/manager/npm/post-update/yarn.spec.ts +++ b/lib/manager/npm/post-update/yarn.spec.ts @@ -81,10 +81,7 @@ describe('manager/npm/post-update/yarn', () => { stdout: '3.0.0', stderr: '', }); - fs.readFile.mockImplementation( - (filename, encoding) => - new Promise<string>((resolve) => resolve('package-lock-contents')) - ); + fs.readFile.mockResolvedValueOnce('package-lock-contents'); const config = { constraints: { yarn: '3.0.0', @@ -97,6 +94,24 @@ describe('manager/npm/post-update/yarn', () => { expect(fixSnapshots(execSnapshots)).toMatchSnapshot(); }); + it('does not use global cache if zero install is detected', async () => { + const execSnapshots = mockExecAll(exec, { + stdout: '2.1.0', + stderr: '', + }); + fs.readFile.mockResolvedValueOnce('package-lock-contents'); + const config = { + constraints: { + yarn: '>= 2.0.0', + }, + postUpdateOptions: ['yarnDedupeFewer', 'yarnDedupeHighest'], + managerData: { yarnZeroInstall: true }, + }; + const res = await yarnHelper.generateLockFile('some-dir', {}, config); + expect(res.lockFile).toEqual('package-lock-contents'); + expect(fixSnapshots(execSnapshots)).toMatchSnapshot(); + }); + it.each([ ['1.22.0', '^1.10.0'], ['2.1.0', '>= 2.0.0'], diff --git a/lib/manager/npm/post-update/yarn.ts b/lib/manager/npm/post-update/yarn.ts index 5166f8ce47ffccb676f84fc5cc435b763c75ee27..24e15f9ef630bc1a5b03f285a759ff16ee9e176e 100644 --- a/lib/manager/npm/post-update/yarn.ts +++ b/lib/manager/npm/post-update/yarn.ts @@ -105,6 +105,10 @@ export async function generateLockFile( extraEnv.YARN_ENABLE_IMMUTABLE_INSTALLS = 'false'; extraEnv.YARN_HTTP_TIMEOUT = '100000'; extraEnv.YARN_GLOBAL_FOLDER = env.YARN_GLOBAL_FOLDER; + if (!config.managerData?.yarnZeroInstall) { + logger.debug('Enabling global cache as zero-install is not detected'); + extraEnv.YARN_ENABLE_GLOBAL_CACHE = '1'; + } } if (!getGlobalConfig().allowScripts || config.ignoreScripts) { if (isYarn1) { diff --git a/lib/manager/types.ts b/lib/manager/types.ts index 6f09f08baac548eb925af185210ae9b5a2a781ed..fb2701cd6c07119ba1844ea242fb4f8b2fe6ba08 100644 --- a/lib/manager/types.ts +++ b/lib/manager/types.ts @@ -255,7 +255,9 @@ export interface ManagerApi { } // TODO: name and properties used by npm manager -export interface PostUpdateConfig extends Record<string, any> { +export interface PostUpdateConfig<T = Record<string, any>> + extends Record<string, any>, + ManagerData<T> { updatedPackageFiles?: File[]; postUpdateOptions?: string[]; skipInstalls?: boolean; diff --git a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap index 631dbbcf5ccb41f2f709d5a05395baf1cc0a876f..281f2250844f504fef1294168e0796726f8451be 100644 --- a/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap +++ b/lib/workers/repository/extract/__snapshots__/manager-files.spec.ts.snap @@ -18,6 +18,7 @@ Array [ "lernaPackages": undefined, "managerData": Object { "lernaJsonFile": undefined, + "yarnZeroInstall": false, }, "npmLock": undefined, "npmrc": undefined,