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

はじめに

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

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

【KubernetesでCI/CD】Tektonとは
はじめにKubernetesでCI/CDができるTektonについてどんなものなのか、ローカルで使うために何をしたらいいのかまとめました。ローカル上でKubernetesが動いていることが前提となっています。今回はDocker Desk...

本記事では、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コマンドを実行を実行しているだけになります。

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: hello
spec:
  steps:
    - name: hello
      image: ubuntu
      command:
        - echo
      args:
        - "Hello World!"
Tekton
Tasks Overview Configuring a Task Task vs. ClusterTask Defining Steps Reserved directories Running scripts within Steps Windows scripts Specifying a timeout...

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

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

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

❯ kubectl get task
NAME    AGE
hello   9m23s

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

❯ tkn task describe hello
Name:        hello
Namespace:   default

📨 Input Resources

 No input resources

📡 Output Resources

 No output resources

⚓ Params

 No params

📝 Results

 No results

📂 Workspaces

 No workspaces

🦶 Steps

 ∙ hello

🗂  Taskruns

 No taskruns

TaskRunを作成

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

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  generateName: hello-run-
spec:
  taskRef:
    name: hello
Tekton
TaskRuns Overview Configuring a TaskRun Specifying the target Task Tekton Bundles Specifying Parameters Implicit Parameters Extra Parameters Specifying Resour...

TaskRunを作成します。

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

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

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

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

❯ tkn taskrun describe hello-run-xs472
Name:              hello-run-xs472
Namespace:         default
Task Ref:          hello
Service Account:   default
Timeout:           1h0m0s
Labels:
 app.kubernetes.io/managed-by=tekton-pipelines
 tekton.dev/task=hello

🌡️  Status

STARTED         DURATION    STATUS
3 minutes ago   7 seconds   Succeeded

📨 Input Resources

 No input resources

📡 Output Resources

 No output resources

⚓ Params

 No params

📝 Results

 No results

📂 Workspaces

 No workspaces

🦶 Steps

 NAME      STATUS
 ∙ hello   Completed

🚗 Sidecars

No sidecars

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

ログも確認してみます。

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

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

Pipelineeを実行してみる

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

Taskを準備する

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

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

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: goodbye
spec:
  steps:
    - name: goodbye
      image: ubuntu
      script: |
        #!/bin/bash
        echo "Goodbye World!"
❯ kubectl apply -f task-goodbye.yaml
task.tekton.dev/goodbye created

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

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  generateName: goodbye-run-
spec:
  taskRef:
    name: goodbye
❯ kubectl create -f taskRun-goodbye.yaml
taskrun.tekton.dev/goodbye-run-nx89h created

Pipelineを作成

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

apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: hello-goodbye
spec:
  tasks:
    - name: hello
      taskRef:
        name: hello
    - name: goodbye
      runAfter:
        - hello
      taskRef:
        name: goodbye
Tekton
Pipelines Overview Configuring a Pipeline Specifying Resources Specifying Workspaces Specifying Parameters Adding Tasks to the Pipeline Tekton Bundles Using t...

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

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

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

❯ kubectl get pipeline
NAME            AGE
hello-goodbye   2m44s

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

❯ tkn pipeline describe hello-goodbye
Name:        hello-goodbye
Namespace:   default

📦 Resources

 No resources

⚓ Params

 No params

📝 Results

 No results

📂 Workspaces

 No workspaces

🗒  Tasks

 NAME        TASKREF   RUNAFTER   TIMEOUT   CONDITIONS   PARAMS
 ∙ hello     hello                ---       ---          ---
 ∙ goodbye   goodbye   hello      ---       ---          ---

⛩  PipelineRuns

 No pipelineruns

PipelineRunを作成

次にPipelineRunを作成します。

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

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  generateName: hello-goodbye-run-
spec:
  pipelineRef:
    name: hello-goodbye
Tekton
PipelineRuns PipelineRuns Overview Configuring a PipelineRun Specifying the target Pipeline Tekton Bundles Specifying Resources Specifying Parameters Specif...

PipelineRunを作成します。

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

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

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

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

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

❯ tkn pipelinerun describe hello-goodbye-run-44v7m
Name:              hello-goodbye-run-44v7m
Namespace:         default
Pipeline Ref:      hello-goodbye
Service Account:   default
Timeout:           1h0m0s
Labels:
 tekton.dev/pipeline=hello-goodbye

🌡️  Status

STARTED        DURATION     STATUS
1 minute ago   16 seconds   Succeeded

📦 Resources

 No resources

⚓ Params

 No params

📝 Results

 No results

📂 Workspaces

 No workspaces

🗂  Taskruns

 NAME                                      TASK NAME   STARTED        DURATION    STATUS
 ∙ hello-goodbye-run-44v7m-goodbye-qqqqn   goodbye     1 minute ago   8 seconds   Succeeded
 ∙ hello-goodbye-run-44v7m-hello-h57bk     hello       1 minute ago   8 seconds   Succeeded

⏭️  Skipped Tasks

 No Skipped Tasks

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

❯ tkn pipelinerun logs hello-goodbye-run-44v7m
[hello : hello] Hello World!

[goodbye : goodbye] Goodbye World!

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

まとめ

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

参考

タイトルとURLをコピーしました