From 21b49fff1c99da9df0697d4e87f2310665c35a8a Mon Sep 17 00:00:00 2001 From: Emma Munley <46881325+EmmaMunley@users.noreply.github.com> Date: Mon, 31 Jul 2023 12:20:21 -0400 Subject: [PATCH] TEP-0140: Produce Results from Matrixed PipelineTasks [TEP-0090: Matrix][tep-0090] proposed executing a `PipelineTask` in parallel `TaskRuns` and `Runs` with substitutions from combinations of `Parameters` in a `Matrix`. Specifying `Results` in a `Matrix` was in scope in [TEP-0090][results], and is already supported. However, producing `Results` from `PipelineTasks` with a `Matrix` was out of scope to await [TEP-0075: Object Parameters and Results][tep-0075] and [TEP-0076: Array Results][tep-0076]. This TEP aims to enable producing `Results` from `PipelineTasks` with a `Matrix` so that they can be used in subsequent `PipelineTasks`. [tep-0075]: https://github.com/tektoncd/community/blob/main/teps/0075-object-param-and-result-types.md [tep-0076]: https://github.com/tektoncd/community/blob/main/teps/0076-array-result-types.md [tep-0090]: https://github.com/tektoncd/community/blob/main/teps/0090-matrix.md [tep-0118]: https://github.com/tektoncd/community/blob/main/teps/0118-matrix-with-explicit-combinations-of-parameters.md Signed-off-by: Priti Desai --- teps/0140-producing-results-in-matrix.md | 637 +++++++++++++++++++++++ teps/README.md | 1 + teps/images/0140-matrix-use-case.png | Bin 0 -> 24815 bytes teps/images/0140-non-matrix-use-case.png | Bin 0 -> 24423 bytes 4 files changed, 638 insertions(+) create mode 100644 teps/0140-producing-results-in-matrix.md create mode 100644 teps/images/0140-matrix-use-case.png create mode 100644 teps/images/0140-non-matrix-use-case.png diff --git a/teps/0140-producing-results-in-matrix.md b/teps/0140-producing-results-in-matrix.md new file mode 100644 index 000000000..ec16b44b7 --- /dev/null +++ b/teps/0140-producing-results-in-matrix.md @@ -0,0 +1,637 @@ +--- +status: 'implementable' +title: Producing Results in Matrix +creation-date: '2023-07-31' +last-updated: '2023-08-21' +authors: + - '@emmamunley' + - '@pritidesai' + - '@jerop' +see-also: + - TEP-0075 + - TEP-0076 + - TEP-0090 + - TEP-0118 +--- + +# TEP-0140: Producing Results in Matrix + + +- [Summary](#summary) +- [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) + - [Background](#background) + - [String Results](#string-results) + - [Array Results](#array-results) + - [Object Results](#object-results) + - [Requirements](#requirements) + - [Use Cases](#use-cases) + - [1. Build and Deploy](#1-build-and-deploy) + - [2. Checking compatibility of a browser extension on various platforms and browsers](#2-checking-compatibility-of-a-browser-extension-on-various--and-) +- [Proposal](#proposal) +- [Design Details](#design-details) + - [Results Cache](#results-cache) + - [Context Variables](#context-variables) + - [Access Matrix Combinations Length](#access-matrix-combinations-length) + - [Access Aggregated Results Length](#access-aggregated-results-length) + - [Limitations](#limitations) + - [Types](#types) + - [Missing Task Results](#missing-task-results) +- [Examples](#examples) + - [1. Build and Deploy Images](#1-build-and-deploy-images) + - [2. Checking compatibility of a browser extension on various platforms and browsers](#2-checking-compatibility-of-a-browser-extension-on-various--and--1) +- [Design Evaluation](#design-evaluation) +- [Future Work](#future-work) + - [Consuming Individual or Specific Combinations of Results Produced by a Matrixed PipelineTask](#consuming-individual-or-specific-combinations-of-results-produced-by-a-matrixed-pipelinetask) +- [References](#references) + + +## Summary + +Today, we do not support producing `results` from `pipelineTasks` that have been fanned out using `matrix`. This TEP +aims to enable producing `results` from matrixed `pipelineTasks` and would enable users to: + +- Declare a matrixed `taskRun` that emits `results` of type `string` that are fanned out over multiple `taskRuns` and + aggregated into an `array` of `results` that can then be consumed by another `pipelineTask`. +- Consume an entire `array` of `results` produced by a referenced matrixed `PipelineTask`. +- Declare a matrixed `taskRun` that emits `results` of type `array` or `object` as long as those `results` are not + consumed by another `pipelineTask`. + +In summary, we propose, each fanned out `taskRun` that produces `results` of type `string` will be aggregated into an +`array` of `results` during reconciliation, in which the entire aggregated `array` of `results` can be consumed by +another `pipelineTask` using the star notion `[*]`. + +We will not limit producing `results` of type `array` or `object` from a matrixed `pipelineTask`. However, we will +validate that any `results` produced from a fanned out `pipelineTask` can only be emitted as a `String` type *IF* +that `result` is also being consumed by another `pipelineTask`. This is because we currently don't support arrays of +type `array` or arrays of type `object`. + +## Motivation + +We currently support emitting `results` from non-matrixed `pipelineTasks` which can be easily referenced by the `result` +name of the `pipelineTask`. Before `matrix` was introduced, there was only one `taskRun` from a given `pipelineTask` so +the variable has this constraint: `tasks..results..` + +In the example below, we have a `pipelineTask` "get-platforms" which produces a `result` "platforms". It will execute in +a `taskRun` named "pr-get-platforms" and its `result` can be accessed via the +variable `$(tasks.get-platforms.results.platforms[*])`. + +```yaml +tasks: +... +- name: get-platforms + taskSpec: + results: + - name: platforms + type: array + steps: + - name: write-array + image: bash:latest + script: | + #!/usr/bin/env bash + echo -n "[\"linux\",\"mac\",\"windows\"]" | tee $(results.platforms.path) +``` + +`taskRun` created: + +``` +pr-get-platforms - [\"linux\",\"mac\",\"windows\"] +``` + +Now, a `matrix` when fanned out creates multiple `taskRuns` so for a `matrix` to emit results, it is unclear how +each `results` would map back to the original matrixed `PipelineTask`. In the example below, the following `matrix` will +produce 9 `taskRuns` that will each produce a string `result` named "report-url" for each combination of platform and +browser. Since the order of the `taskRuns` is constant and deterministic, it will always produce `results` in the same +order. + +```yaml +Tasks: +... +kind: Task +metadata: + name: task-producing-results +spec: + params: + - name: platform + - name: browser + results: + - name: report-url + steps: + - name: produce-report-url + image: alpine + script: | + #!/usr/bin/env bash + echo "https://api.example/get-report/$(params.platform)-$(params.browser)" | tee $(results.report-url.path) +--- +kind: PipelineRun +metadata: + generateName: pipelinerun-with-matrix-task- +spec: + serviceAccountName: "default" + pipelineSpec: + tasks: + - name: matrix-with-task-producing-results + matrix: + params: + - name: platform + value: + - linux + - mac + - windows + - name: browser + value: + - chrome + - safari + - firefox + taskRef: + name: task-producing-results + kind: Task +``` + +`taskRuns` Created - "report-url" result produced: + +``` +pr-produce-platforms-and-browsers-0 - "path/to/report/linux-chrome" +pr-produce-platforms-and-browsers-1 - "path/to/report/linux-safari" +pr-produce-platforms-and-browsers-2 - "path/to/report/linux-firefox" +pr-produce-platforms-and-browsers-3 - "path/to/report/mac-chrome" +pr-produce-platforms-and-browsers-4 - "path/to/report/mac-safari" +pr-produce-platforms-and-browsers-5 - "path/to/report/mac-firefox" +pr-produce-platforms-and-browsers-6 - "path/to/report/windows-chrome" +pr-produce-platforms-and-browsers-7 - "path/to/report/windows-safari" +pr-produce-platforms-and-browsers-8 - "path/to/report/windows-firefox" +``` + +### Goals + +The main goal of this TEP is to enable executing a `matrixed` `pipelineTask` that can emit `result` and support +consuming all of the `results` that were produced in another `pipelineTask` as long as the type of `result` emitted +was `string`. + +### Non-Goals + +The following are out of scope for this TEP: + +1. Support a matrixed `pipelineTask` that produces `result` of type `array` or `object` that are then consumed by + another `pipelineTask`. + - A matrixed `pipelineTask` can support `result` of any type as long as they aren’t consumed by + another `pipelineTask`. However, only matrixed `pipelineTask` that produces `result` of type `string` can be + consumed by another `pipelineTask`. +2. Support consuming a specific instance or combination(s) of `result` produced by a fanned out `pipelineTask`. + - At this time, we propose only supporting whole `array` `result` replacements from a matrixed `pipelineTask` + +### Background + +Consuming `results` from previous `taskRuns` or `runs` in a `matrix`, which would dynamically generate `taskRuns` from +the fanned out `results`, is currently supported for string `results`, array `results`, and object `results`. Note that +the underlying `results` type in each must be string. + +#### String Results + +String `results` is a stable feature and is referred to as `$(tasks..results.)` and can +be passed into the `matrix` from previous `taskRuns`. + +```yaml +tasks: +... +- name: task-1 + taskRef: + name: task-1 + matrix: + - name: values + value: + - $(tasks.task-1.results.foo) # string +``` + +#### Array Results + +Array `results` is a beta feature and is referred to as `$(tasks..results.[*])`. String +replacements from arrays are supported through array indexing and are referred to +as `$(tasks..results.[i])` where i is the index. Array `results` from +previous `taskRuns` can be passed into the Matrix: + +```yaml +tasks: +... +- name: task-2 + taskRef: + name: task-2 + matrix: + - name: values + value: $(tasks.task-4.results.bar[*]) # array +``` + +#### Object Results + +Object `results` is a beta feature and is referred to as `$(tasks..results..[*])`. +String replacements from objects are supported and are referred to as `$(tasks..results..key)` where key is the object key. Strings from Object `results` from previous `taskRuns` can be passed into +the `matrix` tasks: + +```yaml +... +- name: task-3 + taskRef: + name: task-3 + matrix: + - name: values + value: $(tasks.task-4.results.rad.key) # string replacement from object result +``` + +### Requirements + +1. A `matrix` `pipelineTask` can produce `results` any type, but only `results` of type `string` can being consumed by another `pipelineTask`. +2. A `pipelineTask` that consumes `results` produced by a `matrix` `pipelineTask` must consume the entire + aggregated `array` of `results` produced during fanning out. + +### Use Cases + +#### 1. Build and Deploy + +In [TEP-0090: Matrix][tep-0090], we described use cases for `matrix` that involve building images - kaniko and +monorepos. When the +fanned out `pipelineTasks` produce the image as a `result`, the users would need to pass them to +subsequent `pipelineTasks` to scan and deploy the images, among other operations. +To be specific, the kaniko use case uses the kaniko `Task` from the Tekton Catalog which produces an +`IMAGE-DIGEST` `result`. + +In [TEP-0118][tep-0118], we expanded this with explicit combinations where the user needs to specify explicit +mapping between `IMAGE` and `DOCKERFILE`. + +```yaml + - IMAGE: "image-1" + DOCKERFILE: "path/to/Dockerfile1" + + - IMAGE: "image-2" + DOCKERFILE: "path/to/Dockerfile2" + + - IMAGE: "image-3" + DOCKERFILE: "path/to/Dockerfile3" +``` + +When the `pipelineTask` has a `matrix`, it will be fanned out to multiple `taskRuns` to execute that `task` - each of +which will +produce an `IMAGE-DIGEST` `result`. A user may want to use this `IMAGE-DIGEST` to deploy images. + +```yaml +apiVersion: tekton.dev/v1beta1 +kind: Pipeline +metadata: + name: matrix-building-images +spec: + tasks: + - ... + - name: matrix-emitting-results + matrix: + include: + - name: build-1 + params: + - name: IMAGE + value: image-1 + - name: DOCKERFILE + value: path/to/Dockerfile1 + - name: build-2 + params: + - name: IMAGE + value: image-2 + - name: DOCKERFILE + value: path/to/Dockerfile2 + - name: build-3 + params: + - name: IMAGE + value: image-3 + - name: DOCKERFILE + value: path/to/Dockerfile3 + taskSpec: + params: + - name: IMAGE + - name: DIGEST + results: + - name: IMAGE-DIGEST + steps: + - name: produce-image-digest + image: bash:latest + script: | + #!/usr/bin/env bash + echo "Building image for $(params.IMAGE)" + echo -n "$(params.DIGEST)" | sha256sum | tee $(results.IMAGE-DIGEST.path) +``` + +#### 2. Checking compatibility of a browser extension on various `platforms` and `browsers` + +As a `Pipeline` author, I need to run tests on a combination of platforms and browsers. This will fan out into 9 +different `taskRuns` that will produce a `result` "report-url" for each combination which can be used in a +subsequent `pipelineTask` to fetch the report for each platform-browser combination. + +```text +# platforms +linux +windows +mac + +# browsers +chrome +firefox +safari +``` + +``` + clone + | + v + -------------------------------------------------------------------------------------------------------------------------- + | | | | | | | | | + v v v v v v v v v +linux-chrome linux-firefox linux-safari windows-chrome windows-firefox windows-safari mac-chrome mac-firefox mac-safari + | | | | | | | | | + v v v v v v v v v +report-url-0 report-url-1 report-url-2 report-url-3 report-url-4 report-url-5 report-url-6 report-url-7 report-url-8 +``` + +```yaml +apiVersion: tekton.dev/v1beta1 +kind: Pipeline +metadata: + name: matrix-testing-platform-and-browsers +spec: + tasks: + - name: test-platforms-and-browsers + matrix: + params: + - name: platform + value: + - linux + - mac + - windows + - name: browser + value: + - chrome + - safari + - firefox + taskSpec: + params: + - name: platform + type: string + - name: browser + type: string + results: + - name: report-url + type: string + steps: + - name: produce-report-url + image: alpine + script: | + echo "Running tests on $(params.platform)-$(params.browser)" + echo -n "https://api.example/get-report/$(params.platform)-$(params.browser)" | tee $(results.report-url.path) +``` + +## Proposal + +To support enabling a matrixed `pipelineTask` to produce `results`, we propose, each fanned out `taskRun` that +produces `result` of type `string` will be aggregated into an `array` of `results` during reconciliation, in which the +whole `array` of `results` can be consumed by another `pipelineTask` using the star notion `[*]`. + +| Result Type in `taskRef` or `taskSpec` | Parameter Type of Consumer | Specification | +|----------------------------------------|----------------------------|-------------------------------------------------------| +| string | array | `$(tasks..results.[*])` | +| array | Not Supported | Not Supported | +| object | Not Supported | Not Supported | + +## Design Details + +### Results Cache + +With this proposal, we add a `resultsCache` to `ResolvedPipelineTask` that enables caching of `results` from a +matrixed `pipelineTask` in order to prevent resolving the result references for the referenced `matrixed pipelineTask` +on every single reconcile loop. + +```go +t.ResultsCache[result.Name] = []string{result.Value.StringVal} +``` + +```go +type ResolvedPipelineTask struct { + TaskRunNames []string + TaskRuns []*v1.TaskRun + CustomTask bool + CustomRunNames []string + CustomRuns []*v1beta1.CustomRun + PipelineTask *v1.PipelineTask + ResolvedTask *resources.ResolvedTask + ResultsCache map[string][]string +} +``` + +### Context Variables + +We propose enabling `context` variables to allow users to access the `matrix` runtime data. + +#### Access Matrix Combinations Length + +The pipeline authors can access the total number of instances created as part of the `matrix` using the syntax: +`tasks..matrix.length` and `finally..matrix.length`. + +#### Access Aggregated Results Length + +The pipeline authors can access the length of the array of aggregated results that were +actually produced using the syntax: `tasks..matrix..length` +and `finally..matrix..length`. This will allow users to loop over the +results produced. + +### Limitations + +The following two sections explain the limitations of an existing proposal. It is `pipeline` authors responsibility +to design a `pipeline` around these limitations. We are in process of proposing an extension to this proposal such +that a `pipeline` author can access an individual instance in more holistic way including `params` and `results`. + +#### Types + +The producer task must have defined a `result` of type `string`, `matrix` aggregates the results from each instance of +the matrixed `pipelineTask` which can be consumed into a `param` or `when` expressions as type `array`. + +#### Missing Task Results + +[Tekton Pipelines 0.48.x][support-failed-taskrun] introduced a feature in which a `result` is consumable as long it is +initialized before the producing `task` results in a `failure`. Also, Tekton Pipelines allows `task` authors to +define a `result` but does not enforce its initialization at the runtime. These two facts influence the aggregated results +produced by the matrixed `pipelineTask`. The aggregated results will skip a `result` if it is not initialized or missing +after all instances of the `matrix` is done executing. For example, a `task` producing a result `result-1` when +fanned out to three instances, can produce an aggregated result of length `2` instead of `3`. + +## Examples + +### 1. Build and Deploy Images + +In the example below, a user is able to produce and deploy images using specific combinations of images and dockerfiles +using the task "matrix-emitting-results" which produces the result `IMAGE-DIGEST`, which is used by another matrixed +PipelineTask `task-deploy-images` to deploy the images. + +```yaml +apiVersion: tekton.dev/v1beta1 +kind: PipelineRun +metadata: + generateName: matrix-emitting-results +spec: + serviceAccountName: "default" + pipelineSpec: + tasks: + - name: matrix-emitting-results + matrix: + include: + - name: build-1 + params: + - name: IMAGE + value: image-1 + - name: DOCKERFILE + value: path/to/Dockerfile1 + - name: build-2 + params: + - name: IMAGE + value: image-2 + - name: DOCKERFILE + value: path/to/Dockerfile2 + - name: build-3 + params: + - name: IMAGE + value: image-3 + - name: DOCKERFILE + value: path/to/Dockerfile3 + taskSpec: + params: + - name: IMAGE + - name: DIGEST + default: "" + results: + - name: IMAGE-DIGEST + steps: + - name: produce-image-digest + image: bash:latest + script: | + echo "Building image for $(params.IMAGE)" + echo -n "$(params.IMAGE)" | sha256sum | tee $(results.IMAGE-DIGEST.path) + - name: task-deploy-images + params: + - name: DIGEST + value: $(tasks.matrix-emitting-results.results.IMAGE-DIGEST[*]) + taskSpec: + params: + - name: DIGESTS + type: array + steps: + - name: echo + args: [ + "$(params.DIGESTS[*])" + ] + image: alpine + script: | + echo "deploying image: $1" + echo "deploying image: $2" + echo "deploying image: $3" +``` + +### 2. Checking compatibility of a browser extension on various `platforms` and `browsers` + +In the example below, a user wants to run tests on a combination of different platforms and browsers and then fetch the +reports for all combinations. + +```yaml +apiVersion: tekton.dev/v1beta1 +kind: PipelineRun +metadata: + generateName: platforms-with-results +spec: + serviceAccountName: "default" + pipelineSpec: + tasks: + - name: matrix-emitting-results + matrix: + params: + - name: platform + value: + - linux + - mac + - windows + - name: browser + value: + - chrome + - safari + - firefox + taskSpec: + params: + - name: platform + default: "" + - name: browser + default: "" + results: + - name: report-url + type: string + steps: + - name: produce-report-url + image: alpine + script: | + echo "Running tests on $(params.platform)-$(params.browser)" + echo -n "https://api.example/get-report/$(params.platform)-$(params.browser)" | tee $(results.report-url.path) + - name: task-consuming-results + params: + - name: urls + Value: $(tasks.matrix-emitting-results.results.report-url[*]) + taskSpec: + params: + - name: urls + type: array + steps: + - name: echo + args: [ + "$(params.urls[*])" + ] + image: alpine + script: | + for arg in "$@"; do + echo "Arg: $arg" + done +``` + +## Design Evaluation + +* [Reusability](https://github.com/tektoncd/community/blob/main/design-principles.md#reusability): + * Pro: This will improve the reusability of Tekton components by enabling the scenario of a matrixed + `PipelineTask` aggregating each of the `results` produced by the fanned `taskRuns` into an array + `Result` and then a Pipeline being able to loop over those values for subsequent Tasks +* [Simplicity](https://github.com/tektoncd/community/blob/main/design-principles.md#simplicity) + * Pro: This proposal reuses the existing array or string concept for params + * Pro: This proposal + continues [the precedent of using JSONPath syntax in variable replacement](https://github.com/tektoncd/pipeline/issues/1393#issuecomment-561476075) +* [Flexibility](https://github.com/tektoncd/community/blob/main/design-principles.md#flexibility) + * Con: Although there is a precedent for including JSONPath syntax, this is a step toward including more hard coded + expression syntax in the Pipelines API (without the ability to choose other language options) +* [Conformance](https://github.com/tektoncd/community/blob/main/design-principles.md#conformance) + * Supporting array results and indexing syntax would be included in the conformance surface + + +## Future Work + +### Consuming Individual or Specific Combinations of Results Produced by a Matrixed PipelineTask + +In the future, we plan to support consuming individual or specific combinations of `Results` produced by +a matrixed `PipelineTask` so that a `pipeline` author can access an individual instance in more holistic way. An example use case is shown below: + +Without Matrix +![Without Matrix](/teps/images/0140-non-matrix-use-case.png) + +With Matrix +![With Matrix](/teps/images/0140-matrix-use-case.png) + + +## References + +* Tekton Enhancement Proposals: + * [TEP-0075:Object Parameter and Results][tep-0075] + * [TEP-0076:Object Parameter and Results][tep-0076] + * [TEP-0090: Matrix][tep-0090] + * [TEP-0118: Matrix with Explicit Combinations][tep-0118] + +[tep-0075]: ./0075-object-param-and-result-types.md +[tep-0076]: ./0076-array-result-types.md +[tep-0090]: ./0090-matrix.md +[tep-0118]: ./0118-matrix-with-explicit-combinations-of-parameters.md +[support-failed-taskrun]: https://github.com/tektoncd/pipeline/pull/6510 diff --git a/teps/README.md b/teps/README.md index 7b4cf5c92..b81f4f5af 100644 --- a/teps/README.md +++ b/teps/README.md @@ -128,3 +128,4 @@ This is the complete list of Tekton TEPs: |[TEP-0136](0136-capture-traces-for-task-pod-events.md) | Capture traces for task pod events | proposed | 2023-06-14 | |[TEP-0137](0137-cloudevents-controller.md) | CloudEvents controller | proposed | 2023-06-19 | |[TEP-0138](0138-decouple-api-and-feature-versioning.md) | Decouple api and feature versioning | proposed | 2023-07-27 | +|[TEP-0140](0140-producing-results-in-matrix.md) | Producing Results in Matrix | implementable | 2023-08-07 | diff --git a/teps/images/0140-matrix-use-case.png b/teps/images/0140-matrix-use-case.png new file mode 100644 index 0000000000000000000000000000000000000000..8574559fc2394777d73bd8fa100ea41281a1e429 GIT binary patch literal 24815 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 literal 0 HcmV?d00001 diff --git a/teps/images/0140-non-matrix-use-case.png b/teps/images/0140-non-matrix-use-case.png new file mode 100644 index 0000000000000000000000000000000000000000..9895f31a93c3fac2052bd505a053e149b7ab4be1 GIT binary patch literal 24423 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 literal 0 HcmV?d00001