OpenShift Pipelines(Tekton)を試してみた 

OpenShift Pipelines(Tekton)を試してみたので、その経験をここに書きます。
試した環境は、OpenShift 4.6です。

## OpenShift Pipelines とは
注意：OpenShift Pipeline は、OpenShift 4.6時点ではテクノロジープレビュー機能です。

OpenShift Pipeline は、TektonをOpenShift用に拡張したものです。Tektonは、Kubernetes上で、継続的インテグレーションおよび継続的デリバリー (CI/CD) を実現するOSSのフレームワークです。
Tektonでは、コンテナ・イメージがロードされ、コンテナ内でCD/CIタスクが実行されます。これによって、CD/CIタスク実現の機能とCD/CIを管理するための機能が分離されます。つまり、リリース・エンジニアは、CD/CIタスクのためのプラグインの管理やライブラリの管理から解放され、CD/DIタスクのためのプラグインやライブラリのバージョンの衝突や互換性で悩むことがなくなります。<

## openshift-pipelinesのインストール">OpenShift Pipelinesのインストール

インストール
OpenShift Pipeline は、OperatorHubから、インストールできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/45b1c415-b0c0-19c4-84b8-c69fdf14af76.png)

インストールすると、Open Shiftのメニューに、Pipelinesという項目が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/15cc56d3-b0f1-1af9-9e51-1d32ca3b6bfc.png)

Pipelinse配下の各メニューのスクリーンショットは下記です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/4c596709-a3db-3530-b848-b34b248438df.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/04aeced7-5f9d-1e56-b10a-fec3aeb57ecf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/6018ec41-e6b2-d751-48a8-889d8cc15cff.png)


## OpenShift Pipelinesの概念
大きく、以下のような概念があります。

- ステップ
- タスク
- パイプライン
- トリガー

ステップは、タスクに含まれる最小の作業単位です。コマンドラインや、スクリプトを記述します。このステップ単位に、基準となるイメージを指定します。つまり、ひとつのPodとして動作します。

タスクは、ひとつ、もしくは、複数のステップで構成されます。クラスター・タスクという事前に定義されたタスクがあり、それを利用することで実装時間を低減できます。クラスター・タスクの例として、Gitレポジトリーのクローン等です。タスク単位に実行することができます。タスクを実行するためには、Task Runというオブジェクトを作成します。

パイプラインは、複数のタスクで構成されます。パイプラインを実行するためには、Pipeline Runというオブジェクトを作成します。

トリガーは、パイプラインを起動するための条件を記述します。Gitレポジトリーに変更がPushされたら、パイプラインを起動する、ということを設定できます。

## OpenShift Pipelinesのサンプル
サンプルとして、以下のようなタスクを実現するパイプラインを作成します。
- Githubからソースコードをダウンロード
- 静的解析を実施
- Dockerイメージのビルド、および、Image Repositoryにプッシュ

#### "静的解析を実施するタスクのyaml-spec例">静的解析を実施するタスクのYAML Spec例

<!-- wp:paragraph -->
<p>このタスクでは、Dockerhubのshellcheckイメージを使用して、静的解析を実施します。</p>
<!-- /wp:paragraph -->

<!-- wp:syntaxhighlighter/code {"language":"yaml"} -->
<pre class="wp-block-syntaxhighlighter-code">spec:
  steps:
    - args:
        - sample.sh
      command:
        - /bin/shellcheck
      image: 'docker.io/koalaman/shellcheck:v0.7.1'
      name: shellcheck-step
      resources: {}
      workingDir: $(workspaces.output.path)
  workspaces:
    - name: output</pre>
<!-- /wp:syntaxhighlighter/code -->

<!-- wp:heading {"level":4} -->
<h4 id="githubからソースコードをダウンロードタスク-静的解析タスク-ビルドおよびプッシュタスクを含むパイプラインのyaml-spec例">Githubからソースコードをダウンロードタスク、静的解析タスク、ビルドおよびプッシュタスクを含むパイプラインのYAML Spec例</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Githubからのソースダウンロード、および、 ドおよびプッシュタスク は、クラスター・タスクを利用しています。</p>
<!-- /wp:paragraph -->

<!-- wp:syntaxhighlighter/code {"language":"yaml"} -->
<pre class="wp-block-syntaxhighlighter-code">spec:
  tasks:
    - name: git-clone
      params:
        - name: url
          value: >-
            https:&#47;&#47;github.com/example/sample.git
      taskRef:
        kind: ClusterTask
        name: git-clone
      workspaces:
        - name: output
          workspace: pipeline-ws1
    - name: shellcheck-task
      runAfter:
        - git-clone
      taskRef:
        kind: Task
        name: shellcheck-alpine-task
      workspaces:
        - name: output
          workspace: pipeline-ws1
    - name: build-image
      params:
        - name: TLSVERIFY
          value: 'false'
        - name: IMAGE
          value: >-
            image-registry.openshift-image-registry.svc:5000/example/sample
      runAfter:
        - shellcheck-task
      taskRef:
        kind: ClusterTask
        name: buildah
      workspaces:
        - name: source
          workspace: pipeline-ws1
  workspaces:
    - name: pipeline-ws1</pre>
<!-- /wp:syntaxhighlighter/code -->

<!-- wp:heading {"level":4} -->
<h4 id="pipeline-runのyaml-spec例">Pipeline RunのYAML spec例</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pipelineで使用するワークスペースを設定した Pipeline Runオブジェクトを作成して、保存すると、すぐにPipelineは実行されます。</p>
<!-- /wp:paragraph -->

<!-- wp:syntaxhighlighter/code {"language":"yaml"} -->
<pre class="wp-block-syntaxhighlighter-code">spec:
  pipelineRef:
    name: pipeline02
  serviceAccountName: pipeline02
  workspaces:
    - name: pipeline-ws1
      volumeClaimTemplate:
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 1Gi
        status: {}</pre>
<!-- /wp:syntaxhighlighter/code -->

<!-- wp:heading {"level":4} -->
<h4 id="pipeline-run-実行例">Pipeline Run 実行例</h4>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Pipeline Runの実行状況は、Open Shift上で、GUIで確認できます。</p>
<!-- /wp:paragraph -->

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/5469d72f-65c1-d851-0e24-f8083e43f31f.png)

##トリガー
トリガーを設定すると、下記のようなことを実現することができます。
- Githubが更新されたら、自動的にパイプラインを実行させる

Pipelineのメニューから、Add Triggerを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/ea009086-eee0-6c93-8a06-d418a30712f0.png)


GithubのPushをトリガーとする等の主要なトリガーは、事前に含まれています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/3e8eb555-a55a-c791-6857-a66ceaa0d4ee.png)


PipelineからTriggerを作成すると、以下のようなイベントリスナーが作成されます。これにより、イベントをリッスンするPodが作成されます。URLという項目は、WebhookのURLです。このURLを、Github等のWebhookに設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203516/acfb43e2-e82a-b1e8-a404-177f9204f664.png)


## まとめ
OpenShift Pipelinesを使用すると、GUIを通して、以下のような事を簡単に実現できます。

- Githubからソースコードをダウンロード
- 静的解析を実施
- コンテナ・イメージのビルド、および、Image Repositoryにプッシュ
- Githubが更新されたら、自動的にパイプラインを実行させる

OpenShift Pipelines のベースとなるTektonでは、コンテナ・イメージを使用して、タスクのステップを実行します。例えば、Gitコマンドを含むコンテナ、静的解析を行うコンテナ、コンテナ・イメージをビルドするコンテナです。この感覚が従来のCD･CIツールとは異なり、興味深い部分です。

細かい部分は割愛しておりますが、なにかの参考になれば幸いです。