diff --git a/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap b/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap index 0fd3a97eee973e08b4456efc998b01bd01500960..8667b51321216312de03890c210f032a746417ce 100644 --- a/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap +++ b/lib/modules/manager/poetry/__snapshots__/artifacts.spec.ts.snap @@ -112,19 +112,19 @@ Array [ exports[`modules/manager/poetry/artifacts returns updated poetry.lock using docker (constraints) 1`] = ` Array [ Object { - "cmd": "docker pull renovate/python:2.7.5", + "cmd": "docker pull renovate/sidecar", "options": Object { "encoding": "utf-8", }, }, Object { - "cmd": "docker ps --filter name=renovate_python -aq", + "cmd": "docker ps --filter name=renovate_sidecar -aq", "options": Object { "encoding": "utf-8", }, }, Object { - "cmd": "docker run --rm --name=renovate_python --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/python:2.7.5 bash -l -c \\"install-tool poetry 1.2.0 && poetry update --lock --no-interaction dep1\\"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/sidecar bash -l -c \\"install-tool python 1.2.0 && pip install --user 'poetry>=1.0' && poetry update --lock --no-interaction dep1\\"", "options": Object { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", @@ -148,19 +148,19 @@ Array [ exports[`modules/manager/poetry/artifacts returns updated poetry.lock using docker 1`] = ` Array [ Object { - "cmd": "docker pull renovate/python:3.4.2", + "cmd": "docker pull renovate/sidecar", "options": Object { "encoding": "utf-8", }, }, Object { - "cmd": "docker ps --filter name=renovate_python -aq", + "cmd": "docker ps --filter name=renovate_sidecar -aq", "options": Object { "encoding": "utf-8", }, }, Object { - "cmd": "docker run --rm --name=renovate_python --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/python:3.4.2 bash -l -c \\"install-tool poetry 1.2.0 && poetry update --lock --no-interaction dep1\\"", + "cmd": "docker run --rm --name=renovate_sidecar --label=renovate_child -v \\"/tmp/github/some/repo\\":\\"/tmp/github/some/repo\\" -v \\"/tmp/cache\\":\\"/tmp/cache\\" -e BUILDPACK_CACHE_DIR -w \\"/tmp/github/some/repo\\" renovate/sidecar bash -l -c \\"install-tool python 1.2.0 && pip install --user 'poetry>=1.0' && poetry update --lock --no-interaction dep1\\"", "options": Object { "cwd": "/tmp/github/some/repo", "encoding": "utf-8", diff --git a/lib/modules/manager/poetry/artifacts.spec.ts b/lib/modules/manager/poetry/artifacts.spec.ts index a4450781c1b95ce1d0459e14c2457aff8f35ce5f..49432cc37442bcdfa99cdb42dede11d5dff44d17 100644 --- a/lib/modules/manager/poetry/artifacts.spec.ts +++ b/lib/modules/manager/poetry/artifacts.spec.ts @@ -19,6 +19,8 @@ jest.mock('../../../util/exec/env'); jest.mock('../../datasource'); jest.mock('../../../util/host-rules'); +process.env.BUILDPACK = 'true'; + const fs: jest.Mocked<typeof _fs> = _fs as any; const datasource = mocked(_datasource); const hostRules = mocked(_hostRules); @@ -233,6 +235,57 @@ describe('modules/manager/poetry/artifacts', () => { expect(execSnapshots).toMatchSnapshot(); }); + it('returns updated poetry.lock using install mode', async () => { + GlobalConfig.set({ ...adminConfig, binarySource: 'install' }); + // poetry.lock + fs.readFile.mockResolvedValueOnce( + '[metadata]\npython-versions = "~2.7 || ^3.4"' as any + ); + const execSnapshots = mockExecAll(); + fs.readFile.mockReturnValueOnce('New poetry.lock' as any); + // poetry + datasource.getPkgReleases.mockResolvedValueOnce({ + releases: [ + { version: '1.0.0' }, + { version: '1.1.0' }, + { version: '1.2.0' }, + ], + }); + // python + datasource.getPkgReleases.mockResolvedValueOnce({ + releases: [{ version: '2.7.5' }, { version: '3.3.2' }], + }); + const updatedDeps = [{ depName: 'dep1' }]; + expect( + await updateArtifacts({ + packageFileName: 'pyproject.toml', + updatedDeps, + newPackageFileContent: pyproject1toml, + config: { + ...config, + constraints: {}, + }, + }) + ).toEqual([ + { + file: { + type: 'addition', + path: 'poetry.lock', + contents: 'New poetry.lock', + }, + }, + ]); + + expect(execSnapshots).toMatchObject([ + { cmd: 'install-tool python 1.2.0' }, + { cmd: "pip install --user 'poetry>=1.0'" }, + { + cmd: 'poetry update --lock --no-interaction dep1', + options: { cwd: '/tmp/github/some/repo' }, + }, + ]); + }); + it('catches errors', async () => { fs.readFile.mockResolvedValueOnce('Current poetry.lock' as any); fs.outputFile.mockImplementationOnce(() => { diff --git a/lib/modules/manager/poetry/artifacts.ts b/lib/modules/manager/poetry/artifacts.ts index 52aaf61aa42b3e8cb6e03fb392d0abbd249b2c1b..385e8f6040e5e9de33a7f993c6e42d76ba99386b 100644 --- a/lib/modules/manager/poetry/artifacts.ts +++ b/lib/modules/manager/poetry/artifacts.ts @@ -5,7 +5,7 @@ import { TEMPORARY_ERROR } from '../../../constants/error-messages'; import { logger } from '../../../logger'; import type { HostRule } from '../../../types'; import { exec } from '../../../util/exec'; -import type { ExecOptions, ToolConstraint } from '../../../util/exec/types'; +import type { ExecOptions } from '../../../util/exec/types'; import { deleteLocalFile, getSiblingFileName, @@ -172,27 +172,24 @@ export async function updateArtifacts({ .join(' ')}` ); } - const tagConstraint = getPythonConstraint(existingLockFileContent, config); - const constraint = + const constraint = getPythonConstraint(existingLockFileContent, config); + const poetryVersion = config.constraints?.poetry ?? getPoetryRequirement(newPackageFileContent); const extraEnv = getSourceCredentialVars( newPackageFileContent, packageFileName ); - const toolConstraint: ToolConstraint = { - toolName: 'poetry', - constraint, - }; const execOptions: ExecOptions = { cwdFile: packageFileName, extraEnv, docker: { - image: 'python', - tagConstraint, - tagScheme: 'poetry', + image: 'sidecar', }, - toolConstraints: [toolConstraint], + toolConstraints: [{ toolName: 'python', constraint }], + preCommands: [ + `pip install --user ${quote(`poetry${poetryVersion ?? ''}`)}`, + ], }; await exec(cmd, execOptions); const newPoetryLockContent = await readLocalFile(lockFileName, 'utf8');