Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/modules/manager/azure-pipelines/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ resources:
- container: linux
image: ubuntu:24.04
- container: python
image: python:3.13@sha256:3592650a0a8e6709cd4f3359dc7f1665c35bd9da6da34a9f22050aaf4878511f
image: python:3.13@sha256:e3424acce37cdb1d7f885b2d13c14a550a0b6b96ff8a58d2a08883f3f865fd1e

stages:
- stage: StageOne
Expand Down
7 changes: 6 additions & 1 deletion lib/modules/manager/terraform/__fixtures__/docker.tf
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# docker_registry_image data source
data "docker_registry_image" "ubuntu" {
name = "ubuntu:precise"
}

# docker_image resources
# https://registry.terraform.io/providers/kreuzwerker/docker/latest/docs/resources/image
resource "docker_image" "nginx" {
Expand All @@ -8,7 +13,7 @@ resource "docker_image" "invalid" {
}

resource "docker_image" "ignore_variable" {
name = "${data.docker_registry_image.ubuntu.name}"
name = data.docker_registry_image.ubuntu.name
pull_triggers = ["${data.docker_registry_image.ubuntu.sha256_digest}"]
}

Expand Down
14 changes: 13 additions & 1 deletion lib/modules/manager/terraform/extract.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ describe('modules/manager/terraform/extract', () => {
const res = await extractPackageFile(docker, 'docker.tf', {
registryAliases: { 'hub.proxy.test': 'index.docker.io' },
});
expect(res?.deps).toHaveLength(7);
expect(res?.deps).toHaveLength(8);
expect(res?.deps.filter((dep) => dep.skipReason)).toHaveLength(3);
expect(res?.deps).toMatchObject([
{
Expand Down Expand Up @@ -512,6 +512,18 @@ describe('modules/manager/terraform/extract', () => {
depType: 'docker_service',
replaceString: 'repo.mycompany.com:8080/foo-service:v1',
},
{
autoReplaceStringTemplate:
'{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}',
currentDigest: undefined,
currentValue: 'precise',
datasource: 'docker',
depName: 'ubuntu',
depType: 'docker_registry_image',
packageName: 'ubuntu',
replaceString: 'ubuntu:precise',
versioning: 'ubuntu',
},
]);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import type { ExtractConfig, PackageDependency } from '../../../types';
import { DependencyExtractor } from '../../base';
import type { TerraformDefinitionFile } from '../../hcl/types';
import type { ProviderLock } from '../../lockfile/types';
import { generic_image_resource } from './utils';
import type { GenericImageResourceDef } from '../../types';
import { generic_image_datasource, generic_image_resource } from './utils';

export class GenericDockerImageRefExtractor extends DependencyExtractor {
getCheckList(): string[] {
Expand All @@ -16,16 +17,33 @@ export class GenericDockerImageRefExtractor extends DependencyExtractor {
_locks: ProviderLock[],
config: ExtractConfig,
): PackageDependency[] {
const resourceTypMap = hclMap.resource;
if (is.nullOrUndefined(resourceTypMap)) {
const dependencies = [];

dependencies.push(
...this.extractResources(hclMap.resource, generic_image_resource, config),
);

dependencies.push(
...this.extractResources(hclMap.data, generic_image_datasource, config),
);

return dependencies;
}

private extractResources(
typeMap: Record<string, unknown> | undefined,
image_definitions: GenericImageResourceDef[],
config: ExtractConfig,
): PackageDependency[] {
if (is.nullOrUndefined(typeMap)) {
return [];
}

const dependencies = [];

for (const image_resource_def of generic_image_resource) {
for (const image_resource_def of image_definitions) {
const { type, path } = image_resource_def;
const resourceInstancesMap = resourceTypMap[type];
const resourceInstancesMap = typeMap[type];
// is there a resource with current looked at type ( `image_resource_def` )
if (!is.nonEmptyObject(resourceInstancesMap)) {
continue;
Expand All @@ -38,6 +56,7 @@ export class GenericDockerImageRefExtractor extends DependencyExtractor {
);
}
}

return dependencies;
}

Expand Down
4 changes: 4 additions & 0 deletions lib/modules/manager/terraform/extractors/resources/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ const KubernetesJobTemplateInit = [
'image',
];

export const generic_image_datasource: GenericImageResourceDef[] = [
{ type: 'docker_registry_image', path: ['name'] },
];

export const generic_image_resource: GenericImageResourceDef[] = [
// Docker provider: https://registry.terraform.io/providers/kreuzwerker/docker
{ type: 'docker_image', path: ['name'] },
Expand Down
1 change: 1 addition & 0 deletions lib/modules/manager/terraform/hcl/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ export interface TerraformDefinitionFile {
terraform?: TerraformBlock[];
module?: Record<string, TerraformModule[]>;
resource?: TerraformResources;
data?: Record<string, unknown>; // generic docker data sources
provider?: Record<string, TerraformProvider[]>;
}

Expand Down
4 changes: 4 additions & 0 deletions lib/modules/manager/terraform/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,8 @@ You can use these `depTypes` for fine-grained control, for example to disable pa
| Kubernetes StatefulSet | `kubernetes_stateful_set` | |
| Kubernetes StatefulSet v1 | `kubernetes_stateful_set_v1` | |

| Data Source | `depType` | Notes |
| --------------------- | :---------------------: | :---: |
| Docker registry image | `docker_registry_image` | |

If you need to change the versioning format, read the [versioning](../../versioning/index.md) documentation to learn more.
24 changes: 12 additions & 12 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -157,18 +157,18 @@
"@breejs/later": "4.2.0",
"@cdktf/hcl2json": "0.20.12",
"@opentelemetry/api": "1.9.0",
"@opentelemetry/context-async-hooks": "2.0.0",
"@opentelemetry/exporter-trace-otlp-http": "0.200.0",
"@opentelemetry/instrumentation": "0.200.0",
"@opentelemetry/instrumentation-bunyan": "0.46.0",
"@opentelemetry/instrumentation-http": "0.200.0",
"@opentelemetry/resource-detector-aws": "2.0.0",
"@opentelemetry/resource-detector-azure": "0.7.0",
"@opentelemetry/resource-detector-gcp": "0.34.0",
"@opentelemetry/context-async-hooks": "2.0.1",
"@opentelemetry/exporter-trace-otlp-http": "0.201.0",
"@opentelemetry/instrumentation": "0.201.0",
"@opentelemetry/instrumentation-bunyan": "0.47.0",
"@opentelemetry/instrumentation-http": "0.201.0",
"@opentelemetry/resource-detector-aws": "2.1.0",
"@opentelemetry/resource-detector-azure": "0.8.0",
"@opentelemetry/resource-detector-gcp": "0.35.0",
"@opentelemetry/resource-detector-github": "0.31.0",
"@opentelemetry/resources": "2.0.0",
"@opentelemetry/sdk-trace-base": "2.0.0",
"@opentelemetry/sdk-trace-node": "2.0.0",
"@opentelemetry/resources": "2.0.1",
"@opentelemetry/sdk-trace-base": "2.0.1",
"@opentelemetry/sdk-trace-node": "2.0.1",
"@opentelemetry/semantic-conventions": "1.33.0",
"@pnpm/parse-overrides": "1001.0.0",
"@qnighy/marshal": "0.1.3",
Expand Down Expand Up @@ -334,7 +334,7 @@
"jest-extended": "4.0.2",
"lint-staged": "15.5.2",
"markdownlint-cli2": "0.17.2",
"memfs": "4.17.1",
"memfs": "4.17.2",
"nock": "14.0.4",
"npm-run-all2": "7.0.2",
"nyc": "17.1.0",
Expand Down
Loading
Loading