From b620f655771e4971dae2f61929ca60516e1f5bf2 Mon Sep 17 00:00:00 2001 From: Michael Kriese Date: Fri, 5 Aug 2022 16:17:37 +0200 Subject: [PATCH] feat(manager/npm): full yarn buildpack support (#16986) * feat(manager/npm): full yarn buildpack support * test: fix test --- .../manager/npm/post-update/yarn.spec.ts | 17 +++++++++++++---- lib/modules/manager/npm/post-update/yarn.ts | 13 ++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/lib/modules/manager/npm/post-update/yarn.spec.ts b/lib/modules/manager/npm/post-update/yarn.spec.ts index 3798b4e2531a9c..a965b7d9624498 100644 --- a/lib/modules/manager/npm/post-update/yarn.spec.ts +++ b/lib/modules/manager/npm/post-update/yarn.spec.ts @@ -12,6 +12,7 @@ import * as docker from '../../../../util/exec/docker'; import { getPkgReleases } from '../../../datasource'; import type { PostUpdateConfig } from '../../types'; import type { NpmManagerData } from '../types'; +import { getNodeToolConstraint } from './node-version'; import * as yarnHelper from './yarn'; jest.mock('fs-extra', () => @@ -41,8 +42,12 @@ describe('modules/manager/npm/post-update/yarn', () => { delete process.env.BUILDPACK; jest.clearAllMocks(); Fixtures.reset(); - docker.resetPrefetchedImages(); GlobalConfig.set({ localDir: '.', cacheDir: '/tmp/cache' }); + docker.resetPrefetchedImages(); + mockedFunction(getNodeToolConstraint).mockResolvedValueOnce({ + toolName: 'node', + constraint: '16.16.0', + }); }); it.each([ @@ -380,8 +385,8 @@ describe('modules/manager/npm/post-update/yarn', () => { }, }); const res = await yarnHelper.generateLockFile('some-dir', {}, config); - expect(res.lockFile).toBe('package-lock-contents'); expect(execSnapshots).toMatchObject([ + { cmd: 'install-tool node 16.16.0', options: { cwd: 'some-dir' } }, { cmd: 'install-tool corepack 0.10.0', options: { cwd: 'some-dir' } }, { cmd: 'yarn install --mode=update-lockfile', @@ -395,6 +400,7 @@ describe('modules/manager/npm/post-update/yarn', () => { }, }, ]); + expect(res.lockFile).toBe('package-lock-contents'); }); it('uses slim yarn instead of corepack', async () => { @@ -427,6 +433,7 @@ describe('modules/manager/npm/post-update/yarn', () => { const res = await yarnHelper.generateLockFile('some-dir', {}, config); expect(res.lockFile).toBe(plocktest1YarnLockV1); expect(execSnapshots).toMatchObject([ + { cmd: 'install-tool node 16.16.0', options: { cwd: 'some-dir' } }, { cmd: 'install-tool yarn-slim 1.22.18', options: { cwd: 'some-dir' } }, { cmd: 'yarn install --ignore-engines --ignore-platform --network-timeout 100000 --ignore-scripts', @@ -500,11 +507,13 @@ describe('modules/manager/npm/post-update/yarn', () => { expect(res.lockFile).toBe(plocktest1YarnLockV1); const options = { encoding: 'utf-8' }; expect(execSnapshots).toMatchObject([ - { cmd: 'docker pull renovate/node', options }, + { cmd: 'docker pull renovate/sidecar', options }, { cmd: - `docker run --rm --name=renovate_node --label=renovate_child -v ".":"." -v "/tmp/cache":"/tmp/cache" -e CI -e BUILDPACK_CACHE_DIR -w "some-dir" renovate/node ` + + `docker run --rm --name=renovate_sidecar --label=renovate_child -v ".":"." -v "/tmp/cache":"/tmp/cache" -e CI -e BUILDPACK_CACHE_DIR -w "some-dir" renovate/sidecar ` + `bash -l -c "` + + `install-tool node 16.16.0` + + ` && ` + `install-tool yarn-slim 1.22.18` + ` && ` + `sed -i 's/ steps,/ steps.slice(0,1),/' some-dir/.yarn/cli.js || true` + diff --git a/lib/modules/manager/npm/post-update/yarn.ts b/lib/modules/manager/npm/post-update/yarn.ts index 2ac99f450a72cb..e5a819d44f1054 100644 --- a/lib/modules/manager/npm/post-update/yarn.ts +++ b/lib/modules/manager/npm/post-update/yarn.ts @@ -25,7 +25,7 @@ import { uniqueStrings } from '../../../../util/string'; import { NpmDatasource } from '../../../datasource/npm'; import type { PostUpdateConfig, Upgrade } from '../../types'; import type { NpmManagerData } from '../types'; -import { getNodeConstraint, getNodeUpdate } from './node-version'; +import { getNodeToolConstraint } from './node-version'; import type { GenerateLockFileResult } from './types'; export async function checkYarnrc( @@ -94,7 +94,9 @@ export async function generateLockFile( logger.debug(`Spawning yarn install to create ${lockFileName}`); let lockFile: string | null = null; try { - const toolConstraints: ToolConstraint[] = []; + const toolConstraints: ToolConstraint[] = [ + await getNodeToolConstraint(config, upgrades), + ]; const yarnUpdate = upgrades.find(isYarnUpdate); const yarnCompatibility = yarnUpdate ? yarnUpdate.newValue @@ -172,15 +174,12 @@ export async function generateLockFile( extraEnv.YARN_ENABLE_SCRIPTS = '0'; } } - const tagConstraint = - getNodeUpdate(upgrades) ?? (await getNodeConstraint(config)); + const execOptions: ExecOptions = { cwdFile: lockFileName, extraEnv, docker: { - image: 'node', - tagScheme: 'node', - tagConstraint, + image: 'sidecar', }, toolConstraints, };