Tekton Pipelines

Gao
# Tekton Pipelines ## Intro Tekton Pipelines 是一个为`Kubernetes`应用程序配置和运行`CI / CD`风格 的`Pipelined`的开源实现 `Pipeline` 创建 `Custom Resources` 作为构建模块来声明`pipelines` Tekton Pipelines 是云原生的 - 运行于`Kubernetes` - 将`Kubernetes`集群作为一级资源类型 - 使用容器作为构建块 Tekton Pipelines 是解耦的 - Pipeline 可以被部署于任意 k8s 集群 - 组成`pipeline`的`task`可以分开独立运行 - 向 Git repos 之类的资源可以轻松的在运行之间交换 Tekton Pipelines are Typed - 类型化的资源意味着对于诸如 Image 之类的资源,可以轻松地将资源输出 ### 此设计的高级细节: - Pipeline 运行管道,可以实现一个流程,可以由事件出发,也可以通过`PipelineRun`来 运行 - Task 基本运行单元,可以通过`TaskRun`来运行 - PipelineResource `Task`的输入和输出资源 ## 各类资源介绍 ### PipelineResources `PipelineResource` 是 `Pipline` 中 `Task` 的输入和输出对象 Syntax: To define a configuration file for a PipelineResource, you can specify the following fields: - Required: - apiVersion - Specifies the API version, for example tekton.dev/v1alpha1. - kind - Specify the PipelineResource resource object. - metadata - Specifies data to uniquely identify the PipelineResource object, for example a name. - spec - Specifies the configuration information for your PipelineResource resource object. - type - Specifies the type of the PipelineResource - Optional: - params - Parameters which are specific to each type of PipelineResource Types: - Git - PullRequest - Image - Cluster - Storage - CloutEvent ### Tasks Task(or ClusterTask) 是 CI 中一个组顺序执行的 step 的集合,是基本任务单位。Task 会在 pod 中运行。 Task 需要声明三部分: - inputs - outputs - steps Task 在 namespace 中可用,ClusterTask 在整个集群可用 Syntax: To define a configuration file for a Task resource, you can specify the following fields: - Required: - apiVersion - Specifies the API version, for example tekton.dev/v1alpha1. - kind - Specify the Task resource object. - metadata - Specifies data to uniquely identify the Task resource object, for example a name. - spec - Specifies the configuration information for your Task resource object. Task steps must be defined through either of the following fields: -steps - Specifies one or more container images that you want to run in your Task. - Optional: - inputs - Specifies parameters and PipelineResources needed by your Task - outputs - Specifies PipelineResources created by your Task - volumes - Specifies one or more volumes that you want to make available to your Task's steps. - stepTemplate - Specifies a Container step definition to use as the basis for all steps within your Task. - sidecars - Specifies sidecar containers to run alongside steps. ### Piplines Pipline 定义并执行一组 Task Syntax: To define a configuration file for a Pipeline resource, you can specify the following fields: - Required: - apiVersion - Specifies the API version, for example tekton.dev/v1alpha1. - kind - Specify the Pipeline resource object. - metadata - Specifies data to uniquely identify the Pipeline resource object, for example a name. - spec - Specifies the configuration information for your Pipeline resource object. In order for a Pipeline to do anything, the spec must include: - tasks - Specifies which Tasks to run and how to run them - Optional: - resources - Specifies which PipelineResources of which types the Pipeline will be using in its Tasks - tasks - resources.inputs / resource.outputs - from - Used when the content of the PipelineResource should come from the output of a previous Pipeline Task - runAfter - Used when the Pipeline Task should be executed after another Pipeline Task, but there is no output linking required - retries - Used when the task is wanted to be executed if it fails. Could be a network error or a missing dependency. It does not apply to cancellations. - conditions - Used when a task is to be executed only if the specified conditions are evaluated to be true. Task 执行顺序,所有 Task 默认都会并行执行,除非指定了 - from - runAfter 两项会指定 task 执行的依赖关系 For example see this Pipeline spec: ```yaml - name: lint-repo taskRef: name: pylint resources: inputs: - name: workspace resource: my-repo - name: test-app taskRef: name: make-test resources: inputs: - name: workspace resource: my-repo - name: build-app taskRef: name: kaniko-build-app runAfter: - test-app resources: inputs: - name: workspace resource: my-repo outputs: - name: image resource: my-app-image - name: build-frontend taskRef: name: kaniko-build-frontend runAfter: - test-app resources: inputs: - name: workspace resource: my-repo outputs: - name: image resource: my-frontend-image - name: deploy-all taskRef: name: deploy-kubectl resources: inputs: - name: my-app-image resource: my-app-image from: - build-app - name: my-frontend-image resource: my-frontend-image from: - build-frontend ``` This will result in the following execution graph: ```none | | v v test-app lint-repo / \ v v build-app build-frontend \ / v v deploy-all ``` ## 安装 运行 kubectl 安装指定的 yaml 文件 ```shell kubectl apply -f https://raw.githubusercontent.com/gsmlg/pipeline/master/updated.yaml ``` 检查所有 pod 都处于`running`状态时,安装完成 ```shell kubectl -n tekton-pipelines get pods ``` 安装 dashboard,更方便的查看 pipeline ```shell kubectl apply -f https://raw.githubusercontent.com/gsmlg/pipeline/master/updated_dashboard.yaml ``` ## 演示运行一个`singlecloud`的构建过程 创建账户 ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pipeline-run-role rules: - apiGroups: - extensions resources: - deployments verbs: - get - list - watch - create - update - patch - delete --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pipeline-run-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: pipeline-run-role subjects: - kind: ServiceAccount name: pipeline-run-service namespace: default --- apiVersion: v1 kind: ServiceAccount metadata: name: pipeline-run-service namespace: default secrets: - name: regcred --- apiVersion: v1 data: .dockerconfigjson: <encoded docker registry auth data> kind: Secret metadata: name: regcred namespace: default type: kubernetes.io/dockerconfigjson ``` 定义资源 ```yaml apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: zcloud-image spec: type: image params: - name: url value: docker.io/gsmlg/zcloud ``` 创建 task ```yaml apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: build-image-from-git spec: inputs: resources: - name: docker-source type: git params: - name: pathToDockerFile type: string description: The path to the dockerfile to build default: /workspace/docker-source/Dockerfile - name: pathToContext type: string description: The build context used by Kaniko (https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts) default: /workspace/docker-source outputs: resources: - name: builtImage type: image steps: - name: build-and-push image: registry.zdns.cn/gsmlg/kaniko-project-executor:v0.13.0 # specifying DOCKER_CONFIG is required to allow kaniko to detect docker credential env: - name: 'DOCKER_CONFIG' value: '/builder/home/.docker/' command: - /kaniko/executor args: - --dockerfile=$(inputs.params.pathToDockerFile) - --destination=$(outputs.resources.builtImage.url) - --context=$(inputs.params.pathToContext) - --oci-layout-path=/builder/home/image-outputs/builtImage - --skip-tls-verify --- apiVersion: tekton.dev/v1alpha1 kind: Task metadata: name: build-zcloud spec: inputs: resources: - name: docker-source type: git - name: image type: image - name: uiImage type: image params: - name: pathToDockerFile type: string description: The path to the dockerfile to build default: /workspace/docker-source/Dockerfile - name: pathToContext type: string description: The build context used by Kaniko (https://github.com/GoogleContainerTools/kaniko#kaniko-build-contexts) default: /workspace/docker-source outputs: resources: - name: builtImage type: image steps: - name: setup-dockerfile image: docker.io/ubuntu:18.04 command: - /workspace/docker-source/setup.sh args: - $(inputs.resources.image.url) - $(inputs.resources.uiImage.url) - /workspace/docker-source/Dockerfile - name: build-and-push image: registry.zdns.cn/gsmlg/kaniko-project-executor:v0.13.0 # specifying DOCKER_CONFIG is required to allow kaniko to detect docker credential env: - name: 'DOCKER_CONFIG' value: '/builder/home/.docker/' command: - /kaniko/executor args: - --dockerfile=$(inputs.params.pathToDockerFile) - --destination=$(outputs.resources.builtImage.url) - --context=$(inputs.params.pathToContext) - --oci-layout-path=/builder/home/image-outputs/builtImage - --skip-tls-verify --- apiVersion: tekton.dev/v1alpha1 kind: Pipeline metadata: name: zcloud-build-pipeline spec: resources: - name: singlecloud-repo type: git - name: singlecloud-ui-repo type: git - name: zcloud-repo type: git - name: singlecloud-image type: image - name: singlecloud-ui-image type: image - name: zcloud-image type: image tasks: - name: build-singlecloud-ui retries: 1 taskRef: name: build-image-from-git resources: inputs: - name: docker-source resource: singlecloud-ui-repo outputs: - name: builtImage resource: singlecloud-ui-image - name: build-singlecloud taskRef: name: build-image-from-git resources: inputs: - name: docker-source resource: singlecloud-repo outputs: - name: builtImage resource: singlecloud-image - name: build-zcloud taskRef: name: build-zcloud resources: inputs: - name: docker-source resource: zcloud-repo - name: uiImage resource: singlecloud-ui-image from: - build-singlecloud-ui - name: image resource: singlecloud-image from: - build-singlecloud outputs: - name: builtImage resource: zcloud-image ``` 运行 pipelinue: ```yaml apiVersion: tekton.dev/v1alpha1 kind: PipelineRun metadata: generateName: zcloud-build-run- spec: pipelineRef: name: zcloud-build-pipeline serviceAccount: pipeline-run-service resources: - name: singlecloud-repo resourceSpec: type: git params: - name: revision value: master - name: url value: https://github.com/zdnscloud/singlecloud - name: singlecloud-ui-repo resourceSpec: type: git params: - name: revision value: master - name: url value: https://github.com/zdnscloud/singlecloud-ui - name: zcloud-repo resourceSpec: type: git params: - name: revision value: master - name: url value: https://github.com/gsmlg/zcloud-image - name: singlecloud-image resourceSpec: type: image params: - name: url value: registry.zdns.cn/zcloud/singlecloud:master - name: singlecloud-ui-image resourceSpec: type: image params: - name: url value: registry.zdns.cn/zcloud/singlecloud-ui:master - name: zcloud-image resourceRef: name: zcloud-image ```