Tekton ~ Kubernetes native pipeline resource ~

Yuki Iwanari
google-cloud-jp
Published in
8 min readJul 29, 2019

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

Pipeline / Task / Step は、パイプラインを定義するための概念です。

Step
実行したいことの最小単位。コンテナ+コマンドを指定。
例えば、 kubectl が利用できるコンテナで、 $ kubectl apply -f ${inputs.params.path}を指定すると、「特定のディレクトリに有るマニフェストを適用する Step 」を定義できます。

Task
Step の集合。CRDとして定義。
Task に含まれる Step は、順番に実行されます。また、Task に含まれる Step は、同じ k8s ノードで実行されます。
Task の中で使うリソースやパラメータは、inputsoutputsを利用して、 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 を実行する例にしてみます。ソースコードは、こちらで公開しています。

sample TaskRun

まず、Task を task-flake8.yamlとして定義します。ここでは、 Input として、 gitPipelineResource を指定しています。

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 リポジトリにロードマップが公開されていますので、定期的にチェックしていきたいと思います!

--

--

Yuki Iwanari
google-cloud-jp

Customer Engineer in Google Cloud. All views and opinions are my own.