【KubernetesでCI/CD】Tekton動かしてみる
はじめに
簡単な例を使って、Tekton Pipelineを動かしてみたいと思います。
Tektonについては下記を参考にしてください。また、Tekton Pipeline使うまでの準備も紹介しています。
【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のドキュメントより
task
とpipeline
はKubernetesのカスタムリソースとして指定できます。
カスタムリソース
Tekton Pipelineで使用するカスタムリソースについて紹介します。
カスタムリソース | 説明 |
---|---|
Task | ビルドなどのstepからなるtaskを定義する。 |
TaskRun | 定義したTask を実行する。 |
Pipeline | pipelineを定義する。イベントでトリガーするか、PipelineRun で実行する。 |
PipelineRun | 定義したPipeline を実行する。 |
PipelineResource | Task での入力と出力先を定義する。 |
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-goodbye
のPipeline
に紐付けるようにマニフェスト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!
すごく簡単な例でしたが、Task
とPipeline
が実行されていくのが分かったと思います。
まとめ
- Tekton Pipelineは
step
、task
、pipeline
から構成される Task
とPipeline
はカスタムリソースが存在するTask
とPipeline
はそれぞれTaskRun
とPipelineRun
を紐付けて実行する
参考
- Overview of Tekton | Tekton
- Concepts | Tekton
- Tasks and Pipelines | Tekton
- pipeline/tutorial.md at main · tektoncd/pipeline