Appearance
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を実行します。
- 左メニューより、AssemblyLineを選択します。
- 画面中央に表示される staging-deploy を選択します。
- 以下の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!
と表示されていることが確認できます。
解説
作成した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として一度に出力されます。