web-dev-qa-db-ja.com

monorepo内の複数のcloudbuild.yamlとGitHub Cloud Buildの統合

GitHubの Google Cloud Build統合 は、リポジトリのルートにない場合、cloudbuild.yamlまたはDockerfileを検出しません。

複数のcloudbuild.yamlsを含むmonorepoを使用する場合、正しいcloudbuild.yamlを検出するようにGitHubのGoogle Cloud Build統合を構成するにはどうすればよいですか?

ファイルパス:

services/api/cloudbuild.yaml
services/nginx/cloudbuild.yaml
services/websocket/cloudbuild.yaml

Cloud Build統合出力:

Failed build

13
sabrehagen

これを行うには、cloudbuild.yamlを1つのgcr.io/cloud-builders/gcloudステップでリポジトリのルートに追加します。このステップは次のようになります。

  1. 各サブディレクトリをトラバースするか、findを使用して追加のcloudbuild.yamlファイルを探します。
  2. 見つかったそれぞれのcloudbuild.yamlに対して、gcloud builds submitを実行してforkし、ビルドを送信します。
  3. フォークされたすべてのgcloudコマンドが完了するのを待ちます。

the cloudbuild.yaml repo 内の ルートGoogleCloudPlatform/cloud-builders-community でこれを行う1つの方法の良い例があります。

不要な部分を取り除くと、基本的には次のようになります。

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    for d in */; do
      config="${d}cloudbuild.yaml"
      if [[ ! -f "${config}" ]]; then
        continue
      fi

      echo "Building $d ... "
      (
        gcloud builds submit $d --config=${config}
      ) &
    done
    wait
19
Rohan Singh

現在、mono-repoに移行していますが、これをうまく処理するCI/CDソリューションは見つかりませんでした。

重要なのは、変更を検出するだけでなく、その変更に依存するサービスも検出することです。これが私たちがしていることです:

  • すべてのサービスに、ビルドコマンドを含むMAKEFILEが必要です。
  • Cloudbuild.yamlをモノリポジトリのルートに置く
  • 次に、この小さなツール(古いがまだ機能しているように見える)でカスタムビルドステップを実行します https://github.com/jharlap/affected これにより、変更されたすべてのパッケージと依存するすべてのパッケージが一覧表示されますそれらのパッケージなど.
  • シェルスクリプトはmake build変更の影響を受けるサービス。

これまでのところうまくいきますが、これがワークフローに適合しないかどうかは完全に理解できます。

多くの人が使用するもう1つのオプションはBazelです。最も単純なツールではありませんが、Monoリポジトリ全体に多くの異なる言語やビルドプロセスがある場合は特に便利です。

1
Clint