Skip to content

アプリケーションのコンテナイメージを作成する

本チュートリアルでは、自分のアプリケーションを、コンテナイメージとしてビルドする手順を解説します。 ビルドは、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.py
py
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.txt
txt
flask

そして、pythonをベースイメージに利用したDockerfileを用意します。

bash
# Dockerfileを作成し、編集する(エディタは普段使用しているもので問題ありません)
vim Dockerfile
Dockerfile
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.yaml
yaml

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.txt

git add、 git commit、 git pushを行い、リモートリポジトリに変更を反映します。

bash
# リモートリポジトリにpushする
git add --all
git commit -m "Build Own Application QVS Tutorial"
git push origin build-own-application

3. Applicationの作成

続いて今回利用するApplicationを Qmonus Value Stream に登録します。 本手順では、Repositoryの登録も併せて行います。

  1. 左メニューより、Applicationを選択します。
  2. 画面右上の NEW APPLICATION ボタンを押下します。
  3. 各フォームに以下の値を入力します。
    • Display Name: flask-demo

    • Description: (任意の文章または空白)

    • 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を登録します。

    • 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:(空白)

    画面右下のCREATEボタンを押下してEnvironmentの登録を完了します。

  • Display Name: flask-demo-dev

  • Name: (Environment選択時に自動入力)

  • Credentials

    • GCP Credential: 事前に準備したGARへの書き込み権限のあるサービスアカウントのシークレットキー(JSON)

以下は、必要な値を入力した状態の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.yaml
yaml
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.txt

7. 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.yaml

git 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 -1

8. Deployment Configの設定 (GUI)

AssemblyLine詳細画面より、Deployment Configから不足している下記のパラメータを入力します。

  • 事前に準備いただいているGARのDockerイメージ格納先を設定します。
  1. 左メニューより、AssemblyLineを選択します。
  2. 画面中央に表示されるflask-demo-devを選択します。
  3. Pipeline Stagesに表示されているbuildカードを選択し、画面右に表示されるEdit Deployment Configボタンをクリックします。
  4. YAMLモードのEditorが表示されますので、Dockerイメージの格納先をYAML形式で入力します。必要なパラメータ一覧は以下の通りです。
    • imageRegistryPath : イメージ名を除いたコンテナレジストリのパス (例:asia-northeast1-docker.pkg.dev/gcp-project/qmonus)
    • imageShortName : イメージ名 (例:flask-demo)
    • imageTag : イメージタグ (例:v0.0.1)
    • pathToContext : Dockerfileの場所

以下は入力例です。

yaml
imageRegistryPath: asia-northeast1-docker.pkg.dev/gcp-project/qmonus
imageShortName: flask-demo
imageTag: v0.0.1
pathToContext: .
  1. Saveボタンを押下し、buildのInput Parameterが全て緑で表示されていることを確認します。

9. AssemblyLineの実行 (GUI)

登録したAssemblyLineを実行し、flask demoアプリケーションをビルドし、GARにPushします。

  1. 左メニューより、AssemblyLineを選択します。
  2. 画面中央に表示されるflask-demo-devを選択します。
  3. Pipelines (Stages) に表示されているbuildカードを選択し、それぞれ全てのパラメータが埋まっていることを確認します。
  4. 以下のInput Parameterを入力し、RUNボタンを押下してCI/CDを開始します。
    • gitRevision: コミットID
      • このコミットIDは、手順7で控えたコミットIDを指定してください。

10. AssemblyLineが正常に完了したかを確認する (GUI)

AssemblyLineの完了後、ビルドされたコンテナイメージが正常にコンテナレジストリへ格納されていることを確認します。

  1. AssemblyLineがSucceededになっているかを確認します。
  2. ビルドされたコンテナイメージが正常にコンテナレジストリへ格納されていることを確認します
    1. AssemblyLine実行画面のAssemblyLine Results: imageNameを確認します。 (例: asia-northeast1-docker.pkg.dev/gcp-project/qmonus/flask-demo:v0.0.1)
    2. Google Cloudコンソールへアクセスし、Google Artifact Registryの画面へ移動します。
    3. AssemblyLine Results: imageNameの値と同じ場所にイメージが格納されていることを確認します。

11. ブランチをマージする

動作確認が完了したら、作業ブランチをmainブランチにマージします。 GitHubの対象リポジトリからマージを実施してください。

  1. GitHubの対象リポジトリにアクセスします。
  2. 画面上部のPull requestsタブをクリックします。
  3. New pull requestボタンをクリックします。
  4. base(マージ先)としてmainブランチを、compare(マージ元)としてbuild-own-applicationブランチを選択します。
  5. Create pull requestボタンをクリックします。
  6. Pull Requestのタイトルと説明を入力します。
    • Title: Build Own Application QVS Tutorial
    • Description: (任意の説明を記載)
  7. Create pull requestボタンをクリックしてPull Requestを作成します。
  8. Pull Request画面で変更内容を確認し、問題がなければMerge pull requestボタンをクリックします。
  9. Confirm mergeボタンをクリックしてマージを完了します。
  10. マージ完了後、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:buildkitGcp

AssemblyLine 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)

次のステップ

次は以下のチュートリアルに進んで、ビルドしたアプリケーションをデプロイしてみましょう。