mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-25 23:11:02 +08:00
TSL
This commit is contained in:
parent
b1b7c06346
commit
2d159c0068
@ -1,223 +0,0 @@
|
||||
[#]: subject: "Write your first CI/CD pipeline in Kubernetes with Tekton"
|
||||
[#]: via: "https://opensource.com/article/21/11/cicd-pipeline-kubernetes-tekton"
|
||||
[#]: author: "Savita Ashture https://opensource.com/users/savita-ashture"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lxbwolf"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
Write your first CI/CD pipeline in Kubernetes with Tekton
|
||||
======
|
||||
Tekton is a Kubernetes-native open source framework for creating
|
||||
continuous integration and continuous delivery (CI/CD) systems.
|
||||
![Plumbing tubes in many directions][1]
|
||||
|
||||
Tekton is a Kubernetes-native open source framework for creating continuous integration and continuous delivery (CI/CD) systems. It also helps to do end-to-end (build, test, deploy) application development across multiple cloud providers or on-premises systems by abstracting away the underlying implementation details.
|
||||
|
||||
### Introduction to Tekton
|
||||
|
||||
[Tekton][2], known initially as [Knative Build][3], later got restructured as its own open source project with its own [governance organization][4] and is now a [Linux Foundation][5] project. Tekton provides an in-cluster container image build and deployment workflow—in other words, it is a continuous integration (CI) and continuous delivery (CD) service. It consists of Tekton Pipelines and several supporting components, such as Tekton CLI, Triggers, and Catalog.
|
||||
|
||||
Tekton is a Kubernetes native application. It installs and runs as an extension on a Kubernetes cluster and comprises a set of Kubernetes Custom Resources that define the building blocks you can create and reuse for your pipelines. Because it's a K-native technology, Tekton is remarkably easy to scale. When you need to increase your workload, you can just add nodes to your cluster. It's also easy to customize because of its extensible design and thanks to a community repository of contributed components.
|
||||
|
||||
Tekton is ideal for developers who need CI/CD systems to do their work and platform engineers who build CI/CD systems for developers in their organization.
|
||||
|
||||
### Tekton components
|
||||
|
||||
Building CI/CD pipelines is a far-reaching endeavor, so Tekton provides tools for every step of the way. Here are the major components you get with Tekton:
|
||||
|
||||
* **Pipeline: **Pipeline defines a set of Kubernetes [Custom Resources][6] that act as building blocks you use to assemble your CI/CD pipelines.
|
||||
* **Triggers: **Triggers is a Kubernetes Custom Resource that allows you to create pipelines based on information extracted from event payloads. For example, you can trigger the instantiation and execution of a pipeline every time a merge request gets opened against a Git repository.
|
||||
* **CLI:** CLI provides a command-line interface called `tkn` that allows you to interact with Tekton from your terminal.
|
||||
* **Dashboard:** Dashboard is a web-based graphical interface for Tekton pipelines that displays information about the execution of your pipelines.
|
||||
* **Catalog:** Catalog is a repository of high-quality, community-contributed Tekton building blocks (tasks, pipelines, and so on) ready for use in your own pipelines.
|
||||
* **Hub:** Hub is a web-based graphical interface for accessing the Tekton catalog.
|
||||
* **Operator:** Operator is a Kubernetes [Operator pattern][7] that allows you to install, update, upgrade, and remove Tekton projects on a Kubernetes cluster.
|
||||
* **Chains: **Chains is a Kubernetes Custom Resource Definition (CRD) controller that allows you to manage your supply chain security in Tekton. It is currently a work-in-progress.
|
||||
* **Results: **Results aims to help users logically group CI/CD workload history and separate out long-term result storage away from the pipeline controller.
|
||||
|
||||
|
||||
|
||||
### Tekton terminology
|
||||
|
||||
![Tekton terminology][8]
|
||||
|
||||
(Source: [Tekton documentation][9])
|
||||
|
||||
* **Step:** A step is the most basic entity in a CI/CD workflow, such as running some unit tests for a Python web app or compiling a Java program. Tekton performs each step with a provided container image.
|
||||
|
||||
* **Task:** A task is a collection of steps in a specific order. Tekton runs a task in the form of a [Kubernetes pod][10], where each step becomes a running container in the pod.
|
||||
|
||||
* **Pipelines:** A pipeline is a collection of tasks in a specific order. Tekton collects all tasks, connects them in a directed acyclic graph (DAG), and executes the graph in sequence. In other words, it creates a number of Kubernetes pods and ensures that each pod completes running successfully as desired.
|
||||
|
||||
![Tekton pipelines][11]
|
||||
|
||||
(Source: [Tekton documentation][12])
|
||||
|
||||
* **PipelineRun: **A PipelineRun, as its name implies, is a specific execution of a pipeline.
|
||||
|
||||
* **TaskRun:** A TaskRun is a specific execution of a task. TaskRuns are also available when you choose to run a task outside a pipeline, with which you may view the specifics of each step execution in a task.
|
||||
|
||||
|
||||
|
||||
|
||||
### Create your own CI/CD pipeline
|
||||
|
||||
The easiest way to get started with Tekton is to write a simple pipeline of your own. If you use Kubernetes every day, you're probably comfortable with YAML, which is precisely how Tekton pipelines are defined. Here's an example of a simple pipeline that clones a code repository.
|
||||
|
||||
First, create a file called `task.yam`**l** and open it in your favorite text editor. This file defines the steps you want to perform. In this example, that's cloning a repository, so I've named the step clone. The file sets some environment variables and then provides a simple shell script to perform the clone.
|
||||
|
||||
Next comes the task. You can think of a step as a function that gets called by the task, and the task sets parameters and workspaces required for steps.
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: git-clone
|
||||
spec:
|
||||
workspaces:
|
||||
- name: output
|
||||
description: The git repo will be cloned onto the volume backing this Workspace.
|
||||
params:
|
||||
- name: url
|
||||
description: Repository URL to clone from.
|
||||
type: string
|
||||
- name: revision
|
||||
description: Revision to checkout. (branch, tag, sha, ref, etc...)
|
||||
type: string
|
||||
default: ""
|
||||
steps:
|
||||
- name: clone
|
||||
image: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.21.0"
|
||||
env:
|
||||
- name: PARAM_URL
|
||||
value: $(params.url)
|
||||
- name: PARAM_REVISION
|
||||
value: $(params.revision)
|
||||
- name: WORKSPACE_OUTPUT_PATH
|
||||
value: $(workspaces.output.path)
|
||||
script: |
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
CHECKOUT_DIR="${WORKSPACE_OUTPUT_PATH}"
|
||||
|
||||
/ko-app/git-init \
|
||||
-url="${PARAM_URL}" \
|
||||
-revision="${PARAM_REVISION}" \
|
||||
-path="${CHECKOUT_DIR}"
|
||||
cd "${CHECKOUT_DIR}"
|
||||
EXIT_CODE="$?"
|
||||
if [ "${EXIT_CODE}" != 0 ] ; then
|
||||
exit "${EXIT_CODE}"
|
||||
fi
|
||||
# Verify clone is success by reading readme file.
|
||||
cat ${CHECKOUT_DIR}/README.md
|
||||
|
||||
```
|
||||
|
||||
Create a second file called `pipeline.yaml`, and open it in your favorite text editor. This file defines the pipeline by setting important parameters, such as a workspace where the task can be run and processed.
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Pipeline
|
||||
metadata:
|
||||
name: cat-branch-readme
|
||||
spec:
|
||||
params:
|
||||
- name: repo-url
|
||||
type: string
|
||||
description: The git repository URL to clone from.
|
||||
- name: branch-name
|
||||
type: string
|
||||
description: The git branch to clone.
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
description: |
|
||||
This workspace will receive the cloned git repo and be passed
|
||||
to the next Task for the repo's README.md file to be read.
|
||||
tasks:
|
||||
- name: fetch-repo
|
||||
taskRef:
|
||||
name: git-clone
|
||||
workspaces:
|
||||
- name: output
|
||||
workspace: shared-data
|
||||
params:
|
||||
- name: url
|
||||
value: $(params.repo-url)
|
||||
- name: revision
|
||||
value: $(params.branch-name)
|
||||
|
||||
```
|
||||
|
||||
Finally, create a file called `pipelinerun.yaml` and open it in your favorite text editor. This file actually runs the pipeline. It invokes parameters defined in the pipeline (which, in turn, invokes the task defined by the task file.)
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: git-clone-checking-out-a-branch
|
||||
spec:
|
||||
pipelineRef:
|
||||
name: cat-branch-readme
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
params:
|
||||
- name: repo-url
|
||||
value: <https://github.com/tektoncd/pipeline.git>
|
||||
- name: branch-name
|
||||
value: release-v0.12.x
|
||||
|
||||
```
|
||||
|
||||
The advantage of structuring your work in separate files is that the `git-clone` task is reusable for multiple pipelines.
|
||||
|
||||
For example, suppose you want to do end-to-end testing for a pipeline project. You can use the `git-clone`** **task to ensure that you have a fresh copy of the code you need to test.
|
||||
|
||||
### Wrap up
|
||||
|
||||
As long as you're familiar with Kubernetes, getting started with Tekton is as easy as adopting any other K-native application. It has plenty of tools to help you create pipelines and to interface with your pipelines. If you love automation, try Tekton!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/11/cicd-pipeline-kubernetes-tekton
|
||||
|
||||
作者:[Savita Ashture][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/savita-ashture
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/plumbing_pipes_tutorial_how_behind_scenes.png?itok=F2Z8OJV1 (Plumbing tubes in many directions)
|
||||
[2]: https://github.com/tektoncd/pipeline
|
||||
[3]: https://github.com/knative/build
|
||||
[4]: https://cd.foundation/
|
||||
[5]: https://www.linuxfoundation.org/projects/
|
||||
[6]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
|
||||
[7]: https://operatorhub.io/what-is-an-operator
|
||||
[8]: https://opensource.com/sites/default/files/uploads/tekto-terminology.png (Tekton terminology)
|
||||
[9]: https://tekton.dev/docs/concepts/concept-tasks-pipelines.png
|
||||
[10]: https://kubebyexample.com/en/concept/pods
|
||||
[11]: https://opensource.com/sites/default/files/uploads/tekton-pipelines.png (Tekton pipelines)
|
||||
[12]: https://tekton.dev/docs/concepts/concept-runs.png
|
@ -0,0 +1,222 @@
|
||||
[#]: subject: "Write your first CI/CD pipeline in Kubernetes with Tekton"
|
||||
[#]: via: "https://opensource.com/article/21/11/cicd-pipeline-kubernetes-tekton"
|
||||
[#]: author: "Savita Ashture https://opensource.com/users/savita-ashture"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "lxbwolf"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
用 Tekton 编写你在 Kubernetes 中的第一条 CI/CD 流水线
|
||||
======
|
||||
Tekton 是一个用于创建持续集成和持续交付(CI/CD)系统的 Kubernetes 原生开源框架。
|
||||
![Plumbing tubes in many directions][1]
|
||||
|
||||
Tekton 是一个用于创建持续集成和持续交付(CI/CD)系统的 Kubernetes 原生开源框架。通过对底层实施细节的抽象,它还可以帮助你在多个云供应商或企业内部系统中进行端到端(构建、测试、部署)应用开发。
|
||||
|
||||
### Tekton 介绍
|
||||
|
||||
[Tekton][2] 最初被称为 [Knative Build][3],后来被重组为独立的开源项目,有自己的 [治理组织][4],现在属于 [Linux 基金会][5] 的项目。Tekton 提供了一个集群内的容器镜像构建和部署工作流程,换句话说,它是一个持续集成(CI)和持续交付(CD)服务。它由 Tekton 流水线和几个支持组件如 Tekton CLI、Triggers 和 Catalog 等组成。
|
||||
|
||||
Tekton 是一个 Kubernetes 原生应用。它在 Kubernetes 集群中作为扩展被安装和运行,由一套定义了你为流水线创建和复用的构建块的 Kubernetes 定制化资源组成。由于 Tekton 是一种 Kubernetes 原生技术,所以它非常容易扩展。当你需要增加你的工作负载时,你只需向你的集群添加节点就可以了。由于其可扩展的设计和社区贡献的组件库,它也很容易定制。
|
||||
|
||||
对于需要 CI/CD 系统来开展工作的开发人员和为其组织内的开发人员建立 CI/CD 系统的平台工程师,Tekton 是理想选择。
|
||||
|
||||
### Tekton 组件
|
||||
|
||||
构建 CI/CD 流水线的过程非常复杂,因此 Tekton 为每一步都提供工具。以下是 Tekton 提供的主要组件:
|
||||
|
||||
* **Pipeline: ** Pipeline 定义了一组 Kubernetes [自定义资源][6],作为你用来组装 CI/CD 流水线的构建块。
|
||||
* **Triggers: ** Triggers 是一种 Kubernetes 自定义资源,允许你根据从事件有效载荷中提取的信息来创建流水线。例如,你可以在每次创建 Git 仓库的合并请求时,触发流水线的实例化和执行。
|
||||
* **CLI:** CLI 提供一个名为 `tkn` 的命令行界面,你可以使用它从终端与 Tekton 进行交互。
|
||||
* **Dashboard:** Dashboard 是 Tekton 流水线的一个基于网络的图形界面,显示流水线的执行信息。
|
||||
* **Catalog:** Catalog 是一个高质量的、由社区贡献的 Tekton 构建块(任务、流水线等),可在你自己的流水线中使用。
|
||||
* **Hub:** Hub 是一个基于网络的图形界面,用于访问 Tekton catalog。
|
||||
* **Operator:** Operator 是 Kubernetes 的 [Operator 模式][7],你可以在 Kubernetes 集群中安装、更新、升级和删除 Tekton 项目。
|
||||
* **Chains: ** Chains 是一个 Kubernetes <ruby>自定义资源定义<rt>Custom Resource Definition</rt></ruby>(CRD)控制器,使你可以在 Tekton 中处理供应链安全的问题。正在开发中。
|
||||
* **Results: ** Results 旨在帮助用户对 CI/CD 工作负载历史进行逻辑分组,并将长期结果的存储从流水线控制器中分离出来。
|
||||
|
||||
|
||||
|
||||
### Tekton 术语
|
||||
|
||||
![Tekton terminology][8]
|
||||
|
||||
(Source: [Tekton documentation][9])
|
||||
|
||||
* **Step:** 步骤(step)是 CI/CD 工作流程中最基本的实体,例如为 Python 网络应用程序运行一些单元测试或编译一个 Java 程序。Tekton 使用容器镜像执行每个步骤。
|
||||
|
||||
* **Task:** 任务(task)是按特定顺序排列的步骤的集合。Tekton 以 [Kubernetes pod][10] 的形式运行任务,其中每个步骤都成为 pod 中的一个运行容器。
|
||||
|
||||
* **Pipelines:** 流水线(pipeline)是按特定顺序排列的任务的集合。Tekton 把所有任务连接成一个<ruby>有向无环图<rt>directed acyclic graph</rt></ruby>(DAG),并按顺序执行图。换句话说,它创建了一些 Kubernetes pod,并确保每个 pod 按预期成功运行。
|
||||
|
||||
![Tekton pipelines][11]
|
||||
|
||||
(Source: [Tekton documentation][12])
|
||||
|
||||
* **PipelineRun: ** 顾名思义,是一条流水线的具体执行。
|
||||
|
||||
* **TaskRun:** TaskRun 是一个任务的具体执行。你可以选择在流水线外运行一次 TaskRun,可以通过它查看任务中每个步骤执行的具体情况。
|
||||
|
||||
|
||||
|
||||
|
||||
### 创建你的 CI/CD 流水线
|
||||
|
||||
开始使用 Tekton 的最简单方法是自己编写一个简单的流水线。如果你每天都在使用 Kubernetes,那你可能对 YAML 很熟悉,这正是 Tekton 流水线的定义方式。下面是一个克隆代码库的简单流水线的例子。
|
||||
|
||||
首先,创建一个`task.yaml` 文件,用你喜欢的文本编辑器打开它。这个文件定义了你要执行的步骤。在这个例子中,就是克隆一个仓库,所以我把这个步骤命名为 clone。该文件设置了一些环境变量,然后使用一个简单的 shell 脚本来执行克隆。
|
||||
|
||||
接下来是任务。你可以把步骤看作是一个被任务调用的函数,而任务则设置步骤所需的参数和工作空间。
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Task
|
||||
metadata:
|
||||
name: git-clone
|
||||
spec:
|
||||
workspaces:
|
||||
- name: output
|
||||
description: The git repo will be cloned onto the volume backing this Workspace.
|
||||
params:
|
||||
- name: url
|
||||
description: Repository URL to clone from.
|
||||
type: string
|
||||
- name: revision
|
||||
description: Revision to checkout. (branch, tag, sha, ref, etc...)
|
||||
type: string
|
||||
default: ""
|
||||
steps:
|
||||
- name: clone
|
||||
image: "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.21.0"
|
||||
env:
|
||||
- name: PARAM_URL
|
||||
value: $(params.url)
|
||||
- name: PARAM_REVISION
|
||||
value: $(params.revision)
|
||||
- name: WORKSPACE_OUTPUT_PATH
|
||||
value: $(workspaces.output.path)
|
||||
script: |
|
||||
#!/usr/bin/env sh
|
||||
set -eu
|
||||
|
||||
CHECKOUT_DIR="${WORKSPACE_OUTPUT_PATH}"
|
||||
|
||||
/ko-app/git-init \
|
||||
-url="${PARAM_URL}" \
|
||||
-revision="${PARAM_REVISION}" \
|
||||
-path="${CHECKOUT_DIR}"
|
||||
cd "${CHECKOUT_DIR}"
|
||||
EXIT_CODE="$?"
|
||||
if [ "${EXIT_CODE}" != 0 ] ; then
|
||||
exit "${EXIT_CODE}"
|
||||
fi
|
||||
# Verify clone is success by reading readme file.
|
||||
cat ${CHECKOUT_DIR}/README.md
|
||||
|
||||
```
|
||||
|
||||
创建第二个文件`pipeline.yaml`,并用你喜欢的文本编辑器打开它。这个文件通过设置诸如可以运行和处理任务的工作区等重要参数来定义流水线。
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: Pipeline
|
||||
metadata:
|
||||
name: cat-branch-readme
|
||||
spec:
|
||||
params:
|
||||
- name: repo-url
|
||||
type: string
|
||||
description: The git repository URL to clone from.
|
||||
- name: branch-name
|
||||
type: string
|
||||
description: The git branch to clone.
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
description: |
|
||||
This workspace will receive the cloned git repo and be passed
|
||||
to the next Task for the repo's README.md file to be read.
|
||||
tasks:
|
||||
- name: fetch-repo
|
||||
taskRef:
|
||||
name: git-clone
|
||||
workspaces:
|
||||
- name: output
|
||||
workspace: shared-data
|
||||
params:
|
||||
- name: url
|
||||
value: $(params.repo-url)
|
||||
- name: revision
|
||||
value: $(params.branch-name)
|
||||
|
||||
```
|
||||
|
||||
最后,创建一个 `pipelinerun.yaml` 文件,用喜欢的文本编辑器打开它。这个文件真正的运行流水线。它调用流水线中定义的参数(继而调用任务文件中定义的任务)。
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
apiVersion: tekton.dev/v1beta1
|
||||
kind: PipelineRun
|
||||
metadata:
|
||||
name: git-clone-checking-out-a-branch
|
||||
spec:
|
||||
pipelineRef:
|
||||
name: cat-branch-readme
|
||||
workspaces:
|
||||
- name: shared-data
|
||||
volumeClaimTemplate:
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1Gi
|
||||
params:
|
||||
- name: repo-url
|
||||
value: <https://github.com/tektoncd/pipeline.git>
|
||||
- name: branch-name
|
||||
value: release-v0.12.x
|
||||
|
||||
```
|
||||
|
||||
把不同工作分在不同的文件中的好处是,`git-clone` 任务可以在多条流水线中复用。
|
||||
|
||||
例如,假设你想为一个流水线项目做端到端的测试。你可以使用 `git-clone` 任务 **来让每一次测试都基于最新的代码**。
|
||||
|
||||
### 总结
|
||||
|
||||
只要你熟悉 Kubernetes,那 Tekton 对你来说就像其他 Kubernetes 原生应用一样简单。它有很多工具可以帮助你创建流水线并与之交互。如果你喜欢自动化,不妨试试 Tekton!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/11/cicd-pipeline-kubernetes-tekton
|
||||
|
||||
作者:[Savita Ashture][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[lxbwolf](https://github.com/lxbwolf)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/savita-ashture
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/plumbing_pipes_tutorial_how_behind_scenes.png?itok=F2Z8OJV1 (Plumbing tubes in many directions)
|
||||
[2]: https://github.com/tektoncd/pipeline
|
||||
[3]: https://github.com/knative/build
|
||||
[4]: https://cd.foundation/
|
||||
[5]: https://www.linuxfoundation.org/projects/
|
||||
[6]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
|
||||
[7]: https://operatorhub.io/what-is-an-operator
|
||||
[8]: https://opensource.com/sites/default/files/uploads/tekto-terminology.png (Tekton terminology)
|
||||
[9]: https://tekton.dev/docs/concepts/concept-tasks-pipelines.png
|
||||
[10]: https://kubebyexample.com/en/concept/pods
|
||||
[11]: https://opensource.com/sites/default/files/uploads/tekton-pipelines.png (Tekton pipelines)
|
||||
[12]: https://tekton.dev/docs/concepts/concept-runs.png
|
Loading…
Reference in New Issue
Block a user