diff --git a/lib/manager/docker-compose/index.js b/lib/manager/docker-compose/index.js index 32df37546d82e75f682617dbdc5fbdbf0570fcf9..293eec585b5704ad4204ebb38dd21aa2ce7577f9 100644 --- a/lib/manager/docker-compose/index.js +++ b/lib/manager/docker-compose/index.js @@ -1,16 +1,12 @@ const { extractDependencies } = require('./extract'); const { getPackageUpdates } = require('../docker/package'); -const { resolvePackageFile } = require('./resolve'); const { updateDependency } = require('./update'); -const contentPattern = new RegExp('(^|\\n)\\s*image:'); const language = 'docker'; module.exports = { - contentPattern, extractDependencies, getPackageUpdates, language, - resolvePackageFile, updateDependency, }; diff --git a/lib/manager/docker-compose/resolve.js b/lib/manager/docker-compose/resolve.js deleted file mode 100644 index 04d77824c1fd87dfd5f9e5e6bc36cbf2f184f360..0000000000000000000000000000000000000000 --- a/lib/manager/docker-compose/resolve.js +++ /dev/null @@ -1,22 +0,0 @@ -const { mergeChildConfig } = require('../../config'); - -module.exports = { - resolvePackageFile, -}; - -async function resolvePackageFile(config, inputFile) { - const composeConfig = mergeChildConfig( - config.docker, - config['docker-compose'] - ); - const packageFile = mergeChildConfig(composeConfig, inputFile); - logger.debug( - `Resolving packageFile ${JSON.stringify(packageFile.packageFile)}` - ); - packageFile.content = await platform.getFile(packageFile.packageFile); - if (!packageFile.content) { - logger.debug('No packageFile content'); - return null; - } - return packageFile; -} diff --git a/lib/manager/docker/index.js b/lib/manager/docker/index.js index eb6283fdc112032ac8d96d94c9f24758327c3449..0e9687649368740ebb4e90c97681b1802ed13fc9 100644 --- a/lib/manager/docker/index.js +++ b/lib/manager/docker/index.js @@ -1,14 +1,9 @@ const { extractDependencies } = require('./extract'); const { getPackageUpdates } = require('./package'); -const { resolvePackageFile } = require('./resolve'); const { updateDependency } = require('./update'); -const contentPattern = new RegExp('(^|\\n)FROM .+\\n', 'i'); - module.exports = { - contentPattern, extractDependencies, getPackageUpdates, - resolvePackageFile, updateDependency, }; diff --git a/lib/manager/docker/resolve.js b/lib/manager/docker/resolve.js deleted file mode 100644 index 3815d167bd2b55c912f0fab24707be64855a83f9..0000000000000000000000000000000000000000 --- a/lib/manager/docker/resolve.js +++ /dev/null @@ -1,29 +0,0 @@ -const configParser = require('../../config'); - -module.exports = { - resolvePackageFile, -}; - -async function resolvePackageFile(config, inputFile) { - const packageFile = configParser.mergeChildConfig(config.docker, inputFile); - logger.debug( - `Resolving packageFile ${JSON.stringify(packageFile.packageFile)}` - ); - packageFile.content = await platform.getFile(packageFile.packageFile); - if (!packageFile.content) { - logger.debug('No packageFile content'); - return null; - } - const strippedComment = packageFile.content.replace(/^((#.*?|\s*)\n)+/, ''); - const fromMatch = strippedComment.match(/^[Ff][Rr][Oo][Mm] (.*)\n/); - if (!fromMatch) { - logger.debug( - { content: packageFile.content, strippedComment }, - 'No FROM found' - ); - return null; - } - [, packageFile.currentFrom] = fromMatch; - logger.debug('Adding Dockerfile'); - return packageFile; -} diff --git a/test/manager/__snapshots__/index.spec.js.snap b/test/manager/__snapshots__/index.spec.js.snap index 79791a0c18f0bf4ae375940c48d5ab9a6a35cf15..38ee9dcdec0086d82d0910e141cdce5b5f00ed53 100644 --- a/test/manager/__snapshots__/index.spec.js.snap +++ b/test/manager/__snapshots__/index.spec.js.snap @@ -41,6 +41,10 @@ Array [ "manager": "docker", "packageFile": "other/Dockerfile", }, + Object { + "manager": "docker", + "packageFile": "another/Dockerfile", + }, ] `; diff --git a/test/manager/__snapshots__/resolve.spec.js.snap b/test/manager/__snapshots__/resolve.spec.js.snap index b71a0751cd29ce5f63c9613d3b5976b9f479098e..a9694296cc18b4a3eba076a1e2124433f0ce108e 100644 --- a/test/manager/__snapshots__/resolve.spec.js.snap +++ b/test/manager/__snapshots__/resolve.spec.js.snap @@ -47,7 +47,49 @@ Array [ ] `; -exports[`manager/resolve resolvePackageFiles() skips if no content or no match 1`] = `Array []`; +exports[`manager/resolve resolvePackageFiles() skips if no content or no match 1`] = ` +Array [ + Object { + "commitMessageTopic": "{{{depName}}} Docker tag", + "content": "# comment +", + "digest": Object { + "branchTopic": "{{{depNameSanitized}}}-{{{currentTag}}}", + "commitMessageExtra": "to {{newDigestShort}}", + "commitMessageTopic": "{{{depName}}}:{{{currentTag}}} Docker digest", + "group": Object { + "commitMessageTopic": "{{{groupName}}}", + "prBody": "This Pull Request updates Dockerfiles to the latest image digests. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#each upgrades as |upgrade|}}\\n- {{#if repositoryUrl}}[{{upgrade.depName}}]({{upgrade.repositoryUrl}}){{else}}\`{{{depName}}}\`{{/if}}: \`{{upgrade.newDigest}}\`\\n{{/each}}\\n\\n**Important**: Renovate will wait until you have merged this Pin request before creating PRs for any *upgrades*. If you do not wish to pin anything, please update your config accordingly instead of leaving this PR open.\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n- \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n- \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}", + }, + "prBody": "This Pull Request updates Docker base image \`{{{depName}}}:{{{currentTag}}}\` to the latest digest (\`{{{newDigest}}}\`). For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n- \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n- \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}", + }, + "fileMatch": Array [ + "(^|/)Dockerfile$", + ], + "group": Object { + "commitMessageTopic": "{{{groupName}}} Docker tags", + "prBody": "This Pull Request updates Dockerfiles to use image digests.\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#each upgrades as |upgrade|}}\\n- {{#if repositoryUrl}}[{{upgrade.depName}}]({{upgrade.repositoryUrl}}){{else}}\`{{{depName}}}\`{{/if}}: \`{{upgrade.newDigest}}\`\\n{{/each}}\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n- \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n- \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}", + }, + "major": Object { + "enabled": false, + }, + "manager": "docker", + "managerBranchPrefix": "docker-", + "packageFile": "Dockerfile", + "pin": Object { + "commitMessageExtra": "", + "group": Object { + "branchTopic": "digests-pin", + "commitMessageTopic": "{{{groupName}}}", + "prBody": "This Pull Request pins Dockerfiles to use image digests. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#each upgrades as |upgrade|}}\\n- {{#if repositoryUrl}}[{{upgrade.depName}}]({{upgrade.repositoryUrl}}){{else}}\`{{{depName}}}\`{{/if}}: \`{{upgrade.newDigest}}\`\\n{{/each}}\\n\\n**Important**: Renovate will wait until you have merged this Pin request before creating PRs for any *upgrades*. If you do not wish to pin anything, please update your config accordingly instead of leaving this PR open.\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n- \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n- \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}", + }, + "groupName": "Docker digests", + "prBody": "This Pull Request pins Docker base image \`{{{depName}}}:{{{currentTag}}}\` to use a digest (\`{{{newDigest}}}\`).\\nThis digest will then be kept updated via Pull Requests whenever the image is updated on the Docker registry. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n**Important**: Renovate will wait until you have merged this Pin request before creating PRs for any *upgrades*. If you do not wish to pin anything, please update your config accordingly instead of leaving this PR open.\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n- \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n- \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}", + }, + "prBody": "This Pull Request updates Docker base image \`{{{depName}}}\` from tag \`{{{currentTag}}}\` to new tag \`{{{newTag}}}\`. For details on Renovate's Docker support, please visit https://renovatebot.com/docs/language-support/docker\\n\\n{{#if schedule}}\\n**Note**: This PR was created on a configured schedule (\\"{{{schedule}}}\\"{{#if timezone}} in timezone \`{{{timezone}}}\`{{/if}}) and will not receive updates outside those times.\\n{{/if}}\\n\\n{{#if hasErrors}}\\n\\n---\\n\\n# Errors\\n\\nRenovate encountered some errors when processing your repository, so you are being notified here even if they do not directly apply to this PR.\\n\\n{{#each errors as |error|}}\\n- \`{{error.depName}}\`: {{error.message}}\\n{{/each}}\\n{{/if}}\\n\\n{{#if hasWarnings}}\\n\\n---\\n\\n# Warnings\\n\\nPlease make sure the following warnings are safe to ignore:\\n\\n{{#each warnings as |warning|}}\\n- \`{{warning.depName}}\`: {{warning.message}}\\n{{/each}}\\n{{/if}}", + }, +] +`; exports[`manager/resolve resolvePackageFiles() strips npmrc with NPM_TOKEN 1`] = ` Array [ diff --git a/test/manager/index.spec.js b/test/manager/index.spec.js index df40b3137d02806e4facc8a2472fc85f1c815aaa..f8af1dcc1d5c1dabab3bc56a209c27db616988c5 100644 --- a/test/manager/index.spec.js +++ b/test/manager/index.spec.js @@ -73,18 +73,9 @@ describe('manager', () => { 'other/Dockerfile', 'another/Dockerfile', ]); - platform.getFile.mockReturnValueOnce( - '### comment\n\n \nFROM something\nRUN something\nFROM something-else\nRUN bar' - ); - platform.getFile.mockReturnValueOnce( - 'ARG foo\nFROM something\nRUN something' - ); - platform.getFile.mockReturnValueOnce( - 'ARG foo\nno FROM at all\nRUN something' - ); const res = await manager.detectPackageFiles(config); expect(res).toMatchSnapshot(); - expect(res).toHaveLength(2); + expect(res).toHaveLength(3); }); it('finds .travis.yml files', async () => { config.travis.enabled = true; @@ -123,12 +114,6 @@ describe('manager', () => { expect(res).toMatchSnapshot(); expect(res).toHaveLength(2); }); - it('skips Dockerfiles with no content', async () => { - platform.getFileList.mockReturnValueOnce(['Dockerfile']); - platform.getFile.mockReturnValueOnce(null); - const res = await manager.detectPackageFiles(config); - expect(res).toHaveLength(0); - }); it('ignores node modules', async () => { platform.getFileList.mockReturnValueOnce([ 'package.json',