Skip to content

商用環境への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の登録も併せて行います。

  1. Application一覧より、 nginx-demo Applicationを選択します。
  2. 画面右上の NEW DEPLOYMENT ボタンを押下します。
  3. 各フォームに以下の値を入力し、画面右下の 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を特定できるエイリアス名を付与してください。

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から確認します。

  1. 左メニューより、AssemblyLineを選択します。
  2. 画面中央に表示される production-deploy を選択します。
  3. AssemblyLineと構成するPipeline Stagesが表示されることを確認します。
  4. Pipeline Stagesに表示されている deploy-preview カードを選択します。
  5. 利用されるパラメータ一覧が表示されることを確認します。
    • 未設定のパラメータk8sNamespaceが赤く表示されることを確認します。

8. Deployment Configの登録 (GUI)

AssemblyLine詳細画面より、不足しているパラメータ(デプロイ先のKubernetes Namespace)を設定します。ここでは手順1で作成したNamespaceを指定します。

  1. 画面右に表示される Edit Deployment Config リンクを選択します。
  2. YAMLモードのEditorが表示されますので、デプロイ先のKubernetes Namespace情報をYAML形式で入力します。
    • Key: k8sNamespace
    • Value: production
      yaml
      k8sNamespace: production
  3. Saveボタンを押下し、更新後のパラメータ一覧全てが緑で表示されていることを確認します。
    • 赤く表示されているパラメータがある場合、足りないパラメータがあるため、AssemblyLineを実行できません。

9. Promotionの設定 (GUI)

AssemblyLineの実行結果であるAssemblyLine Resultsを引き継いで、別のAssemblyLineを流す設定であるPromotionを設定します。 ここでは、検証環境でビルド・デプロイしたイメージをそのまま利用し、商用環境にデプロイするために、Promotionを設定します。

  1. 左メニューより、AssemblyLineを選択します。
  2. 画面中央に表示されるAssemblyLine: staging-deploy を選択します。
  3. 画面右上のSETTINGSボタンを押下します。
  4. 各フォームに以下の値を入力し画面右下のSAVEボタンを押下します。Inputs Parameterの設定についてはそれぞれプルダウンメニューから選択します。
    • Promotion To : production-deploy
    • Results to Inputs Parameter Binding
      • gitRevision : gitRevision
      • imageName : imageName

10. Promotionの実行 (GUI)

AssemblyLineより実際にPromotionを行います。

  1. 左メニューより、AssemblyLineを選択します。
  2. 画面中央に表示される AssemblyLine: staging-deploy を選択します。
  3. 画面中央にあるHISTORYタブを選択します。
  4. 成功している実行結果の右側にあるPROMOTEボタンを押下します。
  5. 表示されたポップアップのInput Parametersに値が入力されていることを確認し、右下のPROMOTEを押下します。
  6. AssemblyLine: production-deployRunning状態になっていることを確認します。

11. Confirmationの確認

Promotionを行った後、Resultsの画面にて30秒ほど経過すると、Pipelines(Stage)deploy-preview の右上に目のマークのアイコンが出ていることを確認します。

商用環境へのPromotion手順

そして、下の Timeline の deploy-preview を押し、その中の step-deploy-preview を押し、step-deploy-previewのログを表示させます。

商用環境へのPromotion手順

step-deploy-previewのログの中に今回のアプリケーションの構成が表示されていることを確認します。

商用環境へのPromotion手順

その後処理が approval-deploy-preview から進まないことを確認し、 Pipelines(Stage) を押下すると、 Pipeline の詳細である Pipeline Tasks が現れることを確認します。その中から目のマークが付与されている approval-deploy-preview のTaskを押下します。

商用環境へのPromotion手順

押下後、Approval Request のポップアップが現れるので、 APPROVE を押下し、以降の処理を進めることを承諾します。

商用環境へのPromotion手順

その後、全ての処理が完了することを確認します。

12. デプロイされたリソースの確認 (CLI/GUI)

  1. AssemblyLineの実行が完了した後、アプリケーションクラスタへkubectlコマンドを実行し、検証環境とは別にPodが作成されていることを確認します。

    bash
    # kubectl のコンテキストがアプリケーションクラスタであることを確認
    kubectl config get-contexts
    CURRENT     NAME    ...
      *アプリケーションクラスタ    ...
    ...
    # podの確認 Namespaceは手順1で作成したものを指定してください
    kubectl get pod -n production
  2. ブラウザからデプロイされたアプリケーションへアクセスできるかを確認します。 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 という既存のパイプラインの CompileDeploy の間に 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のログが表示され、そのログの中で構成の変更点を確認できます。

商用環境へのPromotion手順

以下の例では、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 のログ
商用環境へのPromotion手順
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