From 945aa31fb1c3d1ba58074e9c494e5627b4a2fce4 Mon Sep 17 00:00:00 2001
From: Luiz Carvalho <lucarval@redhat.com>
Date: Wed, 30 Nov 2022 05:00:40 -0500
Subject: [PATCH] feat(tekton): support official bundle resolver (#19040)

---
 .../tekton/__fixtures__/multi-doc.yaml        | 37 +++++++++++++++----
 .../tekton/__snapshots__/extract.spec.ts.snap | 18 +++++++++
 lib/modules/manager/tekton/extract.spec.ts    |  2 +-
 lib/modules/manager/tekton/extract.ts         | 29 +++++++++++----
 lib/modules/manager/tekton/readme.md          |  9 +++--
 lib/modules/manager/tekton/types.ts           |  5 ++-
 6 files changed, 79 insertions(+), 21 deletions(-)

diff --git a/lib/modules/manager/tekton/__fixtures__/multi-doc.yaml b/lib/modules/manager/tekton/__fixtures__/multi-doc.yaml
index c39ce14263..1c42e7adf1 100644
--- a/lib/modules/manager/tekton/__fixtures__/multi-doc.yaml
+++ b/lib/modules/manager/tekton/__fixtures__/multi-doc.yaml
@@ -10,7 +10,7 @@ spec:
   tasks:
   - taskRef:
       resolver: bundles
-      resource:
+      params:
       - name: bundle
         value: gcr.io/tekton-releases/catalog/upstream/pipeline-resolver:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
 ---
@@ -44,7 +44,7 @@ spec:
     spec:
       taskRef:
         resolver: bundles
-        resource:
+        params:
         - name: bundle
           value: gcr.io/tekton-releases/catalog/upstream/trigger-template-task-run-resolver
   - kind: PipelineRun
@@ -55,7 +55,7 @@ spec:
     spec:
       pipelineRef:
         resolver: bundles
-        resource:
+        params:
         - name: bundle
           value: gcr.io/tekton-releases/catalog/upstream/trigger-template-pipeline-run-resolver
 ---
@@ -63,7 +63,7 @@ kind: TaskRun
 spec:
   taskRef:
     resolver: bundles
-    resource:
+    params:
     - name: bundle
       value: gcr.io/tekton-releases/catalog/upstream/task-run
 ---
@@ -71,7 +71,7 @@ kind: TaskRun
 spec:
   taskRef:
     resolver: bundles
-    resource:
+    params:
     - name: bundle
       value: gcr.io/tekton-releases/catalog/upstream/task-run-resolver
 ---
@@ -84,7 +84,7 @@ kind: PipelineRun
 spec:
   pipelineRef:
     resolver: bundles
-    resource:
+    params:
     - name: bundle
       value: gcr.io/tekton-releases/catalog/upstream/pipeline-run-resolver
 ---
@@ -105,7 +105,30 @@ spec:
   tasks:
   - taskRef:
       resolver: bundles
-      resource:
+      params:
       - name: bundle
         value: ""
 ---
+kind: Pipeline
+spec:
+  tasks:
+  - taskRef:
+      bundle: gcr.io/tekton-releases/catalog/upstream/ignored:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
+      resolver: bundles
+      params:
+      - name: bundle
+        value: gcr.io/tekton-releases/catalog/upstream/pipeline-resolver:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
+      resource:
+      - name: bundle
+        value: gcr.io/tekton-releases/catalog/upstream/ignored:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
+---
+kind: Pipeline
+spec:
+  tasks:
+  - taskRef:
+      bundle: gcr.io/tekton-releases/catalog/upstream/ignored:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
+      resolver: bundles
+      resource:
+      - name: bundle
+        value: gcr.io/tekton-releases/catalog/upstream/pipeline-resolver:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
+---
diff --git a/lib/modules/manager/tekton/__snapshots__/extract.spec.ts.snap b/lib/modules/manager/tekton/__snapshots__/extract.spec.ts.snap
index 1e7d50094e..6617e1d2d3 100644
--- a/lib/modules/manager/tekton/__snapshots__/extract.spec.ts.snap
+++ b/lib/modules/manager/tekton/__snapshots__/extract.spec.ts.snap
@@ -132,6 +132,24 @@ exports[`modules/manager/tekton/extract extractPackageFile() extracts deps from
       "depType": "tekton-bundle",
       "skipReason": "invalid-value",
     },
+    {
+      "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+      "currentDigest": "sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b",
+      "currentValue": "1.0",
+      "datasource": "docker",
+      "depName": "gcr.io/tekton-releases/catalog/upstream/pipeline-resolver",
+      "depType": "tekton-bundle",
+      "replaceString": "gcr.io/tekton-releases/catalog/upstream/pipeline-resolver:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b",
+    },
+    {
+      "autoReplaceStringTemplate": "{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}",
+      "currentDigest": "sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b",
+      "currentValue": "1.0",
+      "datasource": "docker",
+      "depName": "gcr.io/tekton-releases/catalog/upstream/pipeline-resolver",
+      "depType": "tekton-bundle",
+      "replaceString": "gcr.io/tekton-releases/catalog/upstream/pipeline-resolver:1.0@sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b",
+    },
   ],
 }
 `;
diff --git a/lib/modules/manager/tekton/extract.spec.ts b/lib/modules/manager/tekton/extract.spec.ts
index b522c8eed7..758175e55c 100644
--- a/lib/modules/manager/tekton/extract.spec.ts
+++ b/lib/modules/manager/tekton/extract.spec.ts
@@ -9,7 +9,7 @@ describe('modules/manager/tekton/extract', () => {
         'test-file.yaml'
       );
       expect(result).toMatchSnapshot();
-      expect(result?.deps).toHaveLength(16);
+      expect(result?.deps).toHaveLength(18);
     });
 
     it('ignores file without any deps', () => {
diff --git a/lib/modules/manager/tekton/extract.ts b/lib/modules/manager/tekton/extract.ts
index c1bec54fe7..15502e8c47 100644
--- a/lib/modules/manager/tekton/extract.ts
+++ b/lib/modules/manager/tekton/extract.ts
@@ -4,7 +4,11 @@ import { logger } from '../../../logger';
 import { coerceArray } from '../../../util/array';
 import { getDep } from '../dockerfile/extract';
 import type { PackageDependency, PackageFile } from '../types';
-import type { TektonBundle, TektonResource } from './types';
+import type {
+  TektonBundle,
+  TektonResolverParamsField,
+  TektonResource,
+} from './types';
 
 export function extractPackageFile(
   content: string,
@@ -67,13 +71,13 @@ function addDep(ref: TektonBundle, deps: PackageDependency[]): void {
     return;
   }
   let imageRef: string | undefined;
-  // Find a bundle reference from the Bundle resolver
+
+  // First, find a bundle reference from the Bundle resolver
   if (ref.resolver === 'bundles') {
-    for (const field of coerceArray(ref.resource)) {
-      if (field.name === 'bundle') {
-        imageRef = field.value;
-        break;
-      }
+    imageRef = getBundleValue(ref.params);
+    if (is.nullOrUndefined(imageRef)) {
+      // Fallback to the deprecated Bundle resolver attribute
+      imageRef = getBundleValue(ref.resource);
     }
   }
 
@@ -94,3 +98,14 @@ function addDep(ref: TektonBundle, deps: PackageDependency[]): void {
   );
   deps.push(dep);
 }
+
+function getBundleValue(
+  fields: TektonResolverParamsField[] | undefined
+): string | undefined {
+  for (const field of coerceArray(fields)) {
+    if (field.name === 'bundle') {
+      return field.value;
+    }
+  }
+  return undefined;
+}
diff --git a/lib/modules/manager/tekton/readme.md b/lib/modules/manager/tekton/readme.md
index c8fa0cf7c4..db77f9107e 100644
--- a/lib/modules/manager/tekton/readme.md
+++ b/lib/modules/manager/tekton/readme.md
@@ -13,16 +13,17 @@ Tasks and Pipeline definitions can also live outside the Kubernetes cluster and
 The `tekton` manager focuses on providing updates to Tekton resource references.
 
 Right now, Renovate's Tekton manager only supports references that are [Bundles](https://tekton.dev/docs/pipelines/tekton-bundle-contracts/).
-See the [`tektoncd/resolution` project on GitHub](https://github.com/tektoncd/resolution) for the different kinds of Tekton references.
+Read the [Tekton Pipeline remote resolution docs](https://tekton.dev/docs/pipelines/resolution/) for the different kinds of Tekton references and their corresponding resolvers.
 
 ### Using a Tekton Bundle reference
 
-There are two ways to use a Tekton Bundle reference:
+There are three ways to use a Tekton Bundle reference:
 
+1. Via the [Tekton Bundles Resolver](https://tekton.dev/docs/pipelines/bundle-resolver/)
 1. Via the [`tektoncd/resolution` project](https://github.com/tektoncd/resolution)
-2. Via the `taskRun.spec.taskRef.bundle` and the `pipelineRun.spec.pipelineRef.bundle` attributes
+1. Via the `taskRun.spec.taskRef.bundle` and the `pipelineRun.spec.pipelineRef.bundle` attributes
 
-Renovate's Tekton manager supports both methods.
+Renovate's Tekton manager supports all the methods listed above.
 
 ### Set your own `fileMatch` pattern
 
diff --git a/lib/modules/manager/tekton/types.ts b/lib/modules/manager/tekton/types.ts
index 1cc689dc8f..ceec5ec624 100644
--- a/lib/modules/manager/tekton/types.ts
+++ b/lib/modules/manager/tekton/types.ts
@@ -17,10 +17,11 @@ interface TektonResourceSpec {
 export interface TektonBundle {
   bundle: string;
   resolver: string;
-  resource: TektonBundleResourceField[];
+  resource?: TektonResolverParamsField[];
+  params?: TektonResolverParamsField[];
 }
 
-interface TektonBundleResourceField {
+export interface TektonResolverParamsField {
   name: string;
   value: string;
 }
-- 
GitLab