TECHSTEP

ITインフラ関連の記事を公開してます。

Tekton Trigger exampleを眺める

はじめに

先日Tektonに入門した記事を公開しましたが、TektonにはTask Pipeline以外にもTriggerという重要な機能が存在します。Triggerを利用することで、git pushなどのイベントを契機にパイプラインを実行することが可能となり、CI/CDパイプラインを構築するうえで重要なものです。

今回はTekton Triggerの第一歩として、git pushなどの実践的なイベントを利用する前に、Tekton Triggerの概要と簡単な例について紹介します。

Tekton Triggerとは

Tekton Triggerは、外部からのイベントを契機にパイプラインの実行を開始する機能です。イベントのペイロードから受け取ったfield値をTektonリソースにマップすることが可能です。

Tekton公式ドキュメントより

Tekton Triggerに関するCustom Resourceには、以下のようなものがあります。

  • TriggerTemplate:Triggerによって実行するリソースを定義します。resourceTemplateというフィールドでTektonリソース(PipelineRunなど)を定義し、イベント発生後に定義したリソースを実行します。
  • TriggerBinding:イベントとトリガーとを紐づけます。具体的には、イベントからfield値を取得し、それをパラメータとして保存します。保存したパラメータはTriggerTemplateなどで利用することができます。
  • EventListener:外部からのイベントに関するデータを受け付けます。利用できるデータはHTTPベースのJSONペイロードです。EventListenerでは、イベントから受け取ったデータを渡すTriggerBindingと、それを適用するTriggerTemplateを指定します。またEventListenerではinterceptorという項目があり、受け取るイベントの種類やデータに含まれる値などを指定することが可能です。

検証内容

今回はTektonのGitHubリポジトリに含まれるこちらのexampleを実行し、そこで利用する定義ファイルやその動きについて調べました。

Triggerの構成

まずは今回の検証内容を簡単に紹介します。大まかな流れは、以下の図の通りです。

f:id:FY0323:20200728182313p:plain

上図の左側から辿っていくと、

  • クライアントが特定のFieldを含むPOSTリクエストを送信
  • EventListenerが通信を受け取り、Field値をTriggerBindingへ渡す
  • TriggerBindingで定義されたパラメータをTriggerTemplateへ渡し、PipelineResourceが開始される
  • PipelineRunにより、指定のPipeline Taskを実行する
  • 上記リソースは、専用のService Accountによって実行される

各定義ファイルの構成

次に、パイプラインで利用する各定義ファイルの内容を見ていきます。今回のパイプラインで利用するリソースとその名前は以下の通りです。

リソース種別 リソース名 用途
EventListener listener イベントを受け取り、Trigger関連のリソースに情報を渡す
TriggerBinding pipeline-binding EventListenerから値を受け取りTriggerTemplateへ渡す
message-binding TriggerTemplateへ値を渡す
TriggerTemplate pipeline-template TriggerBindingからパラメータ値を受け取り、定義したPipelineRunを実行する
Pipeline simple-pipeline PipelineRunで実行するパイプラインを定義する
Task say-hello Pipelineに含むタスクの一つ。Content-Typeを表示する
say-message Pipelineに含むタスクの一つ。messageを表示する
say-bye Pipelineに含むタスクの一つ。指定の文字を表示する

上記定義ファイル間のつながりは、以下のようになります。画像では小さくて読めないと思うので、画像をクリックして見てください。

f:id:FY0323:20200728231721p:plain

こまごまと書いていますが、主なポイントは以下の通りです。

  • curlでのPOSTリクエスト中に設定するContent-Type head_commit repositoryの値をTriggerBindingが受け取る
  • EventListenerTriggerTemplateと2つのTriggerBindingを紐づけている
  • TriggerTemplateには`PipelineRunの定義を記載しており、PipelineRunにはPipelineと3つのTaskが紐づいている

実際の動作

ここからは実際の動作について見ていきます。なお、利用した環境は前回のTekton紹介記事と同じものを利用しています。

Kubernetesクラスターを用意したら、まずはTektonをインストールします。Tektonのインストールはこちらのページに記載されている通り、Pipeline・Triggerに関するリソースを作成します。

# Tekton Pipelineインストール
$ kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

namespace/tekton-pipelines created
podsecuritypolicy.policy/tekton-pipelines created
clusterrole.rbac.authorization.k8s.io/tekton-pipelines-controller-cluster-access created
clusterrole.rbac.authorization.k8s.io/tekton-pipelines-controller-tenant-access created
clusterrole.rbac.authorization.k8s.io/tekton-pipelines-webhook-cluster-access created
clusterrole.rbac.authorization.k8s.io/tekton-pipelines-leader-election created
role.rbac.authorization.k8s.io/tekton-pipelines-controller created
role.rbac.authorization.k8s.io/tekton-pipelines-webhook created
serviceaccount/tekton-pipelines-controller created
serviceaccount/tekton-pipelines-webhook created
clusterrolebinding.rbac.authorization.k8s.io/tekton-pipelines-controller-cluster-access created
clusterrolebinding.rbac.authorization.k8s.io/tekton-pipelines-controller-leaderelection created
clusterrolebinding.rbac.authorization.k8s.io/tekton-pipelines-controller-tenant-access created
clusterrolebinding.rbac.authorization.k8s.io/tekton-pipelines-webhook-cluster-access created
clusterrolebinding.rbac.authorization.k8s.io/tekton-pipelines-webhook-leaderelection created
rolebinding.rbac.authorization.k8s.io/tekton-pipelines-controller created
rolebinding.rbac.authorization.k8s.io/tekton-pipelines-webhook created
customresourcedefinition.apiextensions.k8s.io/clustertasks.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/conditions.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/images.caching.internal.knative.dev created
customresourcedefinition.apiextensions.k8s.io/pipelines.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/pipelineruns.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/pipelineresources.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/tasks.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/taskruns.tekton.dev created
secret/webhook-certs created
validatingwebhookconfiguration.admissionregistration.k8s.io/validation.webhook.pipeline.tekton.dev created
mutatingwebhookconfiguration.admissionregistration.k8s.io/webhook.pipeline.tekton.dev created
validatingwebhookconfiguration.admissionregistration.k8s.io/config.webhook.pipeline.tekton.dev created
clusterrole.rbac.authorization.k8s.io/tekton-aggregate-edit created
clusterrole.rbac.authorization.k8s.io/tekton-aggregate-view created
configmap/config-artifact-bucket created
configmap/config-artifact-pvc created
configmap/config-defaults created
configmap/feature-flags created
configmap/config-leader-election created
configmap/config-logging created
configmap/config-observability created
deployment.apps/tekton-pipelines-controller created
service/tekton-pipelines-controller created
deployment.apps/tekton-pipelines-webhook created
service/tekton-pipelines-webhook created



# リソースの確認
$ kubectl get ns
NAME               STATUS   AGE
default            Active   14m
kube-node-lease    Active   14m
kube-public        Active   14m
kube-system        Active   14m
tekton-pipelines   Active   48s

$ kubectl get pods -n tekton-pipelines
NAME                                           READY   STATUS    RESTARTS   AGE
tekton-pipelines-controller-559bd4d4df-w5fm6   1/1     Running   0          55s
tekton-pipelines-webhook-7bfd859f8c-2qdd8      1/1     Running   0          55s
# Tekton Triggerインストール
$ kubectl apply --filename https://storage.googleapis.com/tekton-releases/triggers/latest/release.yaml

podsecuritypolicy.policy/tekton-triggers created
clusterrole.rbac.authorization.k8s.io/tekton-triggers-admin created
serviceaccount/tekton-triggers-controller created
clusterrolebinding.rbac.authorization.k8s.io/tekton-triggers-controller-admin created
customresourcedefinition.apiextensions.k8s.io/clustertriggerbindings.triggers.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/eventlisteners.triggers.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/triggerbindings.triggers.tekton.dev created
customresourcedefinition.apiextensions.k8s.io/triggertemplates.triggers.tekton.dev created
secret/triggers-webhook-certs created
validatingwebhookconfiguration.admissionregistration.k8s.io/validation.webhook.triggers.tekton.dev created
mutatingwebhookconfiguration.admissionregistration.k8s.io/webhook.triggers.tekton.dev created
validatingwebhookconfiguration.admissionregistration.k8s.io/config.webhook.triggers.tekton.dev created
clusterrole.rbac.authorization.k8s.io/tekton-triggers-aggregate-edit created
clusterrole.rbac.authorization.k8s.io/tekton-triggers-aggregate-view created
configmap/config-logging-triggers created
configmap/config-observability-triggers created
service/tekton-triggers-controller created
deployment.apps/tekton-triggers-controller created
service/tekton-triggers-webhook created
deployment.apps/tekton-triggers-webhook created



# リソース確認
$ kubectl get pods -n tekton-pipelines
NAME                                           READY   STATUS    RESTARTS   AGE
tekton-pipelines-controller-559bd4d4df-w5fm6   1/1     Running   0          72s
tekton-pipelines-webhook-7bfd859f8c-2qdd8      1/1     Running   0          72s
tekton-triggers-controller-96b9d4dfd-ckpvh     1/1     Running   0          12s
tekton-triggers-webhook-b7c46d8ff-926hw        1/1     Running   0          11s

$ kubectl get svc -n tekton-pipelines
NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                     AGE
tekton-pipelines-controller   ClusterIP   172.21.9.211   <none>        9090/TCP                    15m
tekton-pipelines-webhook      ClusterIP   172.21.1.189   <none>        9090/TCP,8008/TCP,443/TCP   15m
tekton-triggers-controller    ClusterIP   172.21.6.147   <none>        9090/TCP                    14m
tekton-triggers-webhook       ClusterIP   172.21.5.232   <none>        443/TCP                     14m

次にパイプライン作成に利用する定義ファイルをGitHubから取得し、必要なファイルを使って各リソースを作成します。

# 定義ファイルのダウンロード
$ git clone https://github.com/tektoncd/triggers.git
$ cd triggers/example
$ ll
total 12
drwxr-xr-x 1 root root 4096 Jul  9 15:59 ./
drwxr-xr-x 1 root root 4096 Jul  9 15:59 ../
-rw-r--r-- 1 root root 4850 Jul  9 15:59 README.md
drwxr-xr-x 1 root root 4096 Jul  9 15:59 bitbucket/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 clustertriggerbindings/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 cron/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 event-interceptors/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 eventlisteners/
-rw-r--r-- 1 root root 1994 Jul  9 15:59 example-pipeline.yaml
drwxr-xr-x 1 root root 4096 Jul  9 15:59 github/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 gitlab/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 role-resources/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 triggerbindings/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 triggertemplates/
drwxr-xr-x 1 root root 4096 Jul  9 15:59 v1alpha1-task/
# リソースの作成
## Tektonリソースを操作するServiceAccount・Roleなど
$ kubectl apply -f role-resources/secret.yaml
secret/tekton-triggers-example-secret created

$ kubectl apply -f role-resources/serviceaccount.yaml
serviceaccount/tekton-triggers-example-sa created

$ kubectl apply -f role-resources/triggerbinding-roles/
rolebinding.rbac.authorization.k8s.io/tekton-triggers-example-binding created
role.rbac.authorization.k8s.io/tekton-triggers-example-minimal created


## TriggerTemplate・TriggerBinding・EventListener
$ kubectl apply -f triggertemplates/triggertemplate.yaml
triggertemplate.triggers.tekton.dev/pipeline-template created

$ kubectl apply -f triggerbindings/triggerbinding.yaml
triggerbinding.triggers.tekton.dev/pipeline-binding created

$ kubectl apply -f triggerbindings/triggerbinding-message.yaml
triggerbinding.triggers.tekton.dev/message-binding created

$ kubectl apply -f eventlisteners/eventlistener.yaml
eventlistener.triggers.tekton.dev/listener created


## Pipeline
$ kubectl apply -f example-pipeline.yaml
## リソース確認
$ kubectl get svc
NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
el-listener   ClusterIP   172.21.14.31   <none>        8080/TCP   39s
kubernetes    ClusterIP   172.21.0.1     <none>        443/TCP    28m

$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
el-listener-6f676cd886-4kbp7   1/1     Running   0          68s

$ kubectl get eventlistener
NAME       ADDRESS                                             AVAILABLE   REASON
listener   http://el-listener.default.svc.cluster.local:8080   True        MinimumReplicasAvailable

$ kubectl get triggertemplate
NAME                AGE
pipeline-template   2m49s

$ kubectl get triggerbindings
NAME               AGE
message-binding    2m25s
pipeline-binding   2m37s

$ kubectl get task
NAME          AGE
say-bye       6s
say-hello     7s
say-message   6s

$ kubectl get pipeline
NAME              AGE
simple-pipeline   12s

$ kubectl get tekton-pipelines
NAME                                  AGE
pipeline.tekton.dev/simple-pipeline   29s

NAME                          AGE
task.tekton.dev/say-bye       29s
task.tekton.dev/say-hello     30s
task.tekton.dev/say-message   29s

リソースの作成が完了したので、curlコマンドによってPOSTリクエストを送信します。なお、curlコマンドを実行する前にEventListenerPodへアクセスするための操作を行います。ここではkubectl port-forwardにより、ローカルからEventListenerPodへのアクセスを可能にします。

# Port forward
$ kubectl port-forward $(kubectl get pod -o=name -l eventlistener=listener) 8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080


# POSTリクエスト
## 別のターミナルから実行する
$ curl -X POST http://localhost:8080 -H 'Content-Type: application/json' -H 'X-Hub-Signature: sha1=2da37dcb9404ff17b714ee7a505c384758ddeb7b' -d '{"head_commit":{"id": "master"},"repository":{"url": "https://github.com/tektoncd/triggers.git"}}'

{"eventListener":"listener","namespace":"default","eventID":"xs7pp"}

上記コマンド実行後、Podやログを確認します。

# 実行結果の確認
## PipelineRun (実行中)
$ kubectl get pipelinerun
NAME                        SUCCEEDED   REASON    STARTTIME   COMPLETIONTIME
simple-pipeline-run-wmpnx   Unknown     Running   47s


## Podの状態遷移
## Pipeline中のTaskがPodとして立ち上がる
$ kubectl get pods -w
NAME                           READY   STATUS    RESTARTS   AGE
el-listener-6f676cd886-4kbp7   1/1     Running   0          97m
simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx   0/2     Pending   0          0s
simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx   0/2     Pending   0          0s
simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx   0/2     Init:0/1   0          0s
simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx   0/2     PodInitializing   0          6s
simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx   2/2     Running           0          17s
simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx   2/2     Running           0          17s
simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx   0/2     Completed         0          24s
simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd   0/2     Pending           0          0s
simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd   0/2     Pending           0          0s
simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd   0/2     Init:0/1          0          0s
simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd   0/2     PodInitializing   0          2s
simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd   2/2     Running           0          6s
simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd   2/2     Running           0          6s
simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd   0/2     Completed         0          15s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       0/2     Pending           0          0s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       0/2     Pending           0          0s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       0/2     Init:0/1          0          0s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       0/2     PodInitializing   0          2s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       2/2     Running           0          6s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       2/2     Running           0          6s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       1/2     Running           0          13s
simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb       0/2     Completed         0          14s


## tknコマンド
## Pipelineのログを表示する
$ tkn pipeline logs --last -f
[say-hello : git-source-git-source-hqhll] {"level":"info","ts":1595648342.4830065,"caller":"git/git.go:139","msg":"Successfully cloned https://github.com/tektoncd/triggers.git @ 81dc28e2784c58798fcc1cbe851de4f661913ee9 (grafted, HEAD, origin/master) in path /workspace/git-source"}
[say-hello : git-source-git-source-hqhll] {"level":"info","ts":1595648342.5367808,"caller":"git/git.go:180","msg":"Successfully initialized and updated submodules in path /workspace/git-source"}

[say-hello : say-hi] Hello Triggers!
[say-hello : say-hi] Content-Type is application/json

[say-message : git-source-git-source-2k5wl] {"level":"info","ts":1595648357.5576613,"caller":"git/git.go:139","msg":"Successfully cloned https://github.com/tektoncd/triggers.git @ 81dc28e2784c58798fcc1cbe851de4f661913ee9 (grafted, HEAD, origin/master) in path /workspace/git-source"}
[say-message : git-source-git-source-2k5wl] {"level":"info","ts":1595648357.6270146,"caller":"git/git.go:180","msg":"Successfully initialized and updated submodules in path /workspace/git-source"}

[say-message : say-message] Hello from the Triggers EventListener!

[say-bye : git-source-git-source-5qpll] {"level":"info","ts":1595648369.9986367,"caller":"git/git.go:139","msg":"Successfully cloned https://github.com/tektoncd/triggers.git @ 81dc28e2784c58798fcc1cbe851de4f661913ee9 (grafted, HEAD, origin/master) in path /workspace/git-source"}
[say-bye : git-source-git-source-5qpll] {"level":"info","ts":1595648370.0498636,"caller":"git/git.go:180","msg":"Successfully initialized and updated submodules in path /workspace/git-source"}

[say-bye : say-bye] Goodbye Triggers!


## PipelineRun (実行後)
$ kubectl get pipelinerun
NAME                        SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
simple-pipeline-run-wmpnx   True        Succeeded   59s         6s

$ kubectl get tekton-pipelines
NAME                                  AGE
pipeline.tekton.dev/simple-pipeline   97m

NAME                          AGE
task.tekton.dev/say-bye       97m
task.tekton.dev/say-hello     97m
task.tekton.dev/say-message   97m

NAME                                                             SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
taskrun.tekton.dev/simple-pipeline-run-wmpnx-say-bye-b6gmk       True        Succeeded   2m59s       2m45s
taskrun.tekton.dev/simple-pipeline-run-wmpnx-say-hello-6rjbj     True        Succeeded   3m38s       3m14s
taskrun.tekton.dev/simple-pipeline-run-wmpnx-say-message-kw27w   True        Succeeded   3m14s       2m59s

NAME                                               SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
pipelinerun.tekton.dev/simple-pipeline-run-wmpnx   True        Succeeded   3m38s       2m45s

以上のようにパイプラインに実行が完了しました。

パイプライン実行後にPipelineRunリソースを確認すると、curlで指定したパラメータがSpecに設定されていることがわかります。

# PipelineRunの詳細確認
$ kubectl describe pipelinerun.tekton.dev/simple-pipeline-run-wmpnx
Name:         simple-pipeline-run-wmpnx
Namespace:    default
Labels:       tekton.dev/pipeline=simple-pipeline
              triggers.tekton.dev/eventlistener=listener
              triggers.tekton.dev/trigger=foo-trig
              triggers.tekton.dev/triggers-eventid=xs7pp
Annotations:  API Version:  tekton.dev/v1beta1
Kind:         PipelineRun
Metadata:
  Creation Timestamp:  2020-07-25T03:38:39Z
  Generate Name:       simple-pipeline-run-
  Generation:          1
  Resource Version:    1109314995
  Self Link:           /apis/tekton.dev/v1beta1/namespaces/default/pipelineruns/simple-pipeline-run-wmpnx
  UID:                 5c242ed8-ed42-420a-97b8-f8a233b85d17
Spec:
  Params:
    Name:   message
    Value:  Hello from the Triggers EventListener!
    Name:   contenttype
    Value:  application/json★
  Pipeline Ref:
    Name:  simple-pipeline
  Resources:
    Name:  git-source
    Resource Spec:
      Params:
        Name:   revision
        Value:  master★
        Name:   url
        Value:  https://github.com/tektoncd/triggers.git★
      Type:     git
  Timeout:      1h0m0s
Status:
  Completion Time:  2020-07-25T03:39:32Z
  Conditions:
    Last Transition Time:  2020-07-25T03:39:32Z
    Message:               Tasks Completed: 3 (Failed: 0, Cancelled 0), Skipped: 0
    Reason:                Succeeded
    Status:                True
    Type:                  Succeeded
  Pipeline Spec:
    Params:
      Default:      This is the default message
      Description:  The message to print
      Name:         message
      Type:         string
      Description:  The Content-Type of the event
      Name:         contenttype
      Type:         string
    Resources:
      Name:  git-source
      Type:  git
    Tasks:
      Name:  say-hello
      Params:
        Name:   contenttype
        Value:  $(params.contenttype)
      Resources:
        Inputs:
          Name:      git-source
          Resource:  git-source
      Task Ref:
        Kind:  Task
        Name:  say-hello
      Name:    say-message
      Params:
        Name:   message
        Value:  $(params.message)
      Resources:
        Inputs:
          Name:      git-source
          Resource:  git-source
      Run After:
        say-hello
      Task Ref:
        Kind:  Task
        Name:  say-message
      Name:    say-bye
      Resources:
        Inputs:
          Name:      git-source
          Resource:  git-source
      Run After:
        say-message
      Task Ref:
        Kind:  Task
        Name:  say-bye
  Start Time:  2020-07-25T03:38:39Z
  Task Runs:
    simple-pipeline-run-wmpnx-say-bye-b6gmk:
      Pipeline Task Name:  say-bye
      Status:
        Completion Time:  2020-07-25T03:39:32Z
        Conditions:
          Last Transition Time:  2020-07-25T03:39:32Z
          Message:               All Steps have completed executing
          Reason:                Succeeded
          Status:                True
          Type:                  Succeeded
        Pod Name:                simple-pipeline-run-wmpnx-say-bye-b6gmk-pod-5p5gb
        Resources Result:
          Key:            commit
          Resource Name:  git-source
          Resource Ref:
            Name:    git-source
          Value:     81dc28e2784c58798fcc1cbe851de4f661913ee9
        Start Time:  2020-07-25T03:39:18Z
        Steps:
          Container:  step-say-bye
          Image ID:   docker-pullable://bash@sha256:21caabbff34a7432be0f88d24f756a96f1e5bbb93703e8a8b34df7c5536d466a
          Name:       say-bye
          Terminated:
            Container ID:  docker://0b2ab225233e4d9a01c4a0e456edc45fe9e5e6e0d51455c6e14a8d00851cb7a7
            Exit Code:     0
            Finished At:   2020-07-25T03:39:31Z
            Reason:        Completed
            Started At:    2020-07-25T03:39:31Z
          Container:       step-git-source-git-source-5qpll
          Image ID:        docker-pullable://gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init@sha256:f7524d37431fa7d301dfa5c6d0bb3c2e2b029172ec2f823f0e0c6ce9d3c2718c
          Name:            git-source-git-source-5qpll
          Terminated:
            Container ID:  docker://271ac24ae9ce43124b94b2b9efec89319fb034f94e5f1cf8eba2d7c29ac01d0c
            Exit Code:     0
            Finished At:   2020-07-25T03:39:30Z
            Message:       [{"key":"commit","value":"81dc28e2784c58798fcc1cbe851de4f661913ee9","resourceName":"git-source","resourceRef":{"name":"git-source"}}]
            Reason:        Completed
            Started At:    2020-07-25T03:39:24Z
        Task Spec:
          Resources:
            Inputs:
              Name:  git-source
              Type:  git
          Steps:
            Args:
              echo 'Goodbye Triggers!'
            Command:
              bash
              -c
            Image:  bash
            Name:   say-bye
            Resources:
    simple-pipeline-run-wmpnx-say-hello-6rjbj:
      Pipeline Task Name:  say-hello
      Status:
        Completion Time:  2020-07-25T03:39:03Z
        Conditions:
          Last Transition Time:  2020-07-25T03:39:03Z
          Message:               All Steps have completed executing
          Reason:                Succeeded
          Status:                True
          Type:                  Succeeded
        Pod Name:                simple-pipeline-run-wmpnx-say-hello-6rjbj-pod-2dktx
        Resources Result:
          Key:            commit
          Resource Name:  git-source
          Resource Ref:
            Name:    git-source
          Value:     81dc28e2784c58798fcc1cbe851de4f661913ee9
        Start Time:  2020-07-25T03:38:39Z
        Steps:
          Container:  step-say-hi
          Image ID:   docker-pullable://bash@sha256:21caabbff34a7432be0f88d24f756a96f1e5bbb93703e8a8b34df7c5536d466a
          Name:       say-hi
          Terminated:
            Container ID:  docker://9ad1928c51ec681d1e44524de6cbe0e835d4e4ddffd5747690703cc4d078f0ba
            Exit Code:     0
            Finished At:   2020-07-25T03:39:02Z
            Reason:        Completed
            Started At:    2020-07-25T03:39:02Z
          Container:       step-git-source-git-source-hqhll
          Image ID:        docker-pullable://gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init@sha256:f7524d37431fa7d301dfa5c6d0bb3c2e2b029172ec2f823f0e0c6ce9d3c2718c
          Name:            git-source-git-source-hqhll
          Terminated:
            Container ID:  docker://b4b05d34327c0a5486b2515767c42095418b5baae15553e6b074c8497d7b1373
            Exit Code:     0
            Finished At:   2020-07-25T03:39:02Z
            Message:       [{"key":"commit","value":"81dc28e2784c58798fcc1cbe851de4f661913ee9","resourceName":"git-source","resourceRef":{"name":"git-source"}}]
            Reason:        Completed
            Started At:    2020-07-25T03:38:56Z
        Task Spec:
          Params:
            Description:  The Content-Type of the event
            Name:         contenttype
            Type:         string
          Resources:
            Inputs:
              Name:  git-source
              Type:  git
          Steps:
            Args:
              echo -e 'Hello Triggers!\nContent-Type is $(params.contenttype)'
            Command:
              bash
              -c
            Image:  bash
            Name:   say-hi
            Resources:
    simple-pipeline-run-wmpnx-say-message-kw27w:
      Pipeline Task Name:  say-message
      Status:
        Completion Time:  2020-07-25T03:39:18Z
        Conditions:
          Last Transition Time:  2020-07-25T03:39:18Z
          Message:               All Steps have completed executing
          Reason:                Succeeded
          Status:                True
          Type:                  Succeeded
        Pod Name:                simple-pipeline-run-wmpnx-say-message-kw27w-pod-6brzd
        Resources Result:
          Key:            commit
          Resource Name:  git-source
          Resource Ref:
            Name:    git-source
          Value:     81dc28e2784c58798fcc1cbe851de4f661913ee9
        Start Time:  2020-07-25T03:39:03Z
        Steps:
          Container:  step-say-message
          Image ID:   docker-pullable://bash@sha256:21caabbff34a7432be0f88d24f756a96f1e5bbb93703e8a8b34df7c5536d466a
          Name:       say-message
          Terminated:
            Container ID:  docker://ddf9b4e4c0193881be829eeddcdf55520a0f75af1895e5f48a39bd5b30ee1294
            Exit Code:     0
            Finished At:   2020-07-25T03:39:17Z
            Reason:        Completed
            Started At:    2020-07-25T03:39:17Z
          Container:       step-git-source-git-source-2k5wl
          Image ID:        docker-pullable://gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init@sha256:f7524d37431fa7d301dfa5c6d0bb3c2e2b029172ec2f823f0e0c6ce9d3c2718c
          Name:            git-source-git-source-2k5wl
          Terminated:
            Container ID:  docker://201ea779bb6556909779bfa9e10c0eb7b089decaac3bdb1243cf3d9bb70bc9c5
            Exit Code:     0
            Finished At:   2020-07-25T03:39:17Z
            Message:       [{"key":"commit","value":"81dc28e2784c58798fcc1cbe851de4f661913ee9","resourceName":"git-source","resourceRef":{"name":"git-source"}}]
            Reason:        Completed
            Started At:    2020-07-25T03:39:10Z
        Task Spec:
          Params:
            Default:      This is the default message
            Description:  The message to print
            Name:         message
            Type:         string
          Resources:
            Inputs:
              Name:  git-source
              Type:  git
          Steps:
            Args:
              echo '$(params.message)'
            Command:
              bash
              -c
            Image:  bash
            Name:   say-message
            Resources:
Events:
  Type    Reason     Age    From         Message
  ----    ------     ----   ----         -------
  Normal  Started    4m12s  PipelineRun
  Normal  Running    4m12s  PipelineRun  Tasks Completed: 0 (Failed: 0, Cancelled 0), Incomplete: 3, Skipped: 0
  Normal  Running    3m48s  PipelineRun  Tasks Completed: 1 (Failed: 0, Cancelled 0), Incomplete: 2, Skipped: 0
  Normal  Running    3m33s  PipelineRun  Tasks Completed: 2 (Failed: 0, Cancelled 0), Incomplete: 1, Skipped: 0
  Normal  Succeeded  3m19s  PipelineRun  Tasks Completed: 3 (Failed: 0, Cancelled 0), Skipped: 0

参考ドキュメント