Tekton ~ Kubernetes native pipeline resource ~
CI / CD してますか?
2019年初頭、Tekton プロジェクトが公開されました。本投稿では、Tekton の基本的な概念と、簡単な使い方をご紹介します。
Tekton ?
Tekton は、Kubernetes-native pipeline resource と表現される通り、k8s 上で CI/CD パイプラインを構築するためのフレームワークです。元々は、Knative プロジェクトの中で始まったプロジェクトで、現在は、Continuous Delivery Foundation でホストされています。
Tekton は “k8s-native” が表す通り、GKE は勿論、ローカルの k8s クラスターを含む、様々な k8s 環境で動作します。また、パイプラインをYAML形式で宣言的に記述でき、後述する Tekton の概念により、組み合わせ可能かつ再利用性が高いという特徴があります。
Tekton の概念
Tekton では、CI/CD のパイプラインを構築する幾つかの概念があります。一つずつ見ていきましょう。
Pipeline / Task / Step は、パイプラインを定義するための概念です。
Step
実行したいことの最小単位。コンテナ+コマンドを指定。
例えば、 kubectl が利用できるコンテナで、 $ kubectl apply -f ${inputs.params.path}
を指定すると、「特定のディレクトリに有るマニフェストを適用する Step 」を定義できます。
Task
Step の集合。CRDとして定義。
Task に含まれる Step は、順番に実行されます。また、Task に含まれる Step は、同じ k8s ノードで実行されます。
Task の中で使うリソースやパラメータは、inputs
と outputs
を利用して、 Task から切り出すことが可能です(Templating)。
Pipeline
Task の集合。CRDとして定義。
一つあるいは複数の Task を含み、それらでパイプラインとして定義します。 Task の実行順は、直列にしたり、並列にすることも可能なので、幾つかの Task が完了してから後続の Task を実行するという制御も可能です。
Task と異なり、Pipeline は複数の k8s ノードに渡って実行される可能性があります。
上記の 3 つの概念で、パイプラインの雛形を定義できましたので、次は「定義したパイプラインをどのように実行するか」を指定する CRD を見てみましょう。
TaskRun
Task を実行するためのリソースで、Task のインスタンスと言えます。nodeSelector
, tolerations
, affinity
を利用できるため、「クリティカルではない Task をプリエンプティブ VM で実行」「 GPU を使う Task を GPU 付きのノードで実行」といった制御も可能です。
PipelineRun
Pipeline を実行するためのリソースで、Pipeline のインスタンスと言えます。
PipelineResource
Task に対して渡すアーティファクトを定義するリソース。
2019 年 7 月時点で、以下のリソースがサポートされています。
- Git Resource
- Pull Request Resource
- Image Resource
- Cluster Resource
- Storage Resource
このリソースを使うことで、一つの Pipeline
で、異なる環境や、異なる git リポジトリに対して、一つの Pipeline
で CI / CD を定義することが可能となっています。
Tekton を動かしてみよう!
それでは、実際に Tekton を動かしてみましょう。インストール方法は、Installing Tekton Pipelines をご参照ください。
ここでは、flake8 を実行する Task
を作ってみます。今回は、2つのブランチに対して、 flake8 を実行する例にしてみます。ソースコードは、こちらで公開しています。
まず、Task を task-flake8.yaml
として定義します。ここでは、 Input
として、 git
の PipelineResource
を指定しています。
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: flake8
spec:
inputs:
resources:
- name: gitspace
type: git
steps:
- name: flake8
image: alpine/flake8
command: ["flake8"]
args: ["."]
次に、 PipelineResource
を定義します。今回は、master / with-error の、2つのブランチを指定します。
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: git-demo-tekton
spec:
type: git
params:
- name: revision
value: master # 異なるブランチを指定
- name: url
value: https://github.com/iwanariy/demo-tekton
---
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: git-demo-tekton-error
spec:
type: git
params:
- name: revision
value: with-error # 異なるブランチを指定
- name: url
value: https://github.com/iwanariy/demo-tekton
最後に、 TaskRun
を定義します。
apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
name: taskrun-flake8
spec:
inputs:
resources:
- name: gitspace
resourceRef:
name: git-demo-tekton # 異なる PipelineResource を指定
taskRef:
name: flake8
---
apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
name: taskrun-flake8-with-error
spec:
inputs:
resources:
- name: gitspace
resourceRef:
name: git-demo-tekton-error # 異なる PipelineResource を指定
taskRef:
name: flake8
$ kubectl apply
コマンドを使って順次実行していくと、以下のような実行結果を得ることができます。
$ kubectl get tr
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
taskrun-flake8 True Succeeded 2h 2h
taskrun-flake8-with-error False Failed 2h 2h
Tekton を使うことで、一つの Task
の定義で、複数の git リポジトリに対して CI を定義することができました。このように、チーム内での CI を標準化したり、Task
を部品として組み合わせてPipeline
を構築する、といった使い方もできます。
なお、Tekton CLI (tkn) を使うと、Tekton のリソースを確認する際に便利です。補完も備わっています。
$ tkn task
NAME AGE
flake8 1 hour ago$ tkn taskrun list
NAME STARTED DURATION STATUS
taskrun-flake8 1 hour ago 29 seconds Succeeded
taskrun-flake8-with-error 1 hour ago 26 seconds Failed$ tkn taskrun logs taskrun-flake8-with-error
[step-flake8] ./gitspace/src/sample.py:1:1: E265 block comment should start with '# 'container step-flake8 has failed : Error
まとめ
本記事では、Tekton の基本的な概念と簡単な Task
をご紹介しました。
Tekton は、2019 年 7 月時点で v0.5.2 と、まだまだ新しいプロダクトです。GitHub リポジトリにロードマップが公開されていますので、定期的にチェックしていきたいと思います!