Appearance
解説
こちらではチュートリアルでは詳細に説明できなかった事項を解説します。
デプロイに必要なリソース
今回のチュートリアルでは、手順2-1 にて AssemblyLine を実行するために、以下 4 つのリソースを作成しました。
- Application
- Repository
- Environment
- Deployment
この章ではこの4つのリソースについて解説します。
Application
Qmonus Value Stream によってデプロイするアプリケーションの情報を管理するリソースです。 Application は、1 つの Repository の情報を持ちます。 今回のチュートリアルでは、Nginx を用いたサンプルアプリケーションの情報を登録しています。
Repository
アプリケーションのソースコードが格納されているGitリポジトリの情報を管理するリソースです。
Environment
Application のデプロイ先となる環境を定義したリソースです。 Provisioning Target を指定することで、デプロイ先の環境を定義します。 今回のチュートリアルでは、Provisioning Target として、持ち込みの Kubernetes クラスタを指定しました。
Deployment
「どのアプリケーションを、どの環境にデプロイするのか」を定義するリソースです。 1 つの Application と 1 つの Environment から構成されます。 今回のチュートリアルでは、「Nginx を用いたサンプルアプリケーションを、持ち込みの Kubernetes クラスタにデプロイする」という情報を持ちます。
リソースの関係性
リソース同士の関係をまとめると、以下のようになります。
Project
└── Deployment
├── Application
│ └──Repository
└── Environment
QVS Config
QVS Config とは
チュートリアルリポジトリの紹介 で、QVS Config について「Qmonus Value Stream によって実行したい CI/CD 処理(Pipeline)を宣言するファイル」と説明しました。 簡単化のためにこのように説明したため、こちらで詳しく説明します。
より正確に説明すると、QVS Config とは、「Cloud Native Adapter」とそのパラメータを指定する Qmonus Value Stream の設定ファイルです。Application 毎に作成し、各 Application の Repository に配置して、Qmonus Value Stream から読み込んで使用します。
Qmonus Value Stream は、QVS Config を読み込むことで、QVS Config で宣言されている Cloud Native Adapter に基づいた CI/CD 処理を実現します。
Cloud Native Adapter とは
Cloud Native Adapter とは、アプリケーションをクラウド基盤上で動作させるためのシステム構成や CI/CD パイプラインを再利用可能な形でパッケージした、Qmonus Value Stream 独自の仕組みです。
本来、アプリケーションをクラウド基盤上にデプロイするための CI/CD パイプラインを構築するには、クラウドインフラストラクチャをデプロイするパイプライン、アプリケーションをビルド・デプロイするパイプラインといった複数のパイプラインが必要になりますが、Qmonus Value Stream では、ユーザが CI/CD パイプラインを構築するための探索・検証コストを軽減できるように、最適な CI/CD パイプラインをまとめたパッケージを Official Cloud Native Adapter として提供しています。
これを利用することで、ユーザは自分で複雑な CI/CD パイプラインを構築するためのコストを負担しなくとも、Cloud Native Adapter を指定して必要なパラメータを設定するだけで、クラウドインフラストラクチャやアプリケーションをデプロイする CI/CD パイプラインを構築できます。
Qmonus Value Stream が提供している Official Cloud Native Adapter とその機能の詳細については、Official Cloud Native Adapter 公式ドキュメント を参照してください。
QVS Config の内容
今回のチュートリアルで使用した QVS Config( qvs.yaml
)の記載内容を確認してみましょう。 QVS Config の内容は以下になります。
yaml
params:
- name: k8sNamespace
type: string
- name: imageName
type: string
modules:
- name: github.com/qmonus/official-cloud-native-adapters
revision: v0.20.0
designPatterns:
- pattern: qmonus.net/adapter/official/kubernetes/deployment/simple
params:
k8sNamespace: $(params.k8sNamespace)
imageName: $(params.imageName)
appName: nginx-demo
port: "80"
replicas: "1"
- pattern: qmonus.net/adapter/official/kubernetes/sample:loadbalancer
params:
k8sNamespace: $(params.k8sNamespace)
appName: nginx-demo
port: "80"
- pattern: qmonus.net/adapter/official/pipeline/deploy:simple
- pattern: qmonus.net/adapter/official/pipeline/sample:resolveIPAddress
QVS Config は、以下の 3 つのフィールドに分かれています。
params
params
フィールドでは、Cloud Native Adapter の引数として設定するパラメータの一覧を宣言します。宣言する内容は、パラメータ名とパラメータの型になります。 今回は、パラメータとして k8sNamespace
と imageName
を宣言し、Cloud Native Adapter の引数として渡せるように設定しています。
modules
modules
フィールドでは、利用したい Cloud Native Adapter が存在するリモートリポジトリの情報を指定します。 具体的には、利用したいリポジトリの URL とバージョンを指定します。
今回は、Qmonus Value Stream が提供する Official Cloud Native Adapter を利用するため、Official Cloud Native Adapter のリポジトリの情報を設定しています。
designPatterns
designPatterns
フィールドでは、modules
で指定したリポジトリで使用したい Cloud Native Adapter と、その Cloud Native Adapter に渡すパラメータを指定します。
Cloud Native Adapter に渡すパラメータには、固定値だけでなく params
で宣言したパラメータも設定できます。 params
で宣言したパラメータを指定する場合は $(params.パラメータ名)
のように記述します。 params
で宣言したパラメータを利用することで、AssemblyLine を実行する際に、パラメータの値を柔軟に変更して実行できるようになります。
今回は、以下の 4 つの Official Cloud Native Adapter と、それぞれに必要なパラメータを指定しています。
qmonus.net/adapter/official/kubernetes/deployment/simple
- Kubernetes の Deployment リソースを作成する Cloud Native Adapter。
- パラメータ:
- k8sNamespace:
$(params.k8sNamespace)
- imageName:
$(params.imageName)
- appName:
nginx-demo
#固定値 - port:
"80"
#固定値 - replicas:
"1"
#固定値
- k8sNamespace:
qmonus.net/adapter/official/kubernetes/sample:loadbalancer
- Kubernetes の Service リソースを作成して、クラウドプロバイダのロードバランサを用いて外部公開する Cloud Native Adapter。
- パラメータ:
- k8sNamespace:
$(params.k8sNamespace)
- appName:
nginx-demo
#固定値 - port:
"80"
#固定値
- k8sNamespace:
qmonus.net/adapter/official/pipeline/deploy:simple
- アプリケーションをデプロイする CI/CD パイプライン(Pipeline/Task)を作成する Cloud Native Adapter。
- 今回は、上述の Cloud Native Adapter によって作成される Kubernetes の Deployment リソースと Service リソースを Kubernetes クラスタにデプロイします。
qmonus.net/adapter/official/pipeline/sample:resolveIPAddress
- デプロイされた Service リソースのグローバル IP アドレスを取得して、AssemblyLine 上で参照できるようにする CI/CD パイプライン(Pipeline/Task)を作成する Cloud Native Adapter。
各 Official Cloud Native Adapter において設定できるパラメータについては、Official Cloud Native Adapter 公式ドキュメント を参照してください。
QVS Config のコンパイルと Pipeline/Task の登録
QVS Config で宣言した Cloud Native Adapter に基づく CI/CD パイプラインを Qmonus Value Stream で使用するには、QVS Config を「コンパイル」する必要があります。
具体的には、手順3-1 における COMPILE
ボタンを押下することで、QVS Config がコンパイルされます。
QVS Config をコンパイルすると、Cloud Native Adapter としてパッケージされている CI/CD パイプライン(Pipeline と Task)が生成されます。この Pipeline/Task を Qmonus Value Stream に「登録」することで、Qmonus Value Stream 上で Pipeline/Task を使用できるようになります。
具体的には、手順3-1 における APPLY
ボタンを押下することで、Pipeline/Task が Qmonus Value Stream に登録されます。
このようにして登録した Pipeline を組み合わせることで、さまざまな CI/CD 処理を実現する AssemblyLine を構築できるようになります。
AssemblyLine
AssemblyLine とは
AssemblyLine とは、Pipeline を直列・並列に組み合わせた CI/CD 処理のワークフローです。 今回のチュートリアルで説明したように、AssemblyLine は複数の Pipeline から構成され、Pipeline は複数の Task から構成されています。 つまり、AssemblyLine、Pipeline、Task は、以下のような親子関係になっています。
AssemblyLine
├── Pipeline(A)
│ ├──Task
│ │ ├──Step
│ │ ├──Step
│ └──Task
│ ├──Step
│ └──Step
└── Pipeline(B)
├──Task
│ ├──Step
│ ├──Step
└──Task
├──Step
└──Step
AssemblyLine は Pipeline の処理を繋げるだけでなく、Pipeline と Task の実行パラメータを解決する役割も担います。 例えば、AssemblyLine が受け取ったパラメータを Pipeline や Task に渡したり、実行が完了したPipeline の実行結果を次の Pipeline のパラメータとして渡したりできます。
AssemblyLine の登録方法
AssemblyLine は、手順3-2 でリポジトリのassemblyline-staging.yaml
から登録したように、AssemblyLine の定義が記述された YAML ファイル(AssemblyLine マニフェスト)を用いて登録します。
AssemblyLine のパラメータ
AssemblyLine で使用したいパラメータを AssemblyLine マニフェストで定義することで、AssemblyLine 詳細画面の Input Parameters でパラメータを設定して AssemblyLine の実行時に渡すことができます。 さらに、受け取ったパラメータを Pipeline に渡すことも可能です。
AssemblyLine マニフェストの内容
今回のチュートリアルで使用した AssemblyLine マニフェストの内容を確認してみましょう。 AssemblyLine マニフェストの内容は以下になります。
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
results:
- name: ipAddress
value: $(stages.resolve-ip-address.results.ipAddress)
AssemblyLine マニフェストは、以下の 4 つのパートに分かれています。
メタデータの定義
AssemblyLine マニフェストでは、ファイルの先頭で以下のように AssemblyLine のメタデータを記述します。
yaml
apiVersion: vs.axis-dev.io/v1
kind: AssemblyLine
metadata:
name: staging-deploy
apiVersion
と kind
の値は固定です。
metadata.name
に、登録したい AssemblyLine の名称を設定します。 今回の AssemblyLine では、AssemblyLine の名称は staging-deploy
になります。
パラメータの定義
spec.params
で、AssemblyLine の Input Parameters として設定できるようにしたいパラメータを宣言します。 宣言する内容は、パラメータ名とパラメータの型になります。
ワークフローの定義
spec.stages
で、AssemblyLine を構成する Pipeline を定義します。
今回は、deploy
という名称の Pipeline と resolve-ip-address
という名称の Pipeline を記述しています。 また、各 Pipeline には、以下のフィールドを設定できます。
spec.stages[i].spec.pipeline
(必須)- 利用する Pipeline の名称を指定します。
- 今回は、手順3-1 で登録した Pipeline の名称を指定します。
spec.stages[i].spec.deployment
(必須)- Pipeline に紐づけたい Deployment および Application の名称を指定します。
- この設定により、Deployment Config のパラメータを Pipeline に注入できるようになります。
- 今回は、手順2-2 で登録した Deployment および Application の名称を指定します。
- Pipeline に紐づけたい Deployment および Application の名称を指定します。
spec.stages[i].spec.params
(任意)- Pipeline に渡したいパラメータの情報を指定します。
spec.params
で宣言した Input Parameters を使用したい場合は、$(inputs.パラメータ名)
と指定します。
- Pipeline に渡したいパラメータの情報を指定します。
spec.stages[i].runAfter
(任意)- Pipeline の実行順序を制御するために指定します。どの Pipeline の後に処理をするかを記述します。
- 今回は、
resolve-ip-address
Pipeline よりも先にdeploy
Pipeline が実行され、Service リソースがデプロイ済みの状態になっている必要があるため、resolve-ip-address
Pipeline のrunAfter
にdeploy
を指定します。
実行結果の定義
spec.results
で、AssemblyLine の実行結果として出力したいパラメータを定義します。この実行結果を AssemblyLine Results と呼称します。
今回は、resolve-ip-address
Pipeline が Service リソースのグローバル IP アドレスを ipAddress
というパラメータ名で取得・出力できるため、resolve-ip-address
Pipeline の実行結果から取得した ipAddress
の値を AssemblyLine Results として出力するように設定しています。
Results について
Pipeline が出力するパラメータについては、Official Cloud Native Adapter のドキュメントに記載されているので、参考にしてください。
AssemblyLine の実行時の動き
ここでは、手順4-1 で実行した AssemblyLine の実行時の動きを解説します。 なお、AssemblyLine と Pipeline は以下のように設定されています。
markdown
AssemblyLine
├── Pipeline(deploy)
└── Pipeline(resolve-ip-address)
AssemblyLine に渡すパラメータ
gitRevision
(アプリケーションのリポジトリにおけるコミットのハッシュ値、またはブランチ名、またはタグ名)imageName
(アプリケーションとしてデプロイする Docker イメージの名前)
この 2 つのパラメータは、AssemblyLine を実行するたびに値を変えることになる可能性があるパラメータのため、値を設定しやすいように、AssemblyLine の Input Parameters から設定するようにしています。
Pipeline(deploy) に設定が必要なパラメータ
gitRevision
(アプリケーションのリポジトリにおけるコミットのハッシュ値、またはブランチ名、またはタグ名)imageName
(アプリケーションとしてデプロイする Docker イメージの名前)
AssemblyLine の Input Parameters から設定したパラメータを Pipeline に渡すようにしています。
Pipeline(resolve-ip-address) に設定が必要なパラメータ
Pipeline が必要とするパラメータがないため、ここではパラメータは設定していません。
1. AssemblyLine に紐づけられた Deployment を読み込む
AssemblyLine を実行すると、AssemblyLine は 手順2-2 で登録した Deployment を読み込みます。
2. パラメータを読み込む
以下のパラメータを読み込み、Pipeline で使用できるようにします。
- AssemblyLine の Input Parameters から設定されたパラメータ
- ここでは、
gitRevision
とimageName
を読み込みます。
- ここでは、
- Deployment Config から設定されたパラメータ
- Deployment Config とは、Deployment に対して定義可能な Key-Value 形式のパラメータです。AssemblyLine 詳細画面の各 Pipeline Stages のカードを押下すると表示される
EDIT DEPLOYMENT CONFIG
ボタンから設定できます。
- Deployment Config とは、Deployment に対して定義可能な Key-Value 形式のパラメータです。AssemblyLine 詳細画面の各 Pipeline Stages のカードを押下すると表示される
3. Pipeline(deploy)を実行する
AssemblyLine は、設定されたパラメータを渡して Pipeline を実行します。
deploy
Pipeline の実行が完了すると、Environment で指定した Kubernetes クラスタに、imageName
で指定したコンテナイメージに基づく Deployment リソースと Service リソースがデプロイされます。
4. Pipeline(resolve-ip-address)を実行する
Pipeline の実行が完了すると、次の Pipeline が実行されます。
resolve-ip-address
Pipeline の実行が完了すると、Kubernetes クラスタにデプロイされた Service リソースのグローバル IP アドレスが取得され、AssemblyLine 上で参照できるようになります。
5. AssemblyLine の実行が完了する
AssemblyLine を構成するすべての Pipeline の実行が完了すると、AssemblyLine の実行が完了します。
AssemblyLine は、resolve-ip-address
Pipeline によって取得された IP アドレスを AssemblyLine Results として出力します。