【KubernetesでCI/CD】Tekton動かしてみる

2021.11.13
2024.03.24
CI/CD
TektonTekton Pipeline

はじめに

簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。

Tektonについては下記を参考にしてください。また、Tekton Pipeline使うまでの準備も紹介しています。

【KubernetesでCI/CD】Tektonとは

【KubernetesでCI/CD】Tektonとは

はじめに KubernetesでCI/CDができる**Tektonについてどんなものなのか**、

本記事では、Tekton PipelineとTekton CLI (tkn)が使えるようになっていることを前提にしています。

Tekton Pipeline

Tekton Pipelineは、CI/CDパイプラインを可能にするTektoの基礎となるツールです。

コンセプト

まずは、Tekton Pipelineで出てくるコンセプトについて紹介します。

  • step: 指定したイメージを使用して実行されるCI/CDワークフローでの最小実行単位
  • task: Pod上で順番に実行されるstepの集まり
  • pipeline: 順番に実行されるTaskの集まり

Tektonのドキュメントより

taskpipelineはKubernetesのカスタムリソースとして指定できます。

カスタムリソース

Tekton Pipelineで使用するカスタムリソースについて紹介します。

カスタムリソース説明
Taskビルドなどのstepからなるtaskを定義する。
TaskRun定義したTaskを実行する。
Pipelinepipelineを定義する。イベントでトリガーするか、PipelineRunで実行する。
PipelineRun定義したPipelineを実行する。
PipelineResourceTaskでの入力と出力先を定義する。

Taskを実行してみる

実際にTaskを実行してみます。

Taskを作成

まずはTaskを定義するマニフェストtask-hello.yamlを作成します。

ここではシンプルにubuntuコンテナ上でechoコマンドを実行を実行しているだけになります。

1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4  name: hello
5spec:
6  steps:
7    - name: hello
8      image: ubuntu
9      command:
10        - echo
11      args:
12        - "Hello World!"

Tekton

Tasks Overview Configuring a Task Task vs. ClusterTask Defining Steps Reserved directories Running scripts within Steps Windows scripts Specifying a timeout Specifying onError for a step Accessing Step’s exitCode in subsequent Steps Produce a task result with onError Breakpoint on failure with onError Redirecting step output streams with stdoutConfig and stderrConfig Specifying Parameters Specifying Workspaces Emitting Results Larger Results using sidecar logs Specifying Volumes Specifying a Step template Specifying Sidecars Specifying a DisplayName Adding a description Using variable substitution Substituting parameters and resources Substituting Array parameters Substituting Workspace paths Substituting Volume names and types Substituting in Script blocks Code examples Building and pushing a Docker image Mounting multiple Volumes Mounting a ConfigMap as a Volume source Using a Secret as an environment source Using a Sidecar in a Task Debugging Inspecting the file structure Inspecting the Pod Running Step Containers as a Non Root User Task Authoring Recommendations Overview A Task is a collection of Steps that you define and arrange in a specific order of execution as part of your continuous integration flow.

kubectlマニフェストからTaskを作成します。

1❯ kubectl apply -f task-hello.yaml
2task.tekton.dev/hello created

作成されているのが確認できます。

1❯ kubectl get task
2NAME    AGE
3hello   9m23s

また、tknコマンドでTaskの詳細が確認できます。

1❯ tkn task describe hello
2Name:        hello
3Namespace:   default
4
5📨 Input Resources
6
7 No input resources
8
9📡 Output Resources
10
11 No output resources
12
13⚓ Params
14
15 No params
16
17📝 Results
18
19 No results
20
21📂 Workspaces
22
23 No workspaces
24
25🦶 Steps
26
27 ∙ hello
28
29🗂  Taskruns
30
31 No taskruns

TaskRunを作成

次に、TaskRunのマニフェストtaskRun-hello.yamlを作成します。

1apiVersion: tekton.dev/v1beta1
2kind: TaskRun
3metadata:
4  generateName: hello-run-
5spec:
6  taskRef:
7    name: hello

Tekton

TaskRuns Overview Configuring a TaskRun Specifying the target Task Tekton Bundles Remote Tasks Specifying Parameters Propagated Parameters Propagated Object Parameters Extra Parameters Specifying Resource limits Specifying Task-level ComputeResources Specifying a Pod template Specifying Workspaces Propagated Workspaces Specifying Sidecars Configuring Task Steps and Sidecars in a TaskRun Specifying LimitRange values Specifying Retries Configuring the failure timeout Specifying ServiceAccount credentials TaskRun status The status field Monitoring execution status Monitoring Steps Steps Monitoring Results Cancelling a TaskRun Debugging a TaskRun Breakpoint on Failure Debug Environment Events Running a TaskRun Hermetically Code examples Example TaskRun with a referenced Task Example TaskRun with an embedded Task Example of reusing a Task Example of Using custom ServiceAccount credentials Example of Running Step Containers as a Non Root User Overview A TaskRun allows you to instantiate and execute a Task on-cluster.

TaskRunを作成します。

1❯ kubectl create -f taskRun-hello.yaml
2taskrun.tekton.dev/hello-run-xs472 created

作成されているのが確認できます。

1❯ kubectl get taskrun
2NAME              SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
3hello-run-xs472   True        Succeeded   2m5s        118s

tknで作成されたTaskRunの詳細を確認してみます。

1❯ tkn taskrun describe hello-run-xs472
2Name:              hello-run-xs472
3Namespace:         default
4Task Ref:          hello
5Service Account:   default
6Timeout:           1h0m0s
7Labels:
8 app.kubernetes.io/managed-by=tekton-pipelines
9 tekton.dev/task=hello
10
11🌡️  Status
12
13STARTED         DURATION    STATUS
143 minutes ago   7 seconds   Succeeded
15
16📨 Input Resources
17
18 No input resources
19
20📡 Output Resources
21
22 No output resources
23
24⚓ Params
25
26 No params
27
28📝 Results
29
30 No results
31
32📂 Workspaces
33
34 No workspaces
35
36🦶 Steps
37
38 NAME      STATUS
39 ∙ hello   Completed
40
41🚗 Sidecars
42
43No sidecars

ステータス部分にSucceededとあるようにTaskの実行が成功しています。

ログも確認してみます。

1❯ tkn taskrun logs hello-run-xs472
2[hello] Hello World!

Taskで定義していたechoコマンドが実行されているのがわかります。

Pipelineeを実行してみる

続いて、Pipelineを実行してみます。

Taskを準備する

Taskが1つだと違いが分かりにくいので、先ほど作成したTaskに加えて、もう一つTaskを作成します。

task-goodbye.yamlを作成してTaskを作成します。

1apiVersion: tekton.dev/v1beta1
2kind: Task
3metadata:
4  name: goodbye
5spec:
6  steps:
7    - name: goodbye
8      image: ubuntu
9      script: |
10        #!/bin/bash
11        echo "Goodbye World!"
1❯ kubectl apply -f task-goodbye.yaml
2task.tekton.dev/goodbye created

同様に、taskRun-goodbye.yamlを作成して、TaskRunを作成します。

1apiVersion: tekton.dev/v1beta1
2kind: TaskRun
3metadata:
4  generateName: goodbye-run-
5spec:
6  taskRef:
7    name: goodbye
1❯ kubectl create -f taskRun-goodbye.yaml
2taskrun.tekton.dev/goodbye-run-nx89h created

Pipelineを作成

helloというTaskを実行した後にgoodbyeというTaskを実行するPipelineとなるようなマニフェストpipeline-hello-goodbye.yamlを作成します。

1apiVersion: tekton.dev/v1beta1
2kind: Pipeline
3metadata:
4  name: hello-goodbye
5spec:
6  tasks:
7    - name: hello
8      taskRef:
9        name: hello
10    - name: goodbye
11      runAfter:
12        - hello
13      taskRef:
14        name: goodbye

Tekton

Pipelines Pipelines Overview Configuring a Pipeline Specifying Workspaces Specifying Parameters Adding Tasks to the Pipeline Specifying Display Name Specifying Remote Tasks Specifying Pipelines in PipelineTasks Specifying Parameters in PipelineTasks Specifying Matrix in PipelineTasks Specifying Workspaces in PipelineTasks Tekton Bundles Using the runAfter field Using the retries field Using the onError field Produce results with OnError Guard Task execution using when expressions Guarding a Task and its dependent Tasks Cascade when expressions to the specific dependent Tasks Compose using Pipelines in Pipelines Guarding a Task only Configuring the failure timeout Using variable substitution Using the retries and retry-count variable substitutions Using Results Passing one Task’s Results into the Parameters or when expressions of another Emitting Results from a Pipeline Configuring the Task execution order Adding a description Adding Finally to the Pipeline Specifying Display Name Specifying Workspaces in finally tasks Specifying Parameters in finally tasks Specifying matrix in finally tasks Consuming Task execution results in finally Consuming Pipeline result with finally PipelineRun Status with finally Using Execution Status of pipelineTask Using Aggregate Execution Status of All Tasks Guard finally Task execution using when expressions when expressions using Parameters in finally Tasks when expressions using Results in finally ‘Tasks` when expressions using Execution Status of PipelineTask in finally tasks when expressions using Aggregate Execution Status of Tasks in finally tasks Known Limitations Cannot configure the finally task execution order Using Custom Tasks Specifying the target Custom Task Specifying a Custom Task Spec in-line (or embedded) Specifying parameters Specifying matrix Specifying workspaces Using Results Specifying Timeout Specifying Retries Known Custom Tasks Code examples Overview A Pipeline is a collection of Tasks that you define and arrange in a specific order of execution as part of your continuous integration flow.

マニフェストからPipelineを作成します。

1❯ kubectl apply -f pipeline-hello-goodbye.yaml
2pipeline.tekton.dev/hello-goodbye created

Pipelineが作成されているのが確認できます。

1❯ kubectl get pipeline
2NAME            AGE
3hello-goodbye   2m44s

また、詳細もtknで確認できます。

1❯ tkn pipeline describe hello-goodbye
2Name:        hello-goodbye
3Namespace:   default
4
5📦 Resources
6
7 No resources
8
9⚓ Params
10
11 No params
12
13📝 Results
14
15 No results
16
17📂 Workspaces
18
19 No workspaces
20
21🗒  Tasks
22
23 NAME        TASKREF   RUNAFTER   TIMEOUT   CONDITIONS   PARAMS
24 ∙ hello     hello                ---       ---          ---
25 ∙ goodbye   goodbye   hello      ---       ---          ---
26
27⛩  PipelineRuns
28
29 No pipelineruns

PipelineRunを作成

次にPipelineRunを作成します。

先ほど作成したhello-goodbyePipelineに紐付けるようにマニフェストpipelineRun-hello-goodbye.yamlを作成します。

1apiVersion: tekton.dev/v1beta1
2kind: PipelineRun
3metadata:
4  generateName: hello-goodbye-run-
5spec:
6  pipelineRef:
7    name: hello-goodbye

Tekton

PipelineRuns PipelineRuns Overview Configuring a PipelineRun Specifying the target Pipeline Tekton Bundles Remote Pipelines Specifying Task-level ComputeResources Specifying Parameters Propagated Parameters Scope and Precedence Default Values Object Parameters Specifying custom ServiceAccount credentials Mapping ServiceAccount credentials to Tasks Specifying a Pod template Specifying taskRunSpecs Specifying Workspaces Propagated Workspaces Referenced TaskRuns within Embedded PipelineRuns Specifying LimitRange values Configuring a failure timeout PipelineRun status The status field Monitoring execution status Marking off user errors Cancelling a PipelineRun Gracefully cancelling a PipelineRun Gracefully stopping a PipelineRun Pending PipelineRuns Overview A PipelineRun allows you to instantiate and execute a Pipeline on-cluster.

PipelineRunを作成します。

1❯ kubectl create -f pipelineRun-hello-goodbye.yaml
2pipelinerun.tekton.dev/hello-goodbye-run-44v7m created

作成されているのが確認できます。

1❯ kubectl get pipelinerun
2NAME                      SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
3hello-goodbye-run-44v7m   True        Succeeded   48s         32s

詳細も他と同様に確認できます。

ステータスの部分を見ると成功しているのがわかります。

1❯ tkn pipelinerun describe hello-goodbye-run-44v7m
2Name:              hello-goodbye-run-44v7m
3Namespace:         default
4Pipeline Ref:      hello-goodbye
5Service Account:   default
6Timeout:           1h0m0s
7Labels:
8 tekton.dev/pipeline=hello-goodbye
9
10🌡️  Status
11
12STARTED        DURATION     STATUS
131 minute ago   16 seconds   Succeeded
14
15📦 Resources
16
17 No resources
18
19⚓ Params
20
21 No params
22
23📝 Results
24
25 No results
26
27📂 Workspaces
28
29 No workspaces
30
31🗂  Taskruns
32
33 NAME                                      TASK NAME   STARTED        DURATION    STATUS
34 ∙ hello-goodbye-run-44v7m-goodbye-qqqqn   goodbye     1 minute ago   8 seconds   Succeeded
35 ∙ hello-goodbye-run-44v7m-hello-h57bk     hello       1 minute ago   8 seconds   Succeeded
36
37⏭️  Skipped Tasks
38
39 No Skipped Tasks

最後にログも確認してみます。

1❯ tkn pipelinerun logs hello-goodbye-run-44v7m
2[hello : hello] Hello World!
3
4[goodbye : goodbye] Goodbye World!

すごく簡単な例でしたが、TaskPipelineが実行されていくのが分かったと思います。

まとめ

  • Tekton Pipelineはsteptaskpipelineから構成される
  • TaskPipelineはカスタムリソースが存在する
  • TaskPipelineはそれぞれTaskRunPipelineRunを紐付けて実行する

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee