Appearance
アプリケーションのコンテナイメージを作成する
本チュートリアルでは、自分のアプリケーションを、コンテナイメージとしてビルドする手順を解説します。 ビルドは、Official CI/CD Adapterの中からBuild pipelineを用いて、実行します。
Official CI/CD Adapterについて
Official CI/CD Adapterとは、CUE言語で記述された Qmonus Value Streamが提供するCI/CD機能を実装したAdapter群です。 様々なビルド方法やデプロイ方法を提供しており、組織の要件に合わせて選択・組み合わせて利用できます。 Official CI/CD Adapterの一覧については、Official Cloud Native Adapter 公式リポジトリから確認できます。
1. Gitリポジトリの準備
本チュートリアルは例として、任意のプライベートリポジトリを用いて、FlaskのHTTP APIサーバを作成します。 自分のアプリケーションで進める場合は、適宜読み替えてチュートリアルを進めてください。 まずアプリケーションコードを格納するためのリポジトリを用意し、自分の作業環境にCloneして、作業用ブランチを作成します。
bash
# リポジトリをCloneする
git clone <repository name url>
# ローカルリポジトリへ移動
cd <repository name>
# 本チュートリアル用のブランチをmainブランチから作成
git switch -c build-own-application main以降はこのリポジトリのルートディレクトリ配下で作業します。 まずWEBページへ出力するapp.pyを用意します。
bash
# app.pyを作成し、編集する(エディタは普段使用しているもので問題ありません)
vim app.pypy
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
message = os.environ.get('MESSAGE', 'helloworld')
return message
@app.route('/health')
def health():
return {'status': 'healthy'}, 200
if __name__ == '__main__':
print("Starting Flask app...")
app.run(debug=True, host='0.0.0.0', port=5000)次にrequirementsを用意します。
bash
# requirementsを作成し、編集する(エディタは普段使用しているもので問題ありません)
vim requirements.txttxt
flaskそして、pythonをベースイメージに利用したDockerfileを用意します。
bash
# Dockerfileを作成し、編集する(エディタは普段使用しているもので問題ありません)
vim DockerfileDockerfile
FROM python:3.14-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt
COPY . .
ENV MESSAGE="Hello from Qmonus Value Stream"
EXPOSE 5000
CMD ["python", "app.py"]2. QVS Configの編集 (CLI)
QVS Config(qvs.yaml)を編集し、コンパイルするCloud Native Adapterを指定していきます。
今回利用するBuild PipelineはOfficial CI/CD Adapterの中の以下のパターンを利用します。
build:buildkitGcp: Buildkitを用いたコンテナイメージビルドのパイプライン
まずは、QVS Configを格納するための.valuestreamディレクトリを作成し、その中にqvs.yamlを作成します。 .valuestreamディレクトリはQmonus Value Streamが利用するQVS ConfigやAdapterを格納するディレクトリです。 Qmonus Value Stream用のリソースであることを明確にするために作成を推奨しています。 以降のチュートリアルでは、.valuestreamディレクトリを作業ディレクトリとして進めていきます。
bash
# QVS Config(qvs.yaml)を作成し、編集する(エディタは普段使用しているもので問題ありません)
mkdir -p .valuestream
cd .valuestream
vim qvs.yamlyaml
modules:
# Official Cloud Native Adapterのモジュールを指定する。
- name: qmonus.net/adapter/official
designPatterns:
# 指定したモジュールからbuild:buildkitGcpのCloud Native Adapterを利用する。
- pattern: qmonus.net/adapter/official/pipeline/build:buildkitGcpこの時点でのフォルダ構成は以下のようになります。
<repository name>/
├── .valuestream/
│ └── qvs.yaml
├── app.py
├── Dockerfile
└── requirements.txtgit add、 git commit、 git pushを行い、リモートリポジトリに変更を反映します。
bash
# リモートリポジトリにpushする
git add --all
git commit -m "Build Own Application QVS Tutorial"
git push origin build-own-application3. Applicationの作成
続いて今回利用するApplicationを Qmonus Value Stream に登録します。 本手順では、Repositoryの登録も併せて行います。
- 左メニューより、Applicationを選択します。

- 画面右上の
NEW APPLICATIONボタンを押下します。 - 各フォームに以下の値を入力します。
Display Name:
flask-demoDescription: (任意の文章または空白)
QVS Config Repository:
+ Create New Repositoryを選択し、Repositoryの登録に従いRepositoryを作成します。(詳細は▶︎Repositoryの登録を開いてください。)Repositoryの登録
アプリケーションを用意している GitRepositoryを登録します。 ここで設定した情報はQmonus Value Streamが実行中に読み出すリポジトリ情報として利用されます。各フォームに以下の値を入力します。
- Repository Kind:
github - Git Clone Protocol:
https - Repository Visibility:
private - Git Clone URL:
<private repository name url>
(例:https://github.com/qmonus/valuestream-examples.git) - Description: (任意の文章または空白)
- Git Token:
<personal access token>repoスコープが付与されたPersonal Access Tokenを登録してください。
以下は、必要な値を入力した状態のRepositoryの登録画面です。

入力完了後、画面右下の
CREATEボタンを押下してRepositoryを登録します。- Repository Kind:
QVS Config File Path:
.valuestream/qvs.yaml
以下は、必要な値を入力した状態のApplicationの登録画面です。

4.画面右下のNEXTボタンを押下してApplicationを作成します。
4. Deploymentの登録
Applicationの作成を実施後、自動的にDeploymentの登録画面に遷移します。
DeploymentリソースはApplication,Repository,Environmentのリソースをまとめた設定情報です。
本手順ではEnvironmentの設定も含めて行います。
ここでは、手順3で登録したApplicationをデプロイするためのEnvironmentおよびDeploymentを作成します。 さらに、アプリケーションをコンテナレジストリにPushするのに必要な認証情報を、Deploymentに登録します。
各フォームに以下の内容を入力します。
Environment:
+ Create New Environmentを選択し、Environmentの登録に従いEnvironmentを作成します。(詳細は▶︎Environmentの登録を開いてください。)Environmentの登録
各フォームに以下の値を入力します。
- Display Name:
flask-demo-dev - Description: (任意の文章または空白)
- Use for production: (空白)
- Provisioning Target:
- Kind:
gcp - Project ID:
<google cloud project id> - Alias:(空白)
- Kind:

画面右下の
CREATEボタンを押下してEnvironmentの登録を完了します。- Display Name:
Display Name:
flask-demo-devName: (Environment選択時に自動入力)
Credentials
- GCP Credential:
事前に準備したGARへの書き込み権限のあるサービスアカウントのシークレットキー(JSON)
- GCP Credential:
以下は、必要な値を入力した状態のDeploymentの登録画面になります。

入力完了後、画面右下の CREATE ボタンを押下してDeploymentの登録を完了します。
以上でDeploymentの登録は完了です。
5. Pipeline Manifestの生成および登録 (CLI)
Pipeline Manifestの登録はGUIからも可能ですが、本手順ではQmonus Value Stream CLIであるqvsctlを用いて登録します。 GUIからPipeline Manifestを登録したい場合は、Task,Pipelineの登録を参照してください。
Pipeline Manifestを生成には、qvsctl pipeline compile、Qmonus Value Streamへ登録には、qvsctl pipeline applyコマンドを用います。
qvsctl について
Qmonus Value Streamでは、Cloud Native Adapterのコンパイルなどを操作するためのCLIツールとしてqvsctlを提供しています。 qvsctlのリファレンスは、What is qvsctlから確認できます。
bash
# 作業ディレクトリが.valuestreamディレクトリがあることを確認
# コンパイルする (prefixはApplication名と同一にしてください)
qvsctl pipeline compile -c qvs.yaml --prefix flask-demo -o output/pipeline.yaml
# qvsctl auth コマンド使用して認証する(出力されたurlへアクセスしてください)
qvsctl auth
# Project Nameを取得する
qvsctl project list
# 取得したProject Nameを環境変数に設定する
export projectName=<PROJECT NAME>
# Pipeline Manifestを登録する
qvsctl pipeline apply -p ${projectName} -f output/pipeline.yamlコンパイルを実行した際に1つのpipelineflask-demo-buildと3つのtaskflask-demo-git-checkout,flask-demo-docker-login-gcp,flask-demo-buildkitが生成されることを確認してください。
6. AssemblyLineを作成する (CLI)
AssemblyLineを編集し、生成したpipelineを指定してCI/CDデプロイフローを作成する。
.valuestreamディレクトリ配下にassemblyline-dev.yamlを作成し、以下の内容を記載します。 AssemblyLineに、buildのStageを定義し、ビルドで利用するPipelineおよびDeploymentを指定します。
bash
# assemblyline-dev.yamlを編集(エディタは普段使用しているもので問題ありません)
vim assemblyline-dev.yamlyaml
apiVersion: vs.axis-dev.io/v1
kind: AssemblyLine
metadata:
name: flask-demo-dev # 作成するAssemblyLineの名称
spec:
params:
- name: gitRevision
type: string
stages:
- name: build
spec:
pipeline: flask-demo-build # 5. Pipeline Manifestの生成および登録にて登録したPipelineを指定
deployment:
app: flask-demo # 3. Applicationの作成で登録したApplication名
name: flask-demo-dev # 4. Deploymentの登録で登録したDeployment名
params:
- name: gitRevision
value: $(inputs.gitRevision)
results:
- name: gitRevision
value: $(inputs.gitRevision)
- name: imageName
value: $(stages.build.results.imageFullNameTag)この時点でのフォルダ構成は以下のようになります。
<repository name>/
├── .valuestream/
│ ├── output/
│ │ └── pipeline.yaml
│ ├── assemblyline-dev.yaml
│ └── qvs.yaml
├── app.py
├── Dockerfile
└── requirements.txt7. AssemblyLineの登録 (CLI)
手順6で作成したAssemblyLineをQmonus Value StreamのProjectへ登録します。 AssemblyLineの登録もGUIからも可能ですが、本手順ではPipeline Manifestの登録と同様にqvsctl pipeline applyを用いて登録します。 GUIからAssemblyLineを登録したい場合は、AssemblyLineの登録と確認を参照してください。
bash
# Build stageを持つAssemblyLineを登録する
qvsctl pipeline apply -p ${projectName} -f assemblyline-dev.yamlgit add、 git commit、 git pushを行い、リモートリポジトリに変更を反映します。 またコミットIDをAssemblyLineを実行するときに指定するため控えておきます。
bash
# リモートリポジトリにpushする
git add --all
git commit -m "Build QVS Tutorial"
git push origin build-own-application
# コミットIDを控える
git log -18. Deployment Configの設定 (GUI)
AssemblyLine詳細画面より、Deployment Configから不足している下記のパラメータを入力します。
- 事前に準備いただいている
GARのDockerイメージ格納先を設定します。
- 左メニューより、AssemblyLineを選択します。
- 画面中央に表示される
flask-demo-devを選択します。 - Pipeline Stagesに表示されている
buildカードを選択し、画面右に表示されるEdit Deployment Configボタンをクリックします。
- YAMLモードのEditorが表示されますので、Dockerイメージの格納先をYAML形式で入力します。必要なパラメータ一覧は以下の通りです。
- imageRegistryPath :
イメージ名を除いたコンテナレジストリのパス (例:asia-northeast1-docker.pkg.dev/gcp-project/qmonus) - imageShortName :
イメージ名 (例:flask-demo) - imageTag :
イメージタグ (例:v0.0.1) - pathToContext :
Dockerfileの場所
- imageRegistryPath :
以下は入力例です。
yaml
imageRegistryPath: asia-northeast1-docker.pkg.dev/gcp-project/qmonus
imageShortName: flask-demo
imageTag: v0.0.1
pathToContext: .Saveボタンを押下し、buildのInput Parameterが全て緑で表示されていることを確認します。
9. AssemblyLineの実行 (GUI)
登録したAssemblyLineを実行し、flask demoアプリケーションをビルドし、GARにPushします。
- 左メニューより、AssemblyLineを選択します。
- 画面中央に表示される
flask-demo-devを選択します。 - Pipelines (Stages) に表示されている
buildカードを選択し、それぞれ全てのパラメータが埋まっていることを確認します。 - 以下のInput Parameterを入力し、
RUNボタンを押下してCI/CDを開始します。- gitRevision:
コミットID- この
コミットIDは、手順7で控えたコミットIDを指定してください。
- この
- gitRevision:
10. AssemblyLineが正常に完了したかを確認する (GUI)
AssemblyLineの完了後、ビルドされたコンテナイメージが正常にコンテナレジストリへ格納されていることを確認します。
- AssemblyLineがSucceededになっているかを確認します。
- ビルドされたコンテナイメージが正常にコンテナレジストリへ格納されていることを確認します
- AssemblyLine実行画面の
AssemblyLine Results: imageNameを確認します。 (例: asia-northeast1-docker.pkg.dev/gcp-project/qmonus/flask-demo:v0.0.1) - Google Cloudコンソールへアクセスし、Google Artifact Registryの画面へ移動します。
AssemblyLine Results: imageNameの値と同じ場所にイメージが格納されていることを確認します。
- AssemblyLine実行画面の
11. ブランチをマージする
動作確認が完了したら、作業ブランチをmainブランチにマージします。 GitHubの対象リポジトリからマージを実施してください。
- GitHubの対象リポジトリにアクセスします。
- 画面上部の
Pull requestsタブをクリックします。 New pull requestボタンをクリックします。- base(マージ先)として
mainブランチを、compare(マージ元)としてbuild-own-applicationブランチを選択します。 Create pull requestボタンをクリックします。- Pull Requestのタイトルと説明を入力します。
- Title:
Build Own Application QVS Tutorial - Description: (任意の説明を記載)
- Title:
Create pull requestボタンをクリックしてPull Requestを作成します。- Pull Request画面で変更内容を確認し、問題がなければ
Merge pull requestボタンをクリックします。 Confirm mergeボタンをクリックしてマージを完了します。- マージ完了後、
Delete branchボタンをクリックして作業ブランチを削除します(任意)。
解説
Official CI/CD Adapterを用いた、Pipeline/Taskの生成
本チュートリアルでは、自分のアプリケーションをOfficial CI/CD AdapterのBuild Pipelineをqvsctl pipeline compileコマンドでコンパイルを行うことで、Pipeline/Taskを生成できました。以下に今回編集したQVS ConfigのYAML定義を示しています。 今回使用したqvsctl pipeline compileコマンドでは、アプリケーションのデリバリプロセスを定義するCI/CD AdapterをKubernetes Manifestの形で展開しており、2行目で定義しているOfficial CI/CD Adapterのコンパイルを行っています。
yaml
designPatterns:
- pattern: qmonus.net/adapter/official/pipeline/build:buildkitGcpAssemblyLine Resultsの設定
以下に今回利用したAssemblyLineの定義のうち、Results定義を抜粋したものを示しています。 AssemblyLineでAssemblyLine Resultsを設定することで、実行されたAssemblyLineからKey-Value形式で実行結果を出力でき、AssemblyLineのPromotion時に入力パラメータとして利用できるようになります。 今回は、imageNameというパラメータをbuild Stageから、gitRevisionをInput Parameterから出力するように設定しています。
yaml
results:
- name: gitRevision
value: $(inputs.gitRevision)
- name: imageName
value: $(stages.build.results.imageFullNameTag)次のステップ
次は以下のチュートリアルに進んで、ビルドしたアプリケーションをデプロイしてみましょう。