フォーム読み込み中
ソフトバンクアドベントカレンダー25日目の記事を担当する不破です。
私の普段行っている業務は2つあり、どちらも開発業務を担当しております。
STAION(映像解析PF)では、gitLab CIを使用してパイプラインを実装しています。
機能の中にはAzure Functionsを使用したバッチ処理が複数あり、各処理のソースコードがGitLabリポジトリに格納されています。また、各アプリケーションのCIでは、アプリケーションのDockerイメージをビルドし、その後Azure Container RegistryにPushする処理が実装されています。
そのため、各アプリケーションのCIパイプラインを個別に編集・実行する必要があり、Azure Functionsを使用したアプリケーションが増えるとCIを実行する手間がかかる問題がありました。具体的には複数のパイプラインを実行する際に画面遷移が多く、操作性が悪いことが挙げられます。
この記事では、複数のアプリケーションのパイプラインを一つのプロジェクトで実行できるようにするマルチプロジェクトパイプラインの実装方法について紹介します。
今回はブログ用にサンプルコードを作成したので、サンプルを例に構成について説明していきます。
まずは全体の構成について説明します。
続いてsample-applications内のアプリケーションの構成について説明します。
本来であれば各PJにアプリケーションの実装コードと.gitlab-ci.ymlが配置してありますが、今回はdockerファイル/.gitlab-ci.ymlのみ配置しています。
azure-function-1
└dockerfile
└.gitlab-ci.yml
以下は各ファイルの実装コードになります。
FROM mcr.microsoft.com/azure-functions/node:4-node18
include:
- project: 'blog-sample/common-pipeline'
ref: main
file: template-ci.yml'
stages:
- build-image
variables:
TAG: latest
REPOSITORY_NAME: azure-function-1
ACR_URI: samplecontainer.azurecr.io
USERNAME: sample_service_principal_user
PASSWORD: sample_service_principal_pass
docker-build-to-acr:
extends: .common:build-to-acr
stage: build-image
variables:
TAG_NAME: ${TAG}
CONTAINER_REGISTRY: ${ACR_URI}
SERVICE_PRINCIPAL_USERNAME: ${USERNAME}
SERVICE_PRINCIPAL_PASSWORD: ${PASSWORD}
when: manual
パイプラインのコードが出てきたので、Gitlab CIの基礎知識を含めて説明していきます。
include:
- project: 'blog-sample/common-pipeline'
ref: main
file: template-ci.yml'
トピック: 上記のコードはcommon-pipeline PJのmainブランチにあるtemplate-ci.ymlの内容を参照するものです。
参考) GitとCI/CDに関する知識ゼロのSEによる、GitLabのCI/CDパイプラインのキーワード解説 ~stages 編~ (2023/07/06 更新) - ネットワールド らぼ
stages:
- build-image
variables:
TAG: latest
REPOSITORY_NAME: azure-function-1
ACR_URI: samplecontainer.azurecr.io
USERNAME: sample_service_principal_user
PASSWORD: sample_service_principal_pass
トピック: グローバルの変数定義になるので、.gitlab-ci.yml内の他のジョブでも変数を参照することができます。
以下のコードはdocker imageをビルドし、ACRにpushするジョブになります。
docker-build-to-acr:
extends: .common:build-to-acr
stage: build-image
variables:
TAG_NAME: ${TAG}
CONTAINER_REGISTRY: ${ACR_URI_DEV}
SERVICE_PRINCIPAL_USERNAME: ${USERNAME}
SERVICE_PRINCIPAL_PASSWORD: ${PASSWORD}
when: manual
共通で使用するパイプラインを定義しているcommon-pipelineについて説明していきます。
common-pipeline PJ内の構成は以下になります。
common-pipeline
└template-ci.yml
└docker.gitlab-ci.yml
default:
tags:
- docker
image: sample-image
include:
- local: docker.gitlab-ci.yml
default:
tags:
- docker
image: sample-image
再度includeキーワードが出てきました。今回は内部ファイルを参照する場合の書き方になります。
include:
- local: docker.gitlab-ci.yml
トピック: アプリケーションの.gitlab-ci.ymlから見ると、includeによって以下の経路でジョブが参照されます。
.gitlab-ci.yml ← template-ci.yml ← docker.gitlab-ci.yml(common:build-to-acr)
以下は.gitlab-ci.ymlでextendsされたジョブの処理です。
.common:build-to-acr:
before_script:
- echo "---------- Assert variables ----------"
- echo ${CONTAINER_REGISTRY:?undefined variable.} > /dev/null
- echo ${REPOSITORY_NAME:?undefined variable.} > /dev/null
- echo ${SERVICE_PRINCIPAL_USERNAME:?undefined variable.} > /dev/null
- echo ${SERVICE_PRINCIPAL_PASSWORD:?undefined variable.} > /dev/null
- echo ${TAG_NAME:?undefined variable.} > /dev/null
- echo "--------------------------------------"
script:
- |
echo "------------ Login to ACR ------------"
echo "${SERVICE_PRINCIPAL_PASSWORD}" | docker login --username ${SERVICE_PRINCIPAL_USERNAME} --password-stdin ${CONTAINER_REGISTRY}
echo "------------ Make Docker Image ------------"
docker build ./ --tag="${CONTAINER_REGISTRY}/${REPOSITORY_NAME}:${TAG_NAME}"
echo "------------ Push Docker Image ------------"
docker push ${CONTAINER_REGISTRY}/${REPOSITORY_NAME}:${TAG_NAME}
詳細は割愛しますが、処理の内容は以下になります。
この記事の冒頭で、各アプリケーションのCIパイプラインを個別に編集・実行する必要があり、Azure Functionsを使用したアプリケーションが増えるとCIを実行する手間がかかる問題について言及しました。
そこでマルチプロジェクトパイプラインを実装し、この問題を解決します。
トピック: マルチプロジェクトパイプラインとは、最初のパイプラインとは異なるプロジェクトでトリガーされるダウンストリームパイプラインです。
トピック: ダウンストリームパイプラインとは、他のパイプラインによってトリガーされるGitLab CI/CDパイプラインのことです。また、トリガーになったパイプラインとは独立して実行されます。
サンプルの構成で言及したbatch-pipeline(マルチパイプラインを実装するPJ)を作成し、.gitlab-ci.ymlファイルを配置しています。
batch-pipeline
└.gitlab-ci.yml
gitlab-ci.ymlの実装コード
stages:
- functions
variables:
TAG: latest
BRANCH_NAME: develop
ACR_URI: samplecontainer.azurecr.io
AZURE_FUNCTION_1: azure-function-1
AZURE_FUNCTION_2: azure-function-2
AZURE_FUNCTION_3: azure-function-3
AZURE_FUNCTION_4: azure-function-4
AZURE_FUNCTION_5: azure-function-5
build-to-acr-azure-function-1:
stage: functions
trigger:
project: 'blog-sample/sample-applications/${AZURE_FUNCTION_1}'
branch: ${BRANCH_NAME}
variables:
TAG_NAME: ${TAG}
CONTAINER_REGISTRY: ${ACR_URI}
REPOSITORY_NAME: ${AZURE_FUNCTION_1}
when: manual
build-to-acr-azure-function-2:
stage: functions
trigger:
project: 'blog-sample/sample-applications/${AZURE_FUNCTION_2}'
branch: ${BRANCH_NAME}
variables:
TAG_NAME: ${TAG}
CONTAINER_REGISTRY: ${ACR_URI}
REPOSITORY_NAME: ${AZURE_FUNCTION_2}
when: manual
〜 〜 〜
同じジョブ構成なので、azure-function-3/4は割愛
〜 〜 〜
build-to-acr-azure-function-5:
stage: functions
trigger:
project: 'blog-sample/sample-applications/${AZURE_FUNCTION_5}'
branch: ${BRANCH_NAME}
variables:
TAG_NAME: ${TAG}
CONTAINER_REGISTRY: ${ACR_URI}
REPOSITORY_NAME: ${AZURE_FUNCTION_5}
when: manual
このパイプラインでは、 azure-function-1~azure-fuction-5の.gitlab-ci.ymlにアクセスをしてジョブの実行を管理しています。
build-to-acr-azure-function-1を抜粋し、マルチプロジェクトパイプラインに必要なキーワードを説明します。
build-to-acr-azure-function-1:
stage: functions
trigger:
project: 'blog-sample/sample-applications/${AZURE_FUNCTION_1}'
branch: ${BRANCH_NAME}
variables:
TAG_NAME: ${TAG}
CONTAINER_REGISTRY: ${ACR_URI}
REPOSITORY_NAME: ${AZURE_FUNCTION_1}
when: manual
トピック: triggerによってazure-fuction-1の.gitlab-ci.ymlのジョブを参照することができます。また、includeとの違いとしては、ダウンストリームによる実行になるため、アプリケーションのジョブが並列で実行されます。
各アプリケーションPJから1.で作成したパイプラインに実行契機を渡すために以下の要素を追加しました。
triggerキーワードで呼び出されたことを検知してパイプラインが実行されます。
以下は実装例
docker-build-to-acr:
extends: .common:build-to-acr
stage: build-image
variables:
SERVICE_PRINCIPAL_USERNAME: ${USERNAME}
SERVICE_PRINCIPAL_PASSWORD: ${PASSWORD}
rules:
- if: $CI_PIPELINE_SOURCE == "pipeline"
一つのプロジェクトで複数のアプリケーションのパイプラインを実行できるようになりました!!
この記事では、複数のアプリケーションを一括で実行できるようにするマルチプロジェクトパイプラインの実装方法について記載しました。
また、Gitlab CIについての基礎知識やトピックも合わせて紹介できたと思います。
ソフトバンクでは、カメラで取得した映像データをAIで分析・解析し、情報へと変換するAI映像解析プラットフォームであるSTAIONサービスを提供しています。
具体的には、カメラ映像をAIで解析・処理するエッジデバイス、通信ネットワークの他、AIによる解析結果を基に欠品や空席、危険な行動、不良品の検知や、人数カウント、年齢・性別の推定などが可能な各種サービスを「STAION」と連携させて、さまざまな業界・業種で利用できる映像解析ソリューションとしてワンストップで提供しています。
もしご興味がある方は、ぜひソフトバンクにご相談ください。
さまざまな業種で活用できるAI映像解析プラットフォーム。AIがカメラ映像を分析し、業務プロセスの効率化、セキュリティ向上、顧客エクスペリエンスの向上など、幅広い価値を生み出します。
TASUKI Annotation RAGデータ作成ツールは、RAGを高度に活用する際に課題となるポイントをテクノロジーで支援するツールです。
RAGに関する知見がなくても、社内データを活用した精度の高いRAG回答生成を簡単に得ることが可能です。
条件に該当するページがございません