はじめに
本記事ではOCI DevOpsを利用して、Git PushをトリガとしたFunctionsの自動デプロイ構成を検証します。
DevOpsというと、ある程度の環境構築や準備が必要と思われがちですが、
今回はCloud Shellのみで構築していきます。
検証の大まかな流れは以下の通りです。
Gitリポジトリへのpushをトリガに
・Build PipelineでDockerイメージをビルド
・Container Registry(OCIR)へpush
・Deployment PipelineでFunctionsを更新
という一連の流れを、Cloud ShellとDevOpsだけで構築します。
また、Functionsのレスポンスに含まれるversionを変更することで、
Git Pushだけで実行結果が変化することを確認します。
最終的に以下のような構成を目指します。
(Git Push)
↓
Build Pipeline
↓
OCIR [Docker Image] (Artifact)
↓
Deployment Pipeline
↓
(OCI Functions更新)
シンプルではありますが、OCI上での基本的なCI/CDパターンの確認として実施しています。
■構成イメージ
目次
- 事前準備
- Functionsの設定
- DevOpsの設定
- 動作検証
1. 事前準備
・OCIアカウントの準備と各種サービスが利用できるようにポリシーを適用
各環境に合わせたポリシーを設定してください。
特に今回のDevOpsでは以下の設定が必要となります。
■動的グループ
All {resource.compartment.id = '<コンパートメントOCID>', Any {resource.type = 'devopsdeploypipeline', resource.type = 'devopsbuildpipeline', resource.type = 'devopsrepository', resource.type = 'devopsconnection', resource.type = 'devopstrigger'}}
■ポリシー
Allow dynamic-group <動的グループ> to manage devops-family in compartment <コンパートメント>
Allow dynamic-group <動的グループ> to manage fn-function in compartment <コンパートメント>
Allow dynamic-group <動的グループ> to manage fn-app in compartment <コンパートメント>
Allow dynamic-group <動的グループ> to use fn-invocation in compartment <コンパートメント>
※環境によっては追加の権限が必要になる場合があるので、適宜確認してください。
・認証トークンの作成
後続のdocker loginで利用するため、事前に作成し控えておきます。
・Functionsのアプリの作成
今回はCloud Shellから直接動作確認するため、パブリックサブネット上に作成します。
・OCIRリポジトリの作成
対象コンパートメント内に空のリポジトリを作成します。
名前: devops_func
・Notifications Topicの作成
OCI DevOpsの初期設定で必要となるため作成します。
ビルドやデプロイの通知を受け取るために利用します。
2. Functionsの設定
Functions / DevOpsで必要なファイルを準備するために
以下の構成でファイルを作成します。
※今回の開発言語はPythonを使います。
ファイル構成
~/devops_func/
├── func.py
├── func.yaml
├── requirements.txt
├── Dockerfile
├── build_spec.yaml
└── README.md
これから上記ファイルをすべて作成しますので、
Cloud Shellを起動したら以下の手順で各ファイルを作成します。
2-1. func.py
func.py を以下のコマンドで作成します。
・作業ディレクトリの作成と移動
※以降、全ての作業はdevops_func内で実施してください。
cd ~
mkdir -p ~/devops_func
cd ~/devops_func
・func.pyの作成
単純にFunctionsを呼び出すバージョンを返すだけのシンプルなコードです。
cat > func.py <<'EOF'
import json
import time
from datetime import datetime
from fdk import response
VERSION = "1.0.0"
def handler(ctx, data=None):
start = time.time()
start_time = datetime.utcnow().isoformat() + "Z"
time.sleep(0.2)
end = time.time()
end_time = datetime.utcnow().isoformat() + "Z"
duration_ms = round((end - start) * 1000, 2)
return response.Response(
ctx,
response_data=json.dumps({
"service": "devops_func",
"version": VERSION,
"start_time": start_time,
"end_time": end_time,
"duration_ms": duration_ms
}),
headers={"Content-Type": "application/json"},
)
EOF
2-2. func.yaml
・func.yamlの作成
DevOpsでビルド・デプロイを行うため、runtimeはdockerを指定します。
(通常のFunctionsではentrypointを指定しますが、本記事では利用しません)
cat > func.yaml <<'EOF'
schema_version: 20180708
name: devops_func
version: 0.0.1
runtime: docker
EOF
2-3. requirements.txt
・requirements.txtの作成
FunctionsでPythonを利用するためfdkを指定します。
cat > requirements.txt <<'EOF'
fdk
EOF
2-4. Dockerfile
・Dockerfileの作成
Functionsをコンテナとして実行するための設定を行います。
cat > Dockerfile <<'EOF'
FROM fnproject/python:3.8
WORKDIR /function
ADD requirements.txt /function/
RUN /usr/bin/python3 -m ensurepip \
&& /usr/bin/python3 -m pip install --no-cache-dir -r requirements.txt
ADD . /function/
CMD ["fdk", "/function/func.py", "handler"]
EOF
2-5. build_spec.yaml
・build_spec.yamlの作成
DevOpsのBuild PipelineでDockerイメージをビルドし、OCIRへpushする設定を行います。
※Artifact名(Artifact01)は後続のDeployment Pipelineで使用するため、同じ名前を指定してください。
※$AUTH_TOKENは事前に作成した認証トークンを環境変数として設定して使用します。(Build Pipelineの設定で使用)
※[テナンシ名]や[ユーザ名]は自身の環境に合わせて置き換えてください。
※リージョン(nrt.ocir.io)も環境に応じて変更してください。
cat > build_spec.yaml <<'EOF'
version: 0.1
component: build
steps:
- type: Command
name: Login to OCIR
command: |
echo "$AUTH_TOKEN" | docker login nrt.ocir.io -u '[テナンシ名]/oracleidentitycloudservice/[ユーザ名]' --password-stdin
- type: Command
name: Build image
command: |
docker build -t nrt.ocir.io/[テナンシ名]/devops_func:latest .
- type: Command
name: Push image
command: |
docker push nrt.ocir.io/[テナンシ名]/devops_func:latest
outputArtifacts:
- name: Artifact01
type: DOCKER_IMAGE
location: nrt.ocir.io/[テナンシ名]/devops_func:latest
EOF
2-6. README.md
・README.mdの作成
Functionsの動作確認用としてレスポンス内容を簡単に記載します。
cat > README.md <<'EOF'
# devops_func
Simple OCI Function to verify DevOps build & deploy.
Returns:
{
"service": "devops_func",
"version": "X.Y.Z"
}
EOF
2-7. Functionsのデプロイ
・デプロイの実行
OCIRへのログインとFunctionsのデプロイを行います。
・OCIRへログイン(パスワードは認証トークンを入力)
docker login nrt.ocir.io -u '[テナンシ名]/oracleidentitycloudservice/[ユーザ名]'
・アプリケーションのデプロイ
※[Functionsのアプリケーション]は事前に作成したアプリ名を指定してください。
fn deploy --app [Functionsのアプリケーション]
・buildでエラー(no space left on device)が出た場合は下記を実行
docker system prune -af --volumes
docker builder prune -af
fn deploy --app [Functionsのアプリケーション]
※この時点ではFunctionsは実行できません。
DevOpsのDeployment Pipelineでデプロイした後に実行可能となります。
3. DevOpsの設定
3-1. プロジェクトの作成
・DevOpsプロジェクトを作成
開発者サービス > DevOps > DevOpsプロジェクト
からDevOpsプロジェクトの作成を実行します。
(ここではプロジェクト: DevOpsにしています)
・Notificationの設定
・Loggingの有効化
を有効にして作成してください。
3-2. コード・リポジトリの作成
・コード・リポジトリの作成
コード・リポジトリからリポジトリの作成を実行し、
以下を入力して作成します。
リポジトリ名: 任意 (ここではDevOpsRepositoryにしています)
デフォルト・ブランチ: main
・GitリポジトリのURL取得
下記からhttpsのURLを取得・メモしておきます。
3-3. Gitテスト
コード・リポジトリの作成が完了したらCloud Shellに戻り、Gitテストを実行します。
※この作業は初回の1回だけ行います。
・Gitの初期化
cd ~/devops_func
git init
・リポジトリ用のユーザー設定(テスト用でOK)
git config user.name "oci-devops"
git config user.email "oci-devops@test.local"
・Push対象をすべて追加
git add .
・初回コミット
git commit -m "v1.0.0"
・ブランチ名をmainに変更
git branch -M main
・DevOpsリポジトリをoriginに登録(前述でメモしたGitリポジトリのURLを設定)
git remote add origin \
https://devops.scmservice.ap-tokyo-1.oci.oraclecloud.com/namespaces/[テナンシ名]/projects/DevOps/repositories/[コード・リポジトリ名]
・初回Push
git push -u origin main --force
・Git Commitの確認
開発者サービス > DevOps > DevOpsプロジェクト > DevOps > コード・リポジトリ > DevOpsRepository > ファイル
からGitの状況を確認すると、Pushされていることが確認できます。
3-4. DevOpsのパイプライン設定
・構成の流れ
冒頭で説明した通り、本構成の実行順序は以下の流れになります。
・Build Pipeline
↓
・OCIR [Docker Image] (Artifact)
↓
・Deployment Pipeline
・設定の順番
実際の設定は以下の順番で行います。
(1) Artifactの設定
(2) 環境の設定
(3) Deployment Pipelineの設定
(4) Build Pipelineの設定
(5) トリガーの設定
※設定順は依存関係の都合上、この順番で作成します。
(1) Artifactの設定
Artifactの設定でOCIRのイメージを指定します。
開発者サービス > DevOpsプロジェクト > DevOps > アーティファクト
アーティファクトの追加ボタンから下記を登録します。
名前: Artifact01 (※build_spec.yamlで指定したものを同じ名前にします)
タイプ: コンテナ・イメージ・リポジトリ
コンテナ・レジストリのイメージへの完全修飾パス: nrt.ocir.io/[テナンシ名]/devops_func:latest
パラメータ化の許可: ✓(使用しませんが、そのままとします)
(2) 環境の設定
環境でコンテナの実行環境を設定します。
開発者サービス > DevOpsプロジェクト > DevOps > 環境
の環境の作成ボタンを押します。
以下の設定内容にしてNextボタンを押します。
環境タイプ: ファンクション
名前: 任意(ここではEnvFuncとしています)
以下の設定内容にして環境の作成ボタンを押します。
リージョン: Japan East(Tokyo)
コンパートメント: ※対象のコンパートメント
アプリケーション: ※fn deployしたFunctionsのアプリケーション
ファンクション: devops_func
(3) Deployment Pipelineの設定
Deployment PipelineでArtifactや環境の設定をします。
開発者サービス > DevOpsプロジェクト > DevOps > デプロイメント・パイプライン
のパイプラインの作成ボタンから以下を入力してパイプラインの作成ボタンを押します。
パイプライン名: 任意(ここではBuildPipelineとしています)
ステージの追加を押します。
ファンクションを選択してNextを押します。
以下の設定内容にして追加ボタンを押します。
ステージ名: 任意(ここではDeployment-devops_funcとしています)
環境: EnvFunc
アーティファクト: Artfifact01
これでDeployment Pipelineの設定は完了です。
(4) Build Pipelineの設定
Build Pipeline画面でイメージの作成からDeployment Pipelineの実行までを設定します。
開発者サービス > DevOpsプロジェクト > DevOps > ビルド・パイプライン
ビルド・パイプラインの作成ボタンから以下を入力して作成ボタンを押します。
名前: 任意(ここではBuildPipelineとしています)
ステージの追加を押します。
マネージド・ビルドを選択してNextを押します。
以下を設定して下にスクロールします。
ステージ名: 任意(ここではCreateImageとしています)
ビルド・ランナー・シェイプの選択: デフォルト・シェイプ
以下の内容を設定をして追加ボタンを押します。
ベース・コンテナ・イメージ: Oracle Linux 8 x86_64 standard1.0 (default)
ビルド仕様ファイル・パス: build_spec.yaml
プライマリ・コード・リポジトリ: DevOpsRepository
続けて+ボタンからステージの追加を押します。
デプロイメントのトリガーを選択してNextを押します。
以下を設定して下にスクロールします。
ステージ名: 任意(ここではLaunchDeployPipelineとしています)
デプロイメント・パイプラインの選択: DeployPipeline
下までスクロールすると、DeployPipelineで設定したArtifact01が選択されているので
そのまま追加ボタンを押します。
続いてパラメータの設定行うためにパラメータタブを押します。
ここでは以下の入力して+ボタンを押します。
名前: AUTH_TOKEN ※build_spec.yamlで設定しているため合わせてください。
デフォルト値: 認証トークン
※設定すると下段に表示されます。
再びビルド・パイプラインのタブに戻ったら手動実行の開始を押します。
ここも同様に手動実行の開始を押します。
処理が正常に完了すると緑色のチェックがすべてつきますので、
パイプラインが正常に設定できたことが分かります。
ここまで終わったら一旦、Functionsが正常に動くか確認するためにCloud Shellで下記を実行します。
cd ~/devops_func
echo -n '{}' | fn invoke func_test devops_func
上手くいくと以下のような結果が返ります。
※この時点ではversion=1.0.0です。
{"service": "devops_func", "version": "1.0.0", "start_time": "2026-04-03T08:55:38.534848Z", "end_time": "2026-04-03T08:55:38.734888Z", "duration_ms": 200.04}
(5) トリガーの設定
最後にGit pushしたら自動でパイプラインが起動するようにトリガーを設定します。
開発者サービス > DevOpsプロジェクト > DevOps > トリガー
の*トリガーの作成**ボタンを押します。
以下を設定して下にスクロールします。
名前: 任意(ここではtrigger_buildとしています)
ソース接続: OCIコード・リポジトリ
コード・リポジトリの選択: DevOpsRepository
以下を設定して下にスクロールします。
アクションの追加から以下の入力して追加します。
ビルド・パイプライン: BuildPipeline
イベント オプション: ✓ プッシュ
ソース・ブランチ オプション: main
全ての設定が完了したら作成ボタンを押して完了です。
以上で全てのDevOpsの設定が完了しました。
4. 動作検証
最後にGit pushだけでFunctionsが本当に更新されるか動作検証してみます。
再度Cloud Shellに戻ります。
・func.pyのバージョンを修正
cd ~/devops_func
vi func.py
変更箇所
VERSION = "1.0.1"
あとはGit pushするだけです。
・Push対象をすべて追加
git add .
・変更コミット
git commit -m "update version to 1.0.1"
・push
git push
あとはビルド履歴からパイプラインが正常に完了しているか確認し、
成功となっていたら再度Functionsを起動してみます。
cd ~/devops_func
echo -n '{}' | fn invoke func_test devops_func
上手くいくと以下のような結果が返ります。
※version=1.0.0から1.0.1に変更されていることが分かります。
{"service": "devops_func", "version": "1.0.1", "start_time": "2026-04-03T09:42:06.512100Z", "end_time": "2026-04-03T09:42:06.712346Z", "duration_ms": 200.24}
OCI DevOpsを使ってGit PushだけでFunctionsが自動デプロイされる環境を作ってみたは以上です。
おわり
以上、Cloud ShellだけでOCI DevOpsの基本的なCI/CD構成を簡単に体験することができました。
































