Skip to content

CI/CD Adapterの作成

本章では、Qmonus Value Streamにおいて、CI/CD Adapterを作成し、既存のAssemblyLineにPipeline/Taskを追加します。

本チュートリアルを実施する前に、Getting Started(GCP / Azure)が完了していることをご確認ください。また、TektonのTaskおよびPipelineのスキーマ知識を前提としますので、随時参照してください。

なお、GCPについては(~2023/06) 初めてのQmonus Value Stream ~GCP編~を前提とします。

流れは以下の通りです。

  • CI/CD AdapterのTask定義とPipeline定義を作成し、Tekton Pipeline/Taskを生成します。
  • 生成したPipeline/Taskを含めるように、AssemblyLineを修正します。
  • 修正したAssemblyLineを実行し、CI/CD Adapterで定義したnginxサーバへのヘルスチェックが、Qmonus Value StreamのTask上で行われていることを確認します。

1. CI/CD Adapterの作成(CLI)

Getting Started(GCP / Azure) で作成した持ち込みのプライベートリポジトリを使用してCI/CD Adapterを作成します。 CI/CD AdapterはTekton Pipeline/Taskの構造と同様に、Task定義箇所とPipeline定義箇所に分かれているので、それぞれを作成します。

Task定義の作成

CI/CD AdapterのTask定義はTekton Taskに相当します。ここでは、nginxサーバのグローバルIPアドレスを受け取り、curlコマンドでヘルスチェックするTask定義: curlHealthCheckTaskを作成します。

bash
# ローカルリポジトリへ移動
cd applications-qvs-demo

# 本チュートリアル用のブランチをgetting-startedブランチから作成
git checkout -b cicd-adapter-creation getting-started

# 作業ディレクトリへ移動
cd .valuestream

# CI/CD Adapter Task定義用ディレクトリを作成する
mkdir -p pipeline/tasks

# CI/CD AdapterのTask定義を作成する
vim pipeline/tasks/curlHealthCheckTask.cue
go
package curlHealthCheckTask

import (
	"qmonus.net/adapter/official/pipeline/schema"
)

#Builder: schema.#TaskBuilder
#Builder: {
	name: "curlHealthCheckTask"

    params: {
      ipAddress: desc: "Global ipaddress of a deploy resource"
    }

	steps: [{
		name:  "curl-health-check"
		image: "curlimages/curl"
		script: """
			#!/usr/bin/env sh
			# HTTPステータスコードが200以外ならTaskが失敗する
			curl --fail $(params.ipAddress):8080
			"""
	}]
}

Pipeline定義の作成

CI/CD AdapterのPipeline定義はTekton Pipelineに相当します。作成したTask定義: curlHealthCheckTaskを指定してTekton Pipelineを出力できるPipeline定義: curlHealthCheckPipelineを作成します。

bash
# CI/CD Adapter Pipeline定義用ディレクトリを作成する
mkdir pipeline/sample

# CI/CD AdapterのPipeline定義を作成する
vim pipeline/sample/curlHealthCheckPipeline.cue
go
package curlHealthCheckPipeline

import (
	"github.com/qmonus/sample/pipeline/tasks:curlHealthCheckTask"
)

DesignPattern: {
	name: "sample:curlHealthCheck"

	pipelines: {
		"curl-health-check-after-resolve-ip-address": {
			tasks: {
				// 先に作ったcurlHealthCheckTaskパッケージの#Builderスキーマを指定する
				"curl-health-check": curlHealthCheckTask.#Builder
			}
		}
	}
}

2. QVS Configの修正(CLI)

作成したCI/CD Adapterをコンパイルできるように、QVS Configを以下のように修正します。

yaml
vim qvs.yaml

[...]
designPatterns:
[...]
 - pattern: qmonus.net/adapter/official/pipeline/sample:resolveIPAddress
+  - pattern: github.com/qmonus/sample/pipeline/sample:curlHealthCheckPipeline
yaml
params:
  - name: k8sNamespace
    type: string
  - name: imageName
    type: string
modules:
  - name: github.com/qmonus/sample
    local:
      path: . # relative path to qvs.yaml

designPatterns:
  - pattern: github.com/qmonus/sample/local
    params:
      k8sNamespace: $(params.k8sNamespace)
      imageName:    $(params.imageName)
  - pattern: qmonus.net/adapter/official/pipeline/deploy:simple
  - pattern: qmonus.net/adapter/official/pipeline/sample:resolveIPAddress
  - pattern: github.com/qmonus/sample/pipeline/sample:curlHealthCheckPipeline

3. Pipeline Manifestの生成および登録 (CLI)

作成したCI/CD Adapterを指定したQVS ConfigからPipeline Manifestを生成し、Qmonus Value Streamへ登録します。

bash
# CI/CD Adapterをコンパイルする
qvsctl pipeline compile -m . -c qvs.yaml --prefix nginx-demo

# Project Nameを取得する
qvsctl project list

# Tekton Pipeline/Task ManifestをApplyする
qvsctl pipeline apply -p ${projectName} -f output/manifests.yml

4. AssemblyLineの修正と登録(CLI)

ApplyしたPipelineを実行できるように、AssemblyLineを修正します。ここでは、resolve-ip-addressから受け取ったnginxのグローバルIPアドレスに対して、ヘルスチェックしています。

bash
# assemblyline-staging.yamlを編集する
vim assemblyline-staging.yaml
yaml
apiVersion: vs.axis-dev.io/v1
kind: AssemblyLine
metadata:
  name: staging-deploy
spec:
  params:
    - name: gitRevision
      type: string
    - name: imageName
      type: string
  stages:
    - name: deploy
      spec:
        pipeline: nginx-demo-deploy
        deployment:
          app: nginx-demo
          name: staging
        params:
          - name: gitRevision
            value: $(inputs.gitRevision)
          - name: imageName
            value: $(inputs.imageName)
    - name: resolve-ip-address
      spec:
        pipeline: nginx-demo-resolve-ip-address-after-deploy
        deployment:
          app: nginx-demo
          name: staging
      runAfter:
        - deploy
+    - name: curl-health-check
+      spec:
+        pipeline: nginx-demo-curl-health-check-after-resolve-ip-address
+        deployment:
+          app: nginx-demo
+          name: staging
+        params:
+          - name: ipAddress
+            value: $(stages.resolve-ip-address.results.ipAddress)
+      runAfter:
+        - resolve-ip-address
yaml
apiVersion: vs.axis-dev.io/v1
kind: AssemblyLine
metadata:
  name: staging-deploy
spec:
  params:
    - name: gitRevision
      type: string
    - name: imageName
      type: string
  stages:
    - name: deploy
      spec:
        pipeline: nginx-demo-deploy
        deployment:
          app: nginx-demo
          name: staging
        params:
          - name: gitRevision
            value: $(inputs.gitRevision)
          - name: imageName
            value: $(inputs.imageName)
    - name: resolve-ip-address
      spec:
        pipeline: nginx-demo-resolve-ip-address-after-deploy
        deployment:
          app: nginx-demo
          name: staging
      runAfter:
        - deploy
    - name: curl-health-check
      spec:
        pipeline: nginx-demo-curl-health-check-after-resolve-ip-address
        deployment:
          app: nginx-demo
          name: staging
        params:
          - name: ipAddress
            value: $(stages.resolve-ip-address.results.ipAddress)
      runAfter:
        - resolve-ip-address
  results:
    - name: ipAddress
      value: $(stages.resolve-ip-address.results.ipAddress)
bash
# AssemblyLineをApplyする
qvsctl pipeline apply -p ${projectName} -f assemblyline-staging.yaml

# リモートリポジトリにpushする
git add --all
git commit -m "CI/CD Adapter Creation QVS Tutorial"
git push origin cicd-adapter-creation

5. AssemblyLineの実行 (GUI)

修正したAssemblyLineを実行します。

  1. 左メニューより、AssemblyLineを選択します。
  2. 画面中央に表示される staging-deploy を選択します。
  3. 以下のInput Parameterを入力し、 RUN ボタンを押下してCI/CDを開始します。imageNameは、初めてのQmonus Value Stream のチュートリアルの進行度合によって要求されない場合があります。
    • gitRevision: cicd-adapter-creation
    • imageName(必要な場合のみ): nginx:latest

6. Taskの実行ログ確認(GUI)

AssemblyLine実行後、Taskの実行ログを確認し、nginxのHTMLコンテンツが取得できていることを確認します。 AssemblyLineの実行ログの確認方法を参考に、nginx-demo-curl-health-check Taskのstep-curl-health-check Step の実行ログを参照してください。 以下のように、curlコマンドで取得したHTMLコンテンツのタイトルとして、Welcome to nginx!と表示されていることが確認できます。

Taskの実行ログ確認(GUI)

解説

作成したCI/CD Adapterの構造について解説します。

CI/CD Adapter Task定義

Task定義の作成で作成したcurlHealthCheckTask.cueを解説します。

go
import (
	"qmonus.net/adapter/official/pipeline/schema"
)

#Builder: schema.#TaskBuilder

import しているschemaパッケージは、#Builderスキーマに必要な、Task定義でサポートされているパラメータを定義しています。 このパッケージはqvsctl adapter getコマンド実行時にOfficial Cloud Native Adapterの一部としてcue.mod配下にダウンロードされます。 Task定義でschemaを指定することで、サポートされていないスキーマがTask Manifestとして出力されることを防ぐことができます。Task定義では常にschemaを指定してください。

CI/CD Adapter Pipeline定義

Pipeline定義の作成で作成したcurlHealthCheckPipeline.cueを解説します。

go
pipelines: {
		"curl-health-check-after-resolve-ip-address": {
			tasks: {
				"curl-health-check": curlHealthCheckTask.#Builder
			}
		}
	}

ここでは、Pipeline上でcurl-health-checkと指定されるTekton TaskとTask定義であるcurlHealthCheckTaskパッケージの#Builderを紐づけています。 紐づけることで、そのTaskをcurl-health-check-after-resolve-ip-addressという名前のPipelineのspec.tasksおよび spec.tasks.taskRef フィールドで指定されるようになります。spec.tasks[].nameではPipeline定義で指定されるTask名を、spec.tasks[].taskRef.nameではTask定義のnameで指定されるTask名がそれぞれ入ります。以下にoutputとなるTekton Pipelineの一部を記載します。

yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: nginx-demo-curl-health-check-after-resolve-ip-address # コンパイル時に指定したnginx-demoというプレフィックスが付与されていることに注意
spec:
[...]
  tasks:
    - name: curl-health-check # Pipeline定義で指定されるTask名
      taskRef:
        name: nginx-demo-curlHealthCheckTask # Task定義で指定されるTask名、別途プレフィックスが付与されている

qvsctl pipeline compile コマンド実行時は、Pipeline定義のDesignPattern.pipelinesフィールド以下で指定されているTask定義を元に、Tekton Pipeline/Taskとして一度に出力されます。