Cloud Run jobs を Cloud Deploy でデプロイしてみた
この記事は、Magic Moment Advent Calendar 2024 11日目の記事です。
こんにちは、 Magic Moment で QAE をやっている yano です。
今年は CI/CD パイプラインを整備することが多かった一年でした。
現在パイプラインの中で Cloud Deploy を試験的に採用していますが、リリースノートからも分かるように色々な機能が随時追加されている製品だと感じていますし、single-target のパイプラインは無料で利用できる点がありがたいです。
ちなみに1つだけならば multiple-target のパイプラインも無料で利用可能なのでお試しで使うこともやりやすいと思います。
今回パイプラインを整備していく中で Cloud Run services をデプロイする記事は検索すると出てきますが、 Cloud Run jobs のデプロイをする事例はあまりヒットしませんでした。
そこで本記事では、Cloud Run jobs を Cloud Deploy でデプロイをする方法を試してみたので紹介します。
Cloud Run services をデプロイする場合との違い
まず Cloud Run jobs をデプロイするにあたって、用意するものは公式ドキュメント記載の通り Cloud Run services をデプロイする場合と大きな変わりはありません。
一点異なる部分は当たり前ですが、デプロイ対象となる Cloud Run の manifest ファイルが Cloud Run services のものでなく、Cloud Run jobs のものに変わるというだけです。
なので Cloud Run services を一度でも Cloud Deploy でデプロイしたことのある方は特に迷うことなく実装できると思います。
Cloud Run jobs をデプロイするために必要なもの
基本的な構成は Cloud Run services をデプロイする場合と変わらないので、必要なものは以下の5点になります。
- Cloud Deploy の Pipeline (Terraform で実装)
- Cloud Deploy の Target (Terraform で実装)
- Cloud Deploy 定義用の skaffold ファイル
- Cloud Run jobs 定義用の manifest ファイル
- リリースを作成するためのコマンドを実行できるワークフロー
Cloud Run jobs をデプロイする実装方法
まずは Cloud Deploy の大枠になる Pipeline と Target を Terraform で実装します。
resource "google_clouddeploy_delivery_pipeline" "pipeline_jobs" {
provider = google-beta
location = local.gcp_region
name = "jobs-pipeline"
description = "Cloud Run jobs 用デリバリーパイプライン"
serial_pipeline {
stages {
profiles = ["dev"]
target_id = google_clouddeploy_target.target_jobs.name
}
}
}
resource "google_clouddeploy_target" "target_jobs" {
provider = google-beta
name = "jobs-target"
location = local.gcp_region
description = "Cloud Run jobs 用ターゲット"
require_approval = false
deploy_parameters = {
## 実行時に渡したいパラメータを定義できる
}
execution_configs {
usages = ["RENDER", "DEPLOY"]
}
run {
location = "projects/${local.gcp_project}/locations/${local.gcp_region}"
}
}
次に Cloud Run jobs の manifest ファイルを用意します。初回は Cloud Run jobs を一度コンソールなどから作成して、gcloud run jobs describe [job-name] --format=export
で雛形を取得するのが簡単です。
apiVersion: run.googleapis.com/v1
kind: Job
metadata:
name: 'job-name'
spec:
template:
metadata:
annotations:
run.googleapis.com/execution-environment: gen2
run.googleapis.com/network-interfaces: >-
[
{
"network": "default",
"subnetwork":"default"
}
]
run.googleapis.com/vpc-access-egress: all-traffic
spec:
taskCount: 1
template:
spec:
containers:
- image: job-image
resources:
limits:
cpu: 1000m
memory: 512Mi
maxRetries: 3
timeoutSeconds: '180'
そして Skaffold ファイルを用意します。
apiVersion: skaffold/v4beta11
kind: Config
metadata:
name: deploy job
profiles:
- name: dev
manifests:
rawYaml:
- {Cloud Run jobs の manifest ファイル}
deploy:
cloudrun: {}
これで Cloud Deploy でデプロイする準備はできているので最後にリリースを作成するためのコマンドを実行できるワークフローを用意します。今回は Cloud Build を使用していますが、 gcloud deploy コマンドが実行できればなんでもOKです。
steps:
- id: deploy cloud run
name: 'gcr.io/google.com/cloudsdktool/cloud-sdk:slim'
script: |
#!/usr/bin/env bash
set -e
apt-get update
apt-get install -y gettext-base
gcloud deploy releases create rls-${SHORT_SHA}-'$DATE-$TIME' \
--delivery-pipeline jobs-pipeline \
--region ${LOCATION} \
--images=job-image={ビルドしたimage} \
--skaffold-file {skaffold ファイル}
options:
logging: CLOUD_LOGGING_ONLY
上記の Cloud Build をトリガーして実行するとリリースが作成されて、 Cloud Run jobs も Cloud Run services と同じように Cloud Deploy からデプロイされます。
最後に
今回紹介した方法で Cloud Run jobs を Cloud Deploy でデプロイできました。注意点としては、Cloud Run jobs の実行 (execute) までは行いません。
実行まで自動化したい場合はデプロイフックの POSTDEPLOY を使ってデプロイ後に execute コマンドを叩くことや、ワークフロー上の別ステップで実行をする必要があるのでご注意ください。
次回のアドベントカレンダーは fujisaki さん の「次のチャンスを掴むためのタスクへの向き合い方」です。
お楽しみに!
Discussion