Appearance
商用環境へのPromotion
本章では、Qmonus Value Streamにおいて、検証環境(e.g. Staging)で動作検証済みのアプリケーションを商用環境へPromotionします。Promotionの動作イメージは、環境とAssemblyLineの推奨パターンを参考にしてください。
今回はチュートリアルのため、検証環境と商用環境で2つのクラスタを用意する代わりに、異なる2つのNamespaceをそれぞれ検証環境と商用環境と見立ててPromotionを行います。チュートリアルの流れは以下のとおりです。
- 検証環境のAssemblyLineをコピーし、商用環境のAssemblyLineを作成する。
- 検証環境で実行済みのAssemblyLineから商用環境のAssemblyLineへのPromotionを設定する。
- 商用環境へPromotionを行いデプロイされたリソースを確認する。
0. 事前準備: 検証環境にてアプリケーションのデプロイ
AssemblyLineの拡張で実行したAssemblyLineRun:staging-deploy
が存在していることを確認します。 存在しない場合は、先にAssemblyLineの拡張のチュートリアルを実施してください。
1. kubeconfigとNamespaceの作成 (CLI)
Getting Startedと同様にkubeconfigを作成し、Namespaceを用意します。
ここで、gcp_project_id
はGCP Project ID、cluster_name
はKubernetesクラスタ名、zone
はGKEのZone名を指定します。k8sNamespace
は、今回デプロイするKubernetes Namespace名です。本チュートリアルではproduction
という名前のNamespaceを作成します。
ここで指定したNamespace名は、以降の手順でCDパイプラインを実行する際に、実行パラメータとして使用されます。
bash
# 利用するKubernetesへ接続
gcloud --project=${gcp_project_id} container clusters get-credentials ${cluster_name} --zone ${zone}
# Kubeconfigの生成
qvsctl plugin gen-kubeconfig -n production -o output.production.kubeconfig.yaml
# KubeconfigをGitリポジトリの管理から除外
echo 'output.production.kubeconfig.yaml' >> /path/to/your/repository/.gitignore
手順通りに実行するとKubeconfigはoutput.production.kubeconfig.yaml
というファイルで生成されます。
2. Deploymentの登録 (GUI)
Getting Startedにてstaging
という名前でDeploymentを登録しました。 今回は商用環境へのデプロイを行うため新たにproduction
という名前のDeploymentを作成します。 本手順では、Environmentの登録も併せて行います。
- Application一覧より、
nginx-demo
Applicationを選択します。 - 画面右上の
NEW DEPLOYMENT
ボタンを押下します。 - 各フォームに以下の値を入力し、画面右下の
CREATE
ボタンを押下します。- Display Name: production
- Name: (Environment選択時に自動入力)
- Environment:
+ Create New Environment
を選択し、手順2-aに従いEnvironmentを作成- 注) Application単位で、同一Environmentを選択できません
- Credentials
- kubeconfig: 手順1で生成したKubeconfig
- 注) 生成したKubeconfigのテキストデータを、改行などを含めず全て貼り付けて登録します
2-a. Environmentの登録
Getting Startedの「プロジェクト/プロダクトに応じて任意の環境を定義してください。」との記載に倣って、今回は商用環境として新たにproduction
というEnvironmentを作成します。
各フォームに以下の値を入力し、画面右下のCREATE
ボタンを押下します。
- Display Name: production
- Description: (任意の文章または空白)
- Provisioning Target:
- Kind:
kubernetes
- DisplayName: Provisioning Targetを一意に指定できるNameやID
- Alias:(空白)
- 同じタイプのProvisioning Targetを複数登録する際は、2つ目以降については Aliasのフォームに そのProvisioning Targetを特定できるエイリアス名を付与してください。
- Kind:
- Provisioning Target:
3. QVS Configの編集 (CLI)
QVS Configを編集し、コンパイルするデザインパターンを指定しています。
bash
# ローカルリポジトリへ移動
cd applications-qvs-demo
# 現在のブランチを確認(前回のチュートリアルで使用したブランチであることを確認)
git branch --contains
* getting-started
# .valuestreamディレクトリに移動
cd .valuestream/
# vim でQVS Configを編集(エディタは使いなれたもので問題ありません)
vim qvs.yaml
QVS Config
deploy:preview
:deploy:simple
を拡張し、Checkout -> Compile -> Deploy Preview -> (Confirmation) -> Deploy
というようにApplication Manifestをデプロイする通常のパイプラインにDeploy Preview
+Confirmation
のTaskをつけ、デプロイ前に構成の変更点を確認できるようにしたパイプライン。商用環境へのデプロイでは、基本的にこのdeploy:preview
というパイプラインを用います。
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/build:buildkitGcp
- pattern: qmonus.net/adapter/official/pipeline/deploy:simple
+ - pattern: qmonus.net/adapter/official/pipeline/deploy:preview
- pattern: qmonus.net/adapter/official/pipeline/sample:resolveIPAddress
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/build:buildkitGcp
- pattern: qmonus.net/adapter/official/pipeline/deploy:simple
- pattern: qmonus.net/adapter/official/pipeline/deploy:preview
- pattern: qmonus.net/adapter/official/pipeline/sample:resolveIPAddress
4. Pipeline Manifestの生成および登録 (CLI)
手順3で編集したQVS Configを用いてPipeline Manifestを生成し、Qmonus Value Streamへ登録します。
projectName
はQmonus Value StreamのProject Nameです。Project Nameは、qvsctl project list
で取得したPROJECT NAME
を指定してください。
bash
# コンパイルする
qvsctl pipeline compile -m . -c qvs.yaml --prefix nginx-demo
# qvsctl auth コマンド使用して認証する(出力されたurlへアクセスしてください)
qvsctl auth
# Project Nameを取得する
qvsctl project list
# Pipeline Manifestを登録する
qvsctl pipeline apply -p ${projectName} -f output/manifests.yml
コンパイルを実行した際に4つのpipelinenginx-demo-build
,nginx-demo-deploy
,nginx-demo-deploy-preview
,nginx-demo-resolve-ip-address-after-deploy
と8つのtasknginx-demo-git-checkout
,nginx-demo-docker-login-gcp
,nginx-demo-buildkit
,nginx-demo-compile-design-pattern
,nginx-demo-deployment-worker
,nginx-demo-deployment-worker-with-preview
,approval
,nginx-demo-resolve-ip-address
が生成されることを確認してください。
5. AssemblyLineの編集 (CLI)
assemblyline-staging.yamlをコピーし、商用環境向けに内容を編集します。
bash
# assemblyline-staging.yamlをassemblyline-production.yamlという名前でコピーする
cp assemblyline-staging.yaml assemblyline-production.yaml
# assemblyline-production.yamlを編集する
vim assemblyline-production.yaml
- assemblyline-production.yaml
yaml
apiVersion: vs.axis-dev.io/v1
kind: AssemblyLine
metadata:
- name: staging-deploy
+ name: production-deploy
spec:
params:
- name: gitRevision
type: string
+ - name: imageName
+ type: string
stages:
- - name: build
- spec:
- pipeline: nginx-demo-build
- deployment:
- app: nginx-demo
- name: staging
- params:
- - name: gitRevision
- value: $(inputs.gitRevision)
- - name: cacheImageName
- value: $(params.imageRegistryPath)/$(params.imageShortName)
- - name: deploy
+ - name: deploy-preview
spec:
- pipeline: nginx-demo-deploy
+ pipeline: nginx-demo-deploy-preview
deployment:
app: nginx-demo
- name: staging
+ name: production
params:
- name: gitRevision
value: $(inputs.gitRevision)
- name: imageName
- value: $(stages.build.results.imageFullNameTag)
+ value: $(inputs.imageName)
- runAfter:
- - build
- name: resolve-ip-address
spec:
pipeline: nginx-demo-resolve-ip-address-after-deploy
deployment:
app: nginx-demo
- name: staging
+ name: production
- runAfter:
- - deploy
+ runAfter:
+ - deploy-preview
results:
- name: ipAddress
value: $(stages.resolve-ip-address.results.ipAddress)
- - name: imageName
- value: $(stages.build.results.imageFullNameTag)
- - name: gitRevision
- value: $(inputs.gitRevision)
yaml
apiVersion: vs.axis-dev.io/v1
kind: AssemblyLine
metadata:
name: production-deploy
spec:
params:
- name: gitRevision
type: string
- name: imageName
type: string
stages:
- name: deploy-preview
spec:
pipeline: nginx-demo-deploy-preview
deployment:
app: nginx-demo
name: production
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: production
runAfter:
- deploy-preview
results:
- name: ipAddress
value: $(stages.resolve-ip-address.results.ipAddress)
6. AssemblyLineの登録 (CLI)
手順5で作成したassemblyline-production.yamlを登録します。
bash
# Qmonus Value Streamから実行可能なDeploy stageを持つAssemblyLine
qvsctl pipeline apply -p ${projectName} -f assemblyline-production.yaml
git add、 git commit、 git pushを行い、リモートリポジトリに変更を反映します。
bash
# リモートリポジトリにpushする
git add --all
git commit -m "Promotion to Production Environment QVS Tutorial"
git push origin getting-started
7. AssemblyLineの確認 (GUI)
CLIで登録したAssemblyLineをGUIから確認します。
- 左メニューより、AssemblyLineを選択します。
- 画面中央に表示される
production-deploy
を選択します。 - AssemblyLineと構成するPipeline Stagesが表示されることを確認します。
- Pipeline Stagesに表示されている
deploy-preview
カードを選択します。 - 利用されるパラメータ一覧が表示されることを確認します。
- 未設定のパラメータ
k8sNamespace
が赤く表示されることを確認します。
- 未設定のパラメータ
8. Deployment Configの登録 (GUI)
AssemblyLine詳細画面より、不足しているパラメータ(デプロイ先のKubernetes Namespace)を設定します。ここでは手順1で作成したNamespaceを指定します。
- 画面右に表示される
Edit Deployment Config
リンクを選択します。 - YAMLモードのEditorが表示されますので、デプロイ先のKubernetes Namespace情報をYAML形式で入力します。
- Key: k8sNamespace
- Value: productionyaml
k8sNamespace: production
Save
ボタンを押下し、更新後のパラメータ一覧全てが緑で表示されていることを確認します。- 赤く表示されているパラメータがある場合、足りないパラメータがあるため、AssemblyLineを実行できません。
9. Promotionの設定 (GUI)
AssemblyLineの実行結果であるAssemblyLine Resultsを引き継いで、別のAssemblyLineを流す設定であるPromotionを設定します。 ここでは、検証環境でビルド・デプロイしたイメージをそのまま利用し、商用環境にデプロイできるよう設定します。
- 左メニューより、AssemblyLineを選択します。
- 画面中央に表示されるAssemblyLine:
staging-deploy
を選択します。 - 画面右上の
SETTINGS
ボタンを押下します。 - 各フォームに以下の値を入力し画面右下の
SAVE
ボタンを押下します。Inputs Parameterの設定についてはそれぞれプルダウンメニューから選択します。- Promotion To : production-deploy
- Results to Inputs Parameter Binding
- gitRevision : gitRevision
- imageName : imageName
10. Promotionの実行 (GUI)
AssemblyLineより実際にPromotionを行います。
- 左メニューより、AssemblyLineを選択します。
- 画面中央に表示される AssemblyLine:
staging-deploy
を選択します。 - 画面中央にある
HISTORY
タブを選択します。 - 成功している実行結果の右側にある
PROMOTE
ボタンを押下します。 - 表示されたポップアップの
Input Parameters
に値が入力されていることを確認し、右下のPROMOTE
を押下します。 - AssemblyLine:
production-deploy
がRunning
状態になっていることを確認します。
11. Confirmationの確認
Promotionを行った後、Resultsの画面にて30秒ほど経過すると、Pipelines(Stage)
の deploy-preview
の右上に目のマークのアイコンが出ていることを確認します。
そして、下の Timeline の deploy-preview
を押し、その中の step-deploy-preview
を押し、step-deploy-preview
のログを表示させます。
step-deploy-preview
のログの中に今回のアプリケーションの構成が表示されていることを確認します。
その後処理が approval-deploy-preview
から進まないことを確認し、 Pipelines(Stage)
を押下すると、 Pipeline の詳細である Pipeline Tasks が現れることを確認します。その中から目のマークが付与されている approval-deploy-preview
のTaskを押下します。
押下後、Approval Request のポップアップが現れるので、 APPROVE
を押下し、以降の処理を進めることを承諾します。
その後、全ての処理が完了することを確認します。
12. デプロイされたリソースの確認 (CLI/GUI)
AssemblyLineの実行が完了した後、アプリケーションクラスタへkubectlコマンドを実行し、検証環境とは別にPodが作成されていることを確認します。
bash# kubectl のコンテキストがアプリケーションクラスタであることを確認 kubectl config get-contexts CURRENT NAME ... *アプリケーションクラスタ ... ... # podの確認 Namespaceは手順1で作成したものを指定してください kubectl get pod -n production
ブラウザからデプロイされたアプリケーションへアクセスできるかを確認します。 AssemblyLine Resultsに表示されているIPアドレスへ自身のWEBブラウザからアクセスします。
http://${ipAddress}:8080
上記のアドレスへ自身のWEBブラウザからアクセスし、Hello, Qmonus Value Stream!!
と出力されたWEBページが閲覧できることを確認します。
上記を通して、Qmonus Value StreamのPromotion機能を用いて動作検証済みのアプリケーションを商用環境へデプロイできることを確認できました。
リソースの削除
チュートリアルで作成したリソースは、Getting Startedで作成したQVS ConfigのInfrastructure Adapterの定義をコメントアウトし、リモートリポジトリに変更を反映した後に、再度AssemblyLineを実行することで削除できます。詳しくは、デプロイしたリソースの削除を参照してください。
解説
Promotionの設定とAssemblyLine Resultsの関係について
Promotionの設定ではPromote To
でPromotion先の設定と、Results to Inputs Parameter Binding
で入力パラメータの連携設定できます。特に、Results to Inputs Parameter Binding
の設定では、Promotion元となるAssemblyLineで設定された AssemblyLine Resultsの値をPromotion先のAssemblyLineの入力パラメータとして利用できます。 これにより、今回のチュートリアルのように、検証環境でビルド・デプロイしたイメージを商用環境へのデプロイで利用する、といったケースの時に、間違ったイメージを利用するといったミスが起きなくなり、確実にパラメータを連携できます。
Confirmationについて
Cloud Native Adapterでは、既存のパイプラインのcueファイルに以下のように approvalRequired: true
を追加すると、CI/CDパイプラインにConfirmation
を追加できます。 以下の例では、 Checkout -> Compile -> Deploy
という既存のパイプラインの Compile
と Deploy
の間に Confirmation
のTaskを追加し、 Checkout -> Compile -> [Confirmation] -> Deploy
というパイプラインに拡張しています。
Diff
pipelines: {
"\(_stage)": {
tasks: {
"checkout": gitCheckout.#Builder
"compile": compileDesignPattern.#Builder & {
input: {
phase: _deployPhase
useDebug: _useDebug
}
runAfter: ["checkout"]
+ approvalRequired: true
}
"deploy": deploymentWorker.#Builder & {
input: {
phase: _deployPhase
}
runAfter: ["compile"]
}
}
}
}
Preview機能付きのDeployパイプラインについて
Cloud Native Adapterの deploy:preview
というパイプラインは、 Checkout -> Compile -> Deploy Preview -> (Confirmation) -> Deploy
の流れで、デプロイする前に Deploy Preview
で構成の変更点を確認し、承認行為(Confirmation)
を経て、デプロイできます。これにより、通常のデプロイフローに加え、承認要求を行うことが可能になります。 商用環境へのデプロイでは、基本的にこのdeploy:preview
というパイプラインを用います。 構成の変更点については、AssemblyLine実行後のResultsの画面にて、下の Timeline の deploy-preview
を押し、その中の step-deploy-preview
を押すことで、step-deploy-preview
のログが表示され、そのログの中で構成の変更点を確認できます。
以下の例では、step-deploy-preview
のログの中に、Imageが qvsazuretutorial.azurecr.io/qmonus-tutorial-gar/nginx-demo:v0.0.1
から qvsazuretutorial.azurecr.io/qmonus-tutorial-gar-go/nginx-demo-go:v0.0.1
に変更されているという差分が表示されています。
step-deploy-preview
のログ
20 ~省略~ [provider=urn:pulumi:vsdev-1584-isqduupp-nginx-demo-production-main::local::pulumi:providers:kubernetes::K8sProvider::767d9105-6197-489f-a745-2e35ca80366c]
21 ~省略~ ~ spec: {
22 ~省略~ ~ template: {
23 ~省略~ ~ spec: {
24 ~省略~ ~ containers: [
25 ~省略~ ~ [0]: {
26 ~省略~ ~ image: "qvsazuretutorial.azurecr.io/qmonus-tutorial-gar/nginx-demo:v0.0.1" => "qvsazuretutorial.azurecr.io/qmonus-tutorial-gar-go/nginx-demo-go:v0.0.1"
27 ~省略~ }
28 ~省略~ ]
29 ~省略~ }
30 ~省略~ }
31 ~省略~ }
32 ~省略~ Resources:
33 ~省略~ ~ 1 to update
34 ~省略~ 3 unchanged