Skip to content

Commit

Permalink
feat(manager/dockerfile): add support for registryAliases (#17139)
Browse files Browse the repository at this point in the history
Co-authored-by: Rhys Arkins <rhys@arkins.net>
Co-authored-by: Niko Hass <nikohass571@gmail.com>
Co-authored-by: Niko Haß <48032410+nikohass@users.noreply.github.com>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
  • Loading branch information
5 people committed Aug 17, 2022
1 parent a3c8e20 commit 551a40c
Show file tree
Hide file tree
Showing 14 changed files with 604 additions and 84 deletions.
5 changes: 5 additions & 0 deletions docs/usage/configuration-options.md
Expand Up @@ -2525,6 +2525,11 @@ This feature works with the following managers:
- [`helmv3`](/modules/manager/helmv3/)
- [`helmfile`](/modules/manager/helmfile/)
- [`gitlabci`](/modules/manager/gitlabci/)
- [`dockerfile`](/modules/manager/dockerfile)
- [`docker-compose`](/modules/manager/docker-compose)
- [`kubernetes`](/modules/manager/kubernetes)
- [`ansible`](/modules/manager/ansible)
- [`droneci`](/modules/manager/droneci)

## registryUrls

Expand Down
12 changes: 11 additions & 1 deletion lib/config/options/index.ts
Expand Up @@ -822,7 +822,17 @@ const options: RenovateOptions[] = [
type: 'string',
format: 'uri',
},
supportedManagers: ['helm-requirements', 'helmv3', 'helmfile', 'gitlabci'],
supportedManagers: [
'helm-requirements',
'helmv3',
'helmfile',
'gitlabci',
'dockerfile',
'docker-compose',
'kubernetes',
'ansible',
'droneci',
],
},
{
name: 'defaultRegistryUrls',
Expand Down
97 changes: 94 additions & 3 deletions lib/modules/manager/ansible/extract.spec.ts
Expand Up @@ -4,19 +4,110 @@ import { extractPackageFile } from '.';
describe('modules/manager/ansible/extract', () => {
describe('extractPackageFile()', () => {
it('returns null for empty', () => {
expect(extractPackageFile('nothing here')).toBeNull();
expect(extractPackageFile('nothing here', '', {})).toBeNull();
});

it('extracts multiple image lines from docker_container', () => {
const res = extractPackageFile(Fixtures.get('main1.yaml'));
const res = extractPackageFile(Fixtures.get('main1.yaml'), '', {});
expect(res?.deps).toMatchSnapshot();
expect(res?.deps).toHaveLength(9);
});

it('extracts multiple image lines from docker_service', () => {
const res = extractPackageFile(Fixtures.get('main2.yaml'));
const res = extractPackageFile(Fixtures.get('main2.yaml'), '', {});
expect(res?.deps).toMatchSnapshot();
expect(res?.deps).toHaveLength(4);
});

it('extracts image and replaces registry', () => {
const res = extractPackageFile(
`---
- name: Re-create a redis container
docker_container:
name: myredis
image: quay.io/redis:0.0.1`,
'',
{
registryAliases: {
'quay.io': 'my-quay-mirror.registry.com',
},
}
);
expect(res).toEqual({
deps: [
{
autoReplaceStringTemplate:
'quay.io/redis:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
currentDigest: undefined,
currentValue: '0.0.1',
datasource: 'docker',
depName: 'my-quay-mirror.registry.com/redis',
replaceString: 'quay.io/redis:0.0.1',
versioning: 'docker',
},
],
});
});

it('extracts image but no replacement', () => {
const res = extractPackageFile(
`---
- name: Re-create a redis container
docker_container:
name: myredis
image: quay.io/redis:0.0.1`,
'',
{
registryAliases: {
'index.docker.io': 'my-docker-mirror.registry.com',
},
}
);
expect(res).toEqual({
deps: [
{
autoReplaceStringTemplate:
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
currentDigest: undefined,
currentValue: '0.0.1',
datasource: 'docker',
depName: 'quay.io/redis',
replaceString: 'quay.io/redis:0.0.1',
versioning: 'docker',
},
],
});
});

it('extracts image and no double replacement', () => {
const res = extractPackageFile(
`---
- name: Re-create a redis container
docker_container:
name: myredis
image: quay.io/redis:0.0.1`,
'',
{
registryAliases: {
'quay.io': 'my-quay-mirror.registry.com',
'my-quay-mirror.registry.com': 'quay.io',
},
}
);
expect(res).toEqual({
deps: [
{
autoReplaceStringTemplate:
'quay.io/redis:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
currentDigest: undefined,
currentValue: '0.0.1',
datasource: 'docker',
depName: 'my-quay-mirror.registry.com/redis',
replaceString: 'quay.io/redis:0.0.1',
versioning: 'docker',
},
],
});
});
});
});
10 changes: 7 additions & 3 deletions lib/modules/manager/ansible/extract.ts
Expand Up @@ -2,17 +2,21 @@ import { logger } from '../../../logger';
import { newlineRegex, regEx } from '../../../util/regex';
import * as dockerVersioning from '../../versioning/docker';
import { getDep } from '../dockerfile/extract';
import type { PackageDependency, PackageFile } from '../types';
import type { ExtractConfig, PackageDependency, PackageFile } from '../types';

export function extractPackageFile(content: string): PackageFile | null {
export function extractPackageFile(
content: string,
_filename: string,
config: ExtractConfig
): PackageFile | null {
logger.trace('ansible.extractPackageFile()');
let deps: PackageDependency[] = [];
const re = regEx(/^\s*image:\s*'?"?([^\s'"]+)'?"?\s*$/);
for (const line of content.split(newlineRegex)) {
const match = re.exec(line);
if (match) {
const currentFrom = match[1];
const dep = getDep(currentFrom);
const dep = getDep(currentFrom, true, config.registryAliases);
logger.debug(
{
depName: dep.depName,
Expand Down
105 changes: 98 additions & 7 deletions lib/modules/manager/docker-compose/extract.spec.ts
Expand Up @@ -9,37 +9,37 @@ const yamlFile3DefaultValue = Fixtures.get('docker-compose.3-default-val.yml');
describe('modules/manager/docker-compose/extract', () => {
describe('extractPackageFile()', () => {
it('returns null for empty', () => {
expect(extractPackageFile('')).toBeNull();
expect(extractPackageFile('', '', {})).toBeNull();
});

it('returns null for non-object YAML', () => {
expect(extractPackageFile('nothing here')).toBeNull();
expect(extractPackageFile('nothing here', '', {})).toBeNull();
});

it('returns null for malformed YAML', () => {
expect(extractPackageFile('nothing here\n:::::::')).toBeNull();
expect(extractPackageFile('nothing here\n:::::::', '', {})).toBeNull();
});

it('extracts multiple image lines for version 1', () => {
const res = extractPackageFile(yamlFile1);
const res = extractPackageFile(yamlFile1, '', {});
expect(res?.deps).toMatchSnapshot();
expect(res?.deps).toHaveLength(8);
});

it('extracts multiple image lines for version 3', () => {
const res = extractPackageFile(yamlFile3);
const res = extractPackageFile(yamlFile3, '', {});
expect(res?.deps).toMatchSnapshot();
expect(res?.deps).toHaveLength(8);
});

it('extracts multiple image lines for version 3 without set version key', () => {
const res = extractPackageFile(yamlFile3NoVersion);
const res = extractPackageFile(yamlFile3NoVersion, '', {});
expect(res?.deps).toMatchSnapshot();
expect(res?.deps).toHaveLength(8);
});

it('extracts default variable values for version 3', () => {
const res = extractPackageFile(yamlFile3DefaultValue);
const res = extractPackageFile(yamlFile3DefaultValue, '', {});
expect(res?.deps).toMatchInlineSnapshot(`
[
{
Expand All @@ -54,5 +54,96 @@ describe('modules/manager/docker-compose/extract', () => {
`);
expect(res?.deps).toHaveLength(1);
});

it('extracts image and replaces registry', () => {
const res = extractPackageFile(
`
version: "3"
services:
nginx:
image: quay.io/nginx:0.0.1
`,
'',
{
registryAliases: {
'quay.io': 'my-quay-mirror.registry.com',
},
}
);
expect(res).toEqual({
deps: [
{
autoReplaceStringTemplate:
'quay.io/nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
currentDigest: undefined,
currentValue: '0.0.1',
datasource: 'docker',
depName: 'my-quay-mirror.registry.com/nginx',
replaceString: 'quay.io/nginx:0.0.1',
},
],
});
});

it('extracts image but no replacement', () => {
const res = extractPackageFile(
`
version: "3"
services:
nginx:
image: quay.io/nginx:0.0.1
`,
'',
{
registryAliases: {
'index.docker.io': 'my-docker-mirror.registry.com',
},
}
);
expect(res).toEqual({
deps: [
{
autoReplaceStringTemplate:
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
currentDigest: undefined,
currentValue: '0.0.1',
datasource: 'docker',
depName: 'quay.io/nginx',
replaceString: 'quay.io/nginx:0.0.1',
},
],
});
});

it('extracts image and no double replacement', () => {
const res = extractPackageFile(
`
version: "3"
services:
nginx:
image: quay.io/nginx:0.0.1
`,
'',
{
registryAliases: {
'quay.io': 'my-quay-mirror.registry.com',
'my-quay-mirror.registry.com': 'quay.io',
},
}
);
expect(res).toEqual({
deps: [
{
autoReplaceStringTemplate:
'quay.io/nginx:{{#if newValue}}{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
currentDigest: undefined,
currentValue: '0.0.1',
datasource: 'docker',
depName: 'my-quay-mirror.registry.com/nginx',
replaceString: 'quay.io/nginx:0.0.1',
},
],
});
});
});
});
7 changes: 4 additions & 3 deletions lib/modules/manager/docker-compose/extract.ts
Expand Up @@ -3,7 +3,7 @@ import { load } from 'js-yaml';
import { logger } from '../../../logger';
import { newlineRegex, regEx } from '../../../util/regex';
import { getDep } from '../dockerfile/extract';
import type { PackageFile } from '../types';
import type { ExtractConfig, PackageFile } from '../types';
import type { DockerComposeConfig } from './types';

class LineMapper {
Expand All @@ -30,7 +30,8 @@ class LineMapper {

export function extractPackageFile(
content: string,
fileName?: string
fileName: string,
extractConfig: ExtractConfig
): PackageFile | null {
logger.debug('docker-compose.extractPackageFile()');
let config: DockerComposeConfig;
Expand Down Expand Up @@ -71,7 +72,7 @@ export function extractPackageFile(
const deps = Object.values(services || {})
.filter((service) => is.string(service?.image) && !service?.build)
.map((service) => {
const dep = getDep(service.image);
const dep = getDep(service.image, true, extractConfig.registryAliases);
const lineNumber = lineMapper.pluckLineNumber(service.image);
// istanbul ignore if
if (!lineNumber) {
Expand Down

0 comments on commit 551a40c

Please sign in to comment.