美文网首页
CI-CD 工具 Tekton

CI-CD 工具 Tekton

作者: 菜头_355f | 来源:发表于2021-06-28 10:33 被阅读0次

    什么是 Tekton?

    Tekton 是一个功能强大且灵活的 Kubernetes 原生开源框架,是谷歌开源的,功能强大且灵活, 开源社区也正在快速的迭代和发展壮大,主要用于创建持续集成和交付(CI/CD)系统。通过抽象底 层实现细节,用户可以跨多云平台和本地系统进行构建、测试和部署。另外,基于 kubernetes CRD 定义的 pipeline 流水线也是 Tekton 最重要的特征。

    CRD 全称是 CustomResourceDefinition:

    在 Kubernetes 中一切都可视为资源,Kubernetes 1.7 之后增加了对 CRD 自定义资源二次开发 能力来扩展 Kubernetes API,通过 CRD 我们可以向 Kubernetes API 中增加新资源类型,而 不需要修改 Kubernetes 源码来创建自定义的 API server,该功能大大提高了 Kubernetes 的扩 展能力。当你创建一个新的 CustomResourceDefinition (CRD)时,Kubernetes API 服务器将为 你指定的每个版本创建一个新的 RESTful 资源路径,我们可以根据该 api 路径来创建一些我们自己 定义的类型资源。CRD 可以是命名空间的,也可以是集群范围的,由 CRD 的作用域(scpoe)字段中 所指定的,与现有的内置对象一样,删除名称空间将删除该名称空间中的所有自定义对象。 customresourcedefinition 本身没有名称空间,所有名称空间都可以使用。

    3.2 为什么要用 k8s 原生的 CI-CD 工具 Tekton? 持续集成是云原生应用的支柱技术之一,因此在交付基于云原生的一些支撑产品的时候,CICD 是一 个无法拒绝的需求。为了满足这种需要,自然而然会想到对 Jenkins(X)或者 Gitlab 进行集成,也 有创业公司出来的一些小工具比如 Argo Rollout。Tekton 是一款 k8s 原生的应用发布框架,主 要用来构建 CI/CD 系统。它原本是 knative 项目里面一个叫做 build-pipeline 的子项目,用来 作为 knative-build 的下一代引擎。然而,随着 k8s 社区里各种各样的需求涌入,这个子项目慢 慢成长为一个通用的框架,能够提供灵活强大的能力去做基于 k8s 的构建发布。Tekton 其实只提 供 Pipeline 这个一个功能,Pipeline 会被直接映射成 K8s Pod 等 API 资源。而比如应用发布 过程的控制,灰度和上线策略,都是我们自己编写 K8s Controller 来实现的,也就意味着 Tekton 不会在 K8s 上盖一个”大帽子“,比如我们想看发布状态、日志等是直接通过 K8s 查看这个 Pipeline 对应的 Pod 的状态和日志,不需要再面对另外一个 API

    Tekton 功能:

    1.Kubernetes 原生的 Tekton 的所有配置都是使用 CRD 方式进行编写存储的,非常易于检索和使 用。

    2.配置和流程分离: Tekton 的 Pipeline 和配置可以分开编写,使用名称进行引用。 3.轻量级核心的 Pipeline 非常轻便:适合作为组件进行集成,另外也有周边的 Dashboard、 Trigger、CLI 等工具,能够进一步挖掘其潜力。

    4.可复用、组合的 Pipeline 构建方式:非常适合在集成过程中对 Pipeline 进行定制。

    3.3使用 Tekton 自动化发布应用流程

    这里的流程大致是:

    1、用户把需要部署的应用先按照一套标准的应用定义写成 YAML 文件(类似 Helm Chart); 2、用户把应用定义 YAML 推送到 Git 仓库里;

    3、Tekton CD (一个 K8s Operator) 会监听到相应的改动,根据不同条件生成不同的 Tekton Pipelines;

    Tekton CD 的操作具体分为以下几种情况:

    1、如果 Git 改动里有一个应用 YAML 且该应用不存在,那么将渲染和生成 Tekton Pipelines 用来创建应用。

    2、如果 Git 改动里有一个应用 YAML 且该应用存在,那么将渲染和生成 Tekton Pipelines 用 来升级应用。这里我们会根据应用定义 YAML 里的策略来做升级,比如做金丝雀发布、灰度升级。 

    3、如果 Git 改动里有一个应用 YAML 且该应用存在且标记了“被删除”,那么将渲染和生成 Tekton Pipelines 用来删除应用。确认应用被删除后,我们才从 Git 里删除这个应用的 YAML。

    安装 Tekton

    #把 tekton-0-12-0.tar.gz 和 busybox-1-0.tar.gz 上传到 工作节点机器上,手动解压:

    #编写安装 tekton 资源清单文件

    kubectl apply -f release.yaml

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    http://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: Namespace

    metadata:

      name: tekton-pipelines

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    http://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: policy/v1beta1

    kind: PodSecurityPolicy

    metadata:

      name: tekton-pipelines

    spec:

      privileged: false

      allowPrivilegeEscalation: false

      volumes:

      - 'emptyDir'

      - 'configMap'

      - 'secret'

      hostNetwork: false

      hostIPC: false

      hostPID: false

      runAsUser:

        rule: 'RunAsAny'

      seLinux:

        rule: 'RunAsAny'

      supplementalGroups:

        rule: 'MustRunAs'

        ranges:

        - min: 1

          max: 65535

      fsGroup:

        rule: 'MustRunAs'

        ranges:

        - min: 1

          max: 65535

    ---

    # Copyright 2020 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    kind: ClusterRole

    apiVersion: rbac.authorization.k8s.io/v1

    metadata:

      name: tekton-pipelines-controller-cluster-access

    rules:

    - apiGroups: [""]

      # Namespace access is required because the controller timeout handling logic

      # iterates over all namespaces and times out any PipelineRuns that have expired.

      # Pod access is required because the taskrun controller wants to be updated when

      # a Pod underlying a TaskRun changes state.

      resources: ["namespaces", "pods"]

      verbs: ["list", "watch"]

      # Controller needs cluster access to all of the CRDs that it is responsible for

      # managing.

    - apiGroups: ["tekton.dev"]

      resources: ["tasks", "clustertasks", "taskruns", "pipelines", "pipelineruns", "pipelineresources",

        "conditions"]

      verbs: ["get", "list", "create", "update", "delete", "patch", "watch"]

    - apiGroups: ["tekton.dev"]

      resources: ["taskruns/finalizers", "pipelineruns/finalizers"]

      verbs: ["get", "list", "create", "update", "delete", "patch", "watch"]

    - apiGroups: ["tekton.dev"]

      resources: ["tasks/status", "clustertasks/status", "taskruns/status", "pipelines/status",

        "pipelineruns/status", "pipelineresources/status"]

      verbs: ["get", "list", "create", "update", "delete", "patch", "watch"]

    - apiGroups: ["policy"]

      resources: ["podsecuritypolicies"]

      resourceNames: ["tekton-pipelines"]

      verbs: ["use"]

    ---

    kind: ClusterRole

    apiVersion: rbac.authorization.k8s.io/v1

    metadata:

      # This is the access that the controller needs on a per-namespace basis.

      name: tekton-pipelines-controller-tenant-access

    rules:

    - apiGroups: [""]

      resources: ["pods", "pods/log", "secrets", "events", "serviceaccounts", "configmaps",

        "persistentvolumeclaims", "limitranges"]

      verbs: ["get", "list", "create", "update", "delete", "patch", "watch"]

      # Unclear if this access is actually required.  Simply a hold-over from the previous

      # incarnation of the controller's ClusterRole.

    - apiGroups: ["apps"]

      resources: ["deployments"]

      verbs: ["get", "list", "create", "update", "delete", "patch", "watch"]

    - apiGroups: ["apps"]

      resources: ["deployments/finalizers"]

      verbs: ["get", "list", "create", "update", "delete", "patch", "watch"]

    ---

    kind: ClusterRole

    apiVersion: rbac.authorization.k8s.io/v1

    metadata:

      name: tekton-pipelines-webhook-cluster-access

    rules:

    - # The webhook needs to be able to list and update customresourcedefinitions,

      # mainly to update the webhook certificates.

      apiGroups: ["apiextensions.k8s.io"]

      resources: ["customresourcedefinitions", "customresourcedefinitions/status"]

      verbs: ["get", "list", "update", "patch", "watch"]

    - apiGroups: ["admissionregistration.k8s.io"]

      # The webhook performs a reconciliation on these two resources and continuously

      # updates configuration.

      resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"]

      # knative starts informers on these things, which is why we need get, list and watch.

      verbs: ["list", "watch"]

    - apiGroups: ["admissionregistration.k8s.io"]

      resources: ["mutatingwebhookconfigurations"]

      # This mutating webhook is responsible for applying defaults to tekton objects

      # as they are received.

      resourceNames: ["webhook.pipeline.tekton.dev"]

      # When there are changes to the configs or secrets, knative updates the mutatingwebhook config

      # with the updated certificates or the refreshed set of rules.

      verbs: ["get", "update"]

    - apiGroups: ["admissionregistration.k8s.io"]

      resources: ["validatingwebhookconfigurations"]

      # validation.webhook.pipeline.tekton.dev performs schema validation when you, for example, create TaskRuns.

      # config.webhook.pipeline.tekton.dev validates the logging configuration against knative's logging structure

      resourceNames: ["validation.webhook.pipeline.tekton.dev", "config.webhook.pipeline.tekton.dev"]

      # When there are changes to the configs or secrets, knative updates the validatingwebhook config

      # with the updated certificates or the refreshed set of rules.

      verbs: ["get", "update"]

    ---

    # Copyright 2020 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    kind: Role

    apiVersion: rbac.authorization.k8s.io/v1

    metadata:

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

    rules:

    - apiGroups: [""]

      resources: ["configmaps"]

      verbs: ["list", "watch"]

    - # The controller needs access to these configmaps for logging information and runtime configuration.

      apiGroups: [""]

      resources: ["configmaps"]

      verbs: ["get"]

      resourceNames: ["config-logging", "config-observability", "config-artifact-bucket",

        "config-artifact-pvc", "feature-flags", "config-leader-election"]

    ---

    kind: Role

    apiVersion: rbac.authorization.k8s.io/v1

    metadata:

      name: tekton-pipelines-webhook

      namespace: tekton-pipelines

    rules:

    - apiGroups: [""]

      resources: ["configmaps"]

      verbs: ["list", "watch"]

    - # The webhook needs access to these configmaps for logging information.

      apiGroups: [""]

      resources: ["configmaps"]

      verbs: ["get"]

      resourceNames: ["config-logging", "config-observability"]

    - apiGroups: [""]

      resources: ["secrets"]

      verbs: ["list", "watch"]

    - # The webhook daemon makes a reconciliation loop on webhook-certs. Whenever

      # the secret changes it updates the webhook configurations with the certificates

      # stored in the secret.

      apiGroups: [""]

      resources: ["secrets"]

      verbs: ["get", "update"]

      resourceNames: ["webhook-certs"]

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    http://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ServiceAccount

    metadata:

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

    ---

    apiVersion: v1

    kind: ServiceAccount

    metadata:

      name: tekton-pipelines-webhook

      namespace: tekton-pipelines

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    http://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: rbac.authorization.k8s.io/v1beta1

    kind: ClusterRoleBinding

    metadata:

      name: tekton-pipelines-controller-cluster-access

    subjects:

    - kind: ServiceAccount

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

    roleRef:

      kind: ClusterRole

      name: tekton-pipelines-controller-cluster-access

      apiGroup: rbac.authorization.k8s.io

    ---

    # If this ClusterRoleBinding is replaced with a RoleBinding

    # then the ClusterRole would be namespaced. The access described by

    # the tekton-pipelines-controller-tenant-access ClusterRole would

    # be scoped to individual tenant namespaces.

    apiVersion: rbac.authorization.k8s.io/v1beta1

    kind: ClusterRoleBinding

    metadata:

      name: tekton-pipelines-controller-tenant-access

    subjects:

    - kind: ServiceAccount

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

    roleRef:

      kind: ClusterRole

      name: tekton-pipelines-controller-tenant-access

      apiGroup: rbac.authorization.k8s.io

    ---

    apiVersion: rbac.authorization.k8s.io/v1beta1

    kind: ClusterRoleBinding

    metadata:

      name: tekton-pipelines-webhook-cluster-access

    subjects:

    - kind: ServiceAccount

      name: tekton-pipelines-webhook

      namespace: tekton-pipelines

    roleRef:

      kind: ClusterRole

      name: tekton-pipelines-webhook-cluster-access

      apiGroup: rbac.authorization.k8s.io

    ---

    # Copyright 2020 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    http://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: rbac.authorization.k8s.io/v1beta1

    kind: RoleBinding

    metadata:

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

    subjects:

    - kind: ServiceAccount

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

    roleRef:

      kind: Role

      name: tekton-pipelines-controller

      apiGroup: rbac.authorization.k8s.io

    ---

    apiVersion: rbac.authorization.k8s.io/v1beta1

    kind: RoleBinding

    metadata:

      name: tekton-pipelines-webhook

      namespace: tekton-pipelines

    subjects:

    - kind: ServiceAccount

      name: tekton-pipelines-webhook

      namespace: tekton-pipelines

    roleRef:

      kind: Role

      name: tekton-pipelines-webhook

      apiGroup: rbac.authorization.k8s.io

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: clustertasks.tekton.dev

      labels:

        pipeline.tekton.dev/release: "devel"

        version: "devel"

    spec:

      group: tekton.dev

      preserveUnknownFields: false

      validation:

        openAPIV3Schema:

          type: object

          # One can use x-kubernetes-preserve-unknown-fields: true

          # at the root of the schema (and inside any properties, additionalProperties)

          # to get the traditional CRD behaviour that nothing is pruned, despite

          # setting spec.preserveUnknownProperties: false.

          #

          # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/

          # See issue: https://github.com/knative/serving/issues/912

          x-kubernetes-preserve-unknown-fields: true

      versions:

      - name: v1alpha1

        served: true

        storage: true

      - name: v1beta1

        served: true

        storage: false

      names:

        kind: ClusterTask

        plural: clustertasks

        categories:

        - tekton

        - tekton-pipelines

      scope: Cluster

      # Opt into the status subresource so metadata.generation

      # starts to increment

      subresources:

        status: {}

      conversion:

        strategy: Webhook

        webhookClientConfig:

          service:

            name: tekton-pipelines-webhook

            namespace: tekton-pipelines

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: conditions.tekton.dev

      labels:

        pipeline.tekton.dev/release: "devel"

        version: "devel"

    spec:

      group: tekton.dev

      names:

        kind: Condition

        plural: conditions

        categories:

        - tekton

        - tekton-pipelines

      scope: Namespaced

      # Opt into the status subresource so metadata.generation

      # starts to increment

      subresources:

        status: {}

      version: v1alpha1

    ---

    # Copyright 2018 The Knative Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: images.caching.internal.knative.dev

      labels:

        knative.dev/crd-install: "true"

    spec:

      group: caching.internal.knative.dev

      version: v1alpha1

      names:

        kind: Image

        plural: images

        singular: image

        categories:

        - knative-internal

        - caching

        shortNames:

        - img

      scope: Namespaced

      subresources:

        status: {}

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: pipelines.tekton.dev

      labels:

        pipeline.tekton.dev/release: "devel"

        version: "devel"

    spec:

      group: tekton.dev

      preserveUnknownFields: false

      validation:

        openAPIV3Schema:

          type: object

          # One can use x-kubernetes-preserve-unknown-fields: true

          # at the root of the schema (and inside any properties, additionalProperties)

          # to get the traditional CRD behaviour that nothing is pruned, despite

          # setting spec.preserveUnknownProperties: false.

          #

          # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/

          # See issue: https://github.com/knative/serving/issues/912

          x-kubernetes-preserve-unknown-fields: true

      versions:

      - name: v1alpha1

        served: true

        storage: true

      - name: v1beta1

        served: true

        storage: false

      names:

        kind: Pipeline

        plural: pipelines

        categories:

        - tekton

        - tekton-pipelines

      scope: Namespaced

      # Opt into the status subresource so metadata.generation

      # starts to increment

      subresources:

        status: {}

      conversion:

        strategy: Webhook

        webhookClientConfig:

          service:

            name: tekton-pipelines-webhook

            namespace: tekton-pipelines

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: pipelineruns.tekton.dev

      labels:

        pipeline.tekton.dev/release: "devel"

        version: "devel"

    spec:

      group: tekton.dev

      preserveUnknownFields: false

      validation:

        openAPIV3Schema:

          type: object

          # One can use x-kubernetes-preserve-unknown-fields: true

          # at the root of the schema (and inside any properties, additionalProperties)

          # to get the traditional CRD behaviour that nothing is pruned, despite

          # setting spec.preserveUnknownProperties: false.

          #

          # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/

          # See issue: https://github.com/knative/serving/issues/912

          x-kubernetes-preserve-unknown-fields: true

      versions:

      - name: v1alpha1

        served: true

        storage: true

      - name: v1beta1

        served: true

        storage: false

      names:

        kind: PipelineRun

        plural: pipelineruns

        categories:

        - tekton

        - tekton-pipelines

        shortNames:

        - pr

        - prs

      scope: Namespaced

      additionalPrinterColumns:

      - name: Succeeded

        type: string

        JSONPath: ".status.conditions[?(@.type==\"Succeeded\")].status"

      - name: Reason

        type: string

        JSONPath: ".status.conditions[?(@.type==\"Succeeded\")].reason"

      - name: StartTime

        type: date

        JSONPath: .status.startTime

      - name: CompletionTime

        type: date

        JSONPath: .status.completionTime

      # Opt into the status subresource so metadata.generation

      # starts to increment

      subresources:

        status: {}

      conversion:

        strategy: Webhook

        webhookClientConfig:

          service:

            name: tekton-pipelines-webhook

            namespace: tekton-pipelines

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: pipelineresources.tekton.dev

      labels:

        pipeline.tekton.dev/release: "devel"

        version: "devel"

    spec:

      group: tekton.dev

      names:

        kind: PipelineResource

        plural: pipelineresources

        categories:

        - tekton

        - tekton-pipelines

      scope: Namespaced

      # Opt into the status subresource so metadata.generation

      # starts to increment

      subresources:

        status: {}

      version: v1alpha1

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: tasks.tekton.dev

      labels:

        pipeline.tekton.dev/release: "devel"

        version: "devel"

    spec:

      group: tekton.dev

      preserveUnknownFields: false

      validation:

        openAPIV3Schema:

          type: object

          # One can use x-kubernetes-preserve-unknown-fields: true

          # at the root of the schema (and inside any properties, additionalProperties)

          # to get the traditional CRD behaviour that nothing is pruned, despite

          # setting spec.preserveUnknownProperties: false.

          #

          # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/

          # See issue: https://github.com/knative/serving/issues/912

          x-kubernetes-preserve-unknown-fields: true

      versions:

      - name: v1alpha1

        served: true

        storage: true

      - name: v1beta1

        served: true

        storage: false

      names:

        kind: Task

        plural: tasks

        categories:

        - tekton

        - tekton-pipelines

      scope: Namespaced

      # Opt into the status subresource so metadata.generation

      # starts to increment

      subresources:

        status: {}

      conversion:

        strategy: Webhook

        webhookClientConfig:

          service:

            name: tekton-pipelines-webhook

            namespace: tekton-pipelines

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apiextensions.k8s.io/v1beta1

    kind: CustomResourceDefinition

    metadata:

      name: taskruns.tekton.dev

      labels:

        pipeline.tekton.dev/release: "devel"

        version: "devel"

    spec:

      group: tekton.dev

      preserveUnknownFields: false

      validation:

        openAPIV3Schema:

          type: object

          # One can use x-kubernetes-preserve-unknown-fields: true

          # at the root of the schema (and inside any properties, additionalProperties)

          # to get the traditional CRD behaviour that nothing is pruned, despite

          # setting spec.preserveUnknownProperties: false.

          #

          # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/

          # See issue: https://github.com/knative/serving/issues/912

          x-kubernetes-preserve-unknown-fields: true

      versions:

      - name: v1alpha1

        served: true

        storage: true

      - name: v1beta1

        served: true

        storage: false

      names:

        kind: TaskRun

        plural: taskruns

        categories:

        - tekton

        - tekton-pipelines

        shortNames:

        - tr

        - trs

      scope: Namespaced

      additionalPrinterColumns:

      - name: Succeeded

        type: string

        JSONPath: ".status.conditions[?(@.type==\"Succeeded\")].status"

      - name: Reason

        type: string

        JSONPath: ".status.conditions[?(@.type==\"Succeeded\")].reason"

      - name: StartTime

        type: date

        JSONPath: .status.startTime

      - name: CompletionTime

        type: date

        JSONPath: .status.completionTime

      # Opt into the status subresource so metadata.generation

      # starts to increment

      subresources:

        status: {}

      conversion:

        strategy: Webhook

        webhookClientConfig:

          service:

            name: tekton-pipelines-webhook

            namespace: tekton-pipelines

    ---

    # Copyright 2020 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: Secret

    metadata:

      name: webhook-certs

      namespace: tekton-pipelines

      labels:

        pipeline.tekton.dev/release: devel

    # The data is populated at install time.

    ---

    apiVersion: admissionregistration.k8s.io/v1beta1

    kind: ValidatingWebhookConfiguration

    metadata:

      name: validation.webhook.pipeline.tekton.dev

      labels:

        pipeline.tekton.dev/release: devel

    webhooks:

    - admissionReviewVersions:

      - v1beta1

      clientConfig:

        service:

          name: tekton-pipelines-webhook

          namespace: tekton-pipelines

      failurePolicy: Fail

      sideEffects: None

      name: validation.webhook.pipeline.tekton.dev

    ---

    apiVersion: admissionregistration.k8s.io/v1beta1

    kind: MutatingWebhookConfiguration

    metadata:

      name: webhook.pipeline.tekton.dev

      labels:

        pipeline.tekton.dev/release: devel

    webhooks:

    - admissionReviewVersions:

      - v1beta1

      clientConfig:

        service:

          name: tekton-pipelines-webhook

          namespace: tekton-pipelines

      failurePolicy: Fail

      sideEffects: None

      name: webhook.pipeline.tekton.dev

    ---

    apiVersion: admissionregistration.k8s.io/v1beta1

    kind: ValidatingWebhookConfiguration

    metadata:

      name: config.webhook.pipeline.tekton.dev

      labels:

        pipeline.tekton.dev/release: devel

    webhooks:

    - admissionReviewVersions:

      - v1beta1

      clientConfig:

        service:

          name: tekton-pipelines-webhook

          namespace: tekton-pipelines

      failurePolicy: Fail

      sideEffects: None

      name: config.webhook.pipeline.tekton.dev

      namespaceSelector:

        matchExpressions:

        - key: pipeline.tekton.dev/release

          operator: Exists

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: rbac.authorization.k8s.io/v1

    kind: ClusterRole

    metadata:

      name: tekton-aggregate-edit

      labels:

        rbac.authorization.k8s.io/aggregate-to-edit: "true"

        rbac.authorization.k8s.io/aggregate-to-admin: "true"

    rules:

    - apiGroups:

      - tekton.dev

      resources:

      - tasks

      - taskruns

      - pipelines

      - pipelineruns

      - pipelineresources

      - conditions

      verbs:

      - create

      - delete

      - deletecollection

      - get

      - list

      - patch

      - update

      - watch

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: rbac.authorization.k8s.io/v1

    kind: ClusterRole

    metadata:

      name: tekton-aggregate-view

      labels:

        rbac.authorization.k8s.io/aggregate-to-view: "true"

    rules:

    - apiGroups:

      - tekton.dev

      resources:

      - tasks

      - taskruns

      - pipelines

      - pipelineruns

      - pipelineresources

      - conditions

      verbs:

      - get

      - list

      - watch

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ConfigMap

    metadata:

      name: config-artifact-bucket

      namespace: tekton-pipelines

    #  data:

    #    # location of the gcs bucket to be used for artifact storage

    #    location: "gs://bucket-name"

    #    # name of the secret that will contain the credentials for the service account

    #    # with access to the bucket

    #    bucket.service.account.secret.name:

    #    # The key in the secret with the required service account json

    #    bucket.service.account.secret.key:

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ConfigMap

    metadata:

      name: config-artifact-pvc

      namespace: tekton-pipelines

    # data:

    #  # size of the PVC volume

    #  size: 5Gi

    #

    #  # storage class of the PVC volume

    #  storageClassName: storage-class-name

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ConfigMap

    metadata:

      name: config-defaults

      namespace: tekton-pipelines

    data:

      _example: |-

        ################################

        #                              #

        #    EXAMPLE CONFIGURATION    #

        #                              #

        ################################

        # This block is not actually functional configuration,

        # but serves to illustrate the available configuration

        # options and document them in a way that is accessible

        # to users that `kubectl edit` this config map.

        #

        # These sample configuration options may be copied out of

        # this example block and unindented to be in the data block

        # to actually change the configuration.

        # default-timeout-minutes contains the default number of

        # minutes to use for TaskRun and PipelineRun, if none is specified.

        default-timeout-minutes: "60"  # 60 minutes

        # default-service-account contains the default service account name

        # to use for TaskRun and PipelineRun, if none is specified.

        default-service-account: "default"

        # default-managed-by-label-value contains the default value given to the

        # "app.kubernetes.io/managed-by" label applied to all Pods created for

        # TaskRuns. If a user's requested TaskRun specifies another value for this

        # label, the user's request supercedes.

        default-managed-by-label-value: "tekton-pipelines"

        # default-pod-template contains the default pod template to use

        # TaskRun and PipelineRun, if none is specified. If a pod template

        # is specified, the default pod template is ignored.

        # default-pod-template:

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ConfigMap

    metadata:

      name: feature-flags

      namespace: tekton-pipelines

    data:

      # Setting this flag to "true" will prevent Tekton overriding your

      # Task container's $HOME environment variable.

      #

      # The default behaviour currently is for Tekton to override the

      # $HOME environment variable but this will change in an upcoming

      # release.

      #

      # See https://github.com/tektoncd/pipeline/issues/2013 for more

      # info.

      disable-home-env-overwrite: "false"

      # Setting this flag to "true" will prevent Tekton overriding your

      # Task container's working directory.

      #

      # The default behaviour currently is for Tekton to override the

      # working directory if not set by the user but this will change

      # in an upcoming release.

      #

      # See https://github.com/tektoncd/pipeline/issues/1836 for more

      # info.

      disable-working-directory-overwrite: "false"

    ---

    # Copyright 2020 Tekton Authors LLC

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ConfigMap

    metadata:

      name: config-leader-election

      namespace: tekton-pipelines

    data:

      # An inactive but valid configuration follows; see example.

      resourceLock: "leases"

      leaseDuration: "15s"

      renewDeadline: "10s"

      retryPeriod: "2s"

    ---

    # Copyright 2019 Tekton Authors LLC

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ConfigMap

    metadata:

      name: config-logging

      namespace: tekton-pipelines

    data:

      # Common configuration for all knative codebase

      zap-logger-config: |

        {

          "level": "info",

          "development": false,

          "sampling": {

            "initial": 100,

            "thereafter": 100

          },

          "outputPaths": ["stdout"],

          "errorOutputPaths": ["stderr"],

          "encoding": "json",

          "encoderConfig": {

            "timeKey": "",

            "levelKey": "level",

            "nameKey": "logger",

            "callerKey": "caller",

            "messageKey": "msg",

            "stacktraceKey": "stacktrace",

            "lineEnding": "",

            "levelEncoder": "",

            "timeEncoder": "",

            "durationEncoder": "",

            "callerEncoder": ""

          }

        }

      # Log level overrides

      loglevel.controller: "info"

      loglevel.webhook: "info"

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: v1

    kind: ConfigMap

    metadata:

      name: config-observability

      namespace: tekton-pipelines

    data:

      _example: |

        ################################

        #                              #

        #    EXAMPLE CONFIGURATION    #

        #                              #

        ################################

        # This block is not actually functional configuration,

        # but serves to illustrate the available configuration

        # options and document them in a way that is accessible

        # to users that `kubectl edit` this config map.

        #

        # These sample configuration options may be copied out of

        # this example block and unindented to be in the data block

        # to actually change the configuration.

        # metrics.backend-destination field specifies the system metrics destination.

        # It supports either prometheus (the default) or stackdriver.

        # Note: Using Stackdriver will incur additional charges.

        metrics.backend-destination: prometheus

        # metrics.stackdriver-project-id field specifies the Stackdriver project ID. This

        # field is optional. When running on GCE, application default credentials will be

        # used and metrics will be sent to the cluster's project if this field is

        # not provided.

        metrics.stackdriver-project-id: "<your stackdriver project id>"

        # metrics.allow-stackdriver-custom-metrics indicates whether it is allowed

        # to send metrics to Stackdriver using "global" resource type and custom

        # metric type. Setting this flag to "true" could cause extra Stackdriver

        # charge.  If metrics.backend-destination is not Stackdriver, this is

        # ignored.

        metrics.allow-stackdriver-custom-metrics: "false"

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    http://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apps/v1

    kind: Deployment

    metadata:

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

      labels:

        app.kubernetes.io/name: tekton-pipelines

        app.kubernetes.io/component: controller

        pipeline.tekton.dev/release: "v0.12.0"

        version: "v0.12.0"

    spec:

      replicas: 1

      selector:

        matchLabels:

          app: tekton-pipelines-controller

      template:

        metadata:

          annotations:

            cluster-autoscaler.kubernetes.io/safe-to-evict: "false"

          labels:

            app: tekton-pipelines-controller

            app.kubernetes.io/name: tekton-pipelines

            app.kubernetes.io/component: controller

            # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml

            pipeline.tekton.dev/release: "v0.12.0"

            version: "v0.12.0"

        spec:

          serviceAccountName: tekton-pipelines-controller

          containers:

          - name: tekton-pipelines-controller

            image: god/tekton-controller:v0.12.0

            args: [

              # These images are built on-demand by `ko resolve` and are replaced

              # by image references by digest.

              "-kubeconfig-writer-image", "god/tekton-kubeconfigwriter:v0.12.0",

              "-creds-image", "god/tekton-creds-init:v0.12.0",

              "-git-image", "god/tekton-git-init:v0.12.0",

              "-entrypoint-image", "god/tekton-entrypoint:v0.12.0",

              "-imagedigest-exporter-image", "god/tekton-imagedigestexporter:v0.12.0",

              "-pr-image", "god/tekton-pullrequest-init:v0.12.0",

              "-build-gcs-fetcher-image", "god/tekton-gcs-fetcher:v0.12.0",

              # These images are pulled from Dockerhub, by digest, as of April 15, 2020.

              "-nop-image", "god/tianon:v1.0",

              "-shell-image", "god/busybox:v1.0",

              "-gsutil-image", "google/cloud-sdk"]

            volumeMounts:

            - name: config-logging

              mountPath: /etc/config-logging

            env:

            - name: SYSTEM_NAMESPACE

              valueFrom:

                fieldRef:

                  fieldPath: metadata.namespace

            - # If you are changing these names, you will also need to update

              # the controller's Role in 200-role.yaml to include the new

              # values in the "configmaps" "get" rule.

              name: CONFIG_LOGGING_NAME

              value: config-logging

            - name: CONFIG_OBSERVABILITY_NAME

              value: config-observability

            - name: CONFIG_ARTIFACT_BUCKET_NAME

              value: config-artifact-bucket

            - name: CONFIG_ARTIFACT_PVC_NAME

              value: config-artifact-pvc

            - name: CONFIG_FEATURE_FLAGS_NAME

              value: feature-flags

            - name: CONFIG_LEADERELECTION_NAME

              value: config-leader-election

            - name: METRICS_DOMAIN

              value: tekton.dev/pipeline

          volumes:

          - name: config-logging

            configMap:

              name: config-logging

    ---

    apiVersion: v1

    kind: Service

    metadata:

      labels:

        app: tekton-pipelines-controller

        pipeline.tekton.dev/release: "v0.12.0"

        version: "v0.12.0"

      name: tekton-pipelines-controller

      namespace: tekton-pipelines

    spec:

      ports:

      - name: http-metrics

        port: 9090

        protocol: TCP

        targetPort: 9090

      selector:

        app: tekton-pipelines-controller

    ---

    # Copyright 2019 The Tekton Authors

    #

    # Licensed under the Apache License, Version 2.0 (the "License");

    # you may not use this file except in compliance with the License.

    # You may obtain a copy of the License at

    #

    #    https://www.apache.org/licenses/LICENSE-2.0

    #

    # Unless required by applicable law or agreed to in writing, software

    # distributed under the License is distributed on an "AS IS" BASIS,

    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

    # See the License for the specific language governing permissions and

    # limitations under the License.

    apiVersion: apps/v1

    kind: Deployment

    metadata:

      # Note: the Deployment name must be the same as the Service name specified in

      # config/400-webhook-service.yaml. If you change this name, you must also

      # change the value of WEBHOOK_SERVICE_NAME below.

      name: tekton-pipelines-webhook

      namespace: tekton-pipelines

      labels:

        app.kubernetes.io/name: tekton-pipelines

        app.kubernetes.io/component: webhook-controller

        pipeline.tekton.dev/release: "v0.12.0"

        version: "v0.12.0"

    spec:

      replicas: 1

      selector:

        matchLabels:

          app: tekton-pipelines-webhook

          role: webhook

      template:

        metadata:

          annotations:

            cluster-autoscaler.kubernetes.io/safe-to-evict: "false"

          labels:

            app: tekton-pipelines-webhook

            role: webhook

            app.kubernetes.io/name: tekton-pipelines

            app.kubernetes.io/component: webhook-controller

            pipeline.tekton.dev/release: "v0.12.0"

            version: "v0.12.0"

        spec:

          serviceAccountName: tekton-pipelines-webhook

          containers:

          - name: webhook

            # This is the Go import path for the binary that is containerized

            # and substituted here.

            image:  god/tekton-webhook:v0.12.0

            env:

            - name: SYSTEM_NAMESPACE

              valueFrom:

                fieldRef:

                  fieldPath: metadata.namespace

            - # If you are changing these names, you will also need to update

              # the webhook's Role in 200-role.yaml to include the new

              # values in the "configmaps" "get" rule.

              name: CONFIG_LOGGING_NAME

              value: config-logging

            - name: CONFIG_OBSERVABILITY_NAME

              value: config-observability

            - name: CONFIG_LEADERELECTION_NAME

              value: config-leader-election

            - name: WEBHOOK_SERVICE_NAME

              value: tekton-pipelines-webhook

            - name: WEBHOOK_SECRET_NAME

              value: webhook-certs

            - name: METRICS_DOMAIN

              value: tekton.dev/pipeline

            securityContext:

              allowPrivilegeEscalation: false

            ports:

            - name: metrics

              containerPort: 9090

            - name: profiling

              containerPort: 8008

            - name: https-webhook

              containerPort: 8443

    ---

    apiVersion: v1

    kind: Service

    metadata:

      labels:

        app: tekton-pipelines-webhook

        role: webhook

        pipeline.tekton.dev/release: v0.12.0

        version: "v0.12.0"

      name: tekton-pipelines-webhook

      namespace: tekton-pipelines

    spec:

      ports:

      - # Define metrics and profiling for them to be accessible within service meshes.

        name: http-metrics

        port: 9090

        targetPort: 9090

      - name: http-profiling

        port: 8008

        targetPort: 8008

      - name: https-webhook

        port: 443

        targetPort: 8443

      selector:

        app: tekton-pipelines-webhook

        role: webhook

    ---

    更新资源文件。  kubectl apply -f release.yaml

    #验证 pod 是否创建成功

    kubectl get pods -n tekton-pipelines

    NAME                                          READY  STATUS    RESTARTS  AGE

    tekton-pipelines-controller-df779b44b-7lvsx  1/1    Running  0          20s

    tekton-pipelines-webhook-6bb6b45fd4-6scgl    1/1    Running  0          20s

    Tekton 概念

    Tekton 为 Kubernetes 提供了多种 CRD 资源对象,可用于定义我们的流水线,主要有以下几个 CRD 资源对象:

    1)Task:表示执行命令的一系列步骤,task 里可以定义一系列的 steps,例如编译代码、构建镜 像、推送镜像等,每个 step 实际由一个 Pod 里的容器执行。

    2)TaskRun:task 只是定义了一个模版,taskRun 才真正代表了一次实际的运行,当然你也可以 自己手动创建一个 taskRun,taskRun 创建出来之后,就会自动触发 task 描述的构建任务。 

    3)Pipeline:一组任务,表示一个或多个 task、PipelineResource 以及各种定义参数的集合。 

    4)PipelineRun:类似 task 和 taskRun 的关系,pipelineRun 也表示某一次实际运行的 pipeline,下发一个 pipelineRun CRD 实例到 Kubernetes 后,同样也会触发一次 pipeline 的 构建。

    5)PipelineResource:表示 pipeline 输入资源,比如 github 上的源码,或者 pipeline 输出资 源,例如一个容器镜像或者构建生成的 jar 包等。

    测试 Tekton 构建 CI/CD 流水线

    测试一个简单的 golang 程序。应用程序代码,测试及 dockerfile 文件可在如下地址获取: https://github.com/cadrcadr/tekton-demo

    1、clone 应用程序代码进行测试,创建一个 task 任务

    cat task-test.yaml

    apiVersion: tekton.dev/v1beta1

    kind: Task

    metadata:

      name: test

    spec:

      resources:

        inputs:

        - name: repo

          type: git

      steps:

      - name: run-test

        image: golang:1.14-alpine

        workingDir: /workspace/repo

        command: ["go"]

        args: ["test"]

    kubectl apply -f task-test.yaml

    #查看 Task 资源

    kubectl get Task

    NAME AGE

    test 23s

    #上面内容解释说明:

    resources 定义了我们的任务中定义的步骤中需要输入的内容,这里我们的步骤需要 Clone 一个 Git 仓库作为 go test 命令的输入。Tekton 内置了一种 git 资源类型,它会自动将代码仓库 Clone 到 /workspace/$input_name 目录中,由于我们这里输入被命名成 repo,所以代码会被 Clone 到 /workspace/repo 目录下面。然后下面的 steps 就是来定义执行运行测试命令的步骤, 这里我们直接在代码的根目录中运行 go test 命令即可,需要注意的是命令和参数需要分别定义。

    2、创建 pipelineresource 资源对象

    通过上面步骤我们定义了一个 

    Task 任务,但是该任务并不会立即执行,我们必须创建一个 TaskRun 引用它并提供所有必需输入的数据才行。这里我们就需要将 git 代码库作为输入,我们必 须先创建一个 PipelineResource 对象来定义输入信息,创建一个名

    为 

    pipelineresource.yaml 的资源清单文件,内容如下所示:

    # cat pipelineresource.yaml

    apiVersion: tekton.dev/v1alpha1

    kind: PipelineResource

    metadata:

      name: god-tekton-example

    spec:

      type: git

      params:

        - name: url

          value: https://github.com/cadrcadr/tekton-demo

        - name: revision

          value: master

    kubectl apply -f pipelineresource.yaml

    3、创建 taskrun 任务

    cat taskrun.yaml

    apiVersion: tekton.dev/v1beta1

    kind: TaskRun

    metadata:

      name: testrun

    spec:

      taskRef:

        name: test

      resources:

        inputs:

        - name: repo

          resourceRef:

            name: god-tekton-example

    ]# kubectl apply -f taskrun.yaml

    #上面资源清单文件解释说明

    这里通过 

    taskRef 引用上面定义的 Task 和 git 仓库作为输入,resourceRef 也是引用上面定义的 PipelineResource 资源对象。

    #创建后,我们可以通过查看 TaskRun 资源对象的状态来查看构建状态

     # kubectl get taskrun

    NAME SUCCEEDED REASON STARTTIME

    testrun Unknown Running 6s

    # kubectl get pods

    NAME READY STATUS RESTARTS AGE

    testrun-pod-x9rkn 2/2 Running 0 9s

    当任务执行完成后, Pod 就会变成 Completed 状态了:

    kubectl get pods

    NAME READY STATUS RESTARTS AGE

    testrun-pod-x9rkn 0/2 Completed 0 72s

    我们可以通过 kubectl describe 命令来查看任务运行的过程,首先就是通过 initContainer 中的 一个 busybox 镜像将代码 Clone 下来,然后使用任务中定义的镜像来执行命令。当任务执行完成 后, Pod 就会变成 Completed 状态了,我们可以查看容器的日志信息来了解任务的执行结果信 息:

    # kubectl logs testrun-pod-x9rkn --all-containers {"level":"info","ts":1617616592.58145,"caller":"git/git.go:136","msg":"Successfully cloned https://github.com/luckylucky421/tekton-demo @ c6c2a85091d538a13c44f85bcee9e861c362b0d3 (grafted, HEAD, origin/master) in path /workspace/repo"} {"level":"info","ts":1617616592.6319332,"caller":"git/git.go:177","msg":"Successfully initialized and updated submodules in path /workspace/repo"}

    PASS

    ok _/workspace/repo 0.003s

    #通过上面可以看到我们的测试已经通过了。

    总结:我们已经在 Kubernetes 集群上成功安装了 Tekton,定义了一个 Task,并通过 YAML 清 单和创建 TaskRun 对其进行了测试。

    相关文章

      网友评论

          本文标题:CI-CD 工具 Tekton

          本文链接:https://www.haomeiwen.com/subject/nnvjeltx.html