🛠️

Cloud Run jobs を Cloud Deploy でデプロイしてみた

2024/12/16に公開

この記事は、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