🎁

Cloud Buildで git fetch --unshallow する時の注意点

2021/10/30に公開

Cloud Build を利用している際に、少しハマったことがあったので備忘録として記事を書いておきます。

何があったか?

Cloud Build で git fetch --unshallow を含むビルド処理を gcloud builds submitコマンドを利用して実行したところ、下記のようなエラーになりました。
エラー的には、git の設定か .git ディレクトリに原因がありそうな内容でした。

https://stackoverflow.com/questions/16853624/git-discovery-across-filesystem-not-set

FETCHSOURCE
Fetching storage object: gs://xxx_cloudbuild/source/1635035308.862848-68480386a797432fb877d6ad40dbd76d.tgz#1635035309965847
Copying gs://xxx_cloudbuild/source/1635035308.862848-68480386a797432fb877d6ad40dbd76d.tgz#1635035309965847...
/ [1 files][  9.9 KiB/  9.9 KiB]                                                
Operation completed over 1 objects/9.9 KiB.
BUILD
Starting Step #0 - "Get GitHub key"
Starting Step #2 - "Fetch github repo"
Step #0 - "Get GitHub key": Already have image (with digest): gcr.io/cloud-builders/gcloud
Step #2 - "Fetch github repo": Already have image (with digest): gcr.io/cloud-builders/git
Step #2 - "Fetch github repo": fatal: not a git repository (or any parent up to mount point /)
Step #2 - "Fetch github repo": Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

git fetch の実行前に .git ディレクトリが存在するか確認したところ、ディレクトリが存在しないことがわかりました。
これが原因で git fetch --unshallow が失敗していることは間違いなさそうです。

Step #2 - "Fetch github repo": drwxr-xr-x 5 root root 4096 Oct 23 23:58 .
Step #2 - "Fetch github repo": drwxr-xr-x 1 root root 4096 Oct 23 23:58 ..
Step #2 - "Fetch github repo": -rw-r--r-- 1 root root 1437 Oct 23 05:31 Dockerfile
Step #2 - "Fetch github repo": -rw-r--r-- 1 root root    0 Oct 23 13:27 README.md
Step #2 - "Fetch github repo": -rw-r--r-- 1 root root  231 Oct 23 05:18 image.yaml
Step #2 - "Fetch github repo": -rw-r--r-- 1 root root 4981 Oct 23 23:57 cloudbuild.yaml
Step #2 - "Fetch github repo": -rw------- 1 root root 3389 Oct 23 15:35 id_rsa
Step #2 - "Fetch github repo": -rw-r--r-- 1 root root  745 Oct 23 15:35 id_rsa.pub
Step #2 - "Fetch github repo": drwxr-xr-x 6 root root 4096 Oct 23 23:58 modules
Step #2 - "Fetch github repo": drwxr-xr-x 2 root root 4096 Oct 23 23:58 policy
Step #2 - "Fetch github repo": fatal: not a git repository (or any parent up to mount point /)

gcloud builds submit / Cloud Build Triggerでの挙動の違い

もう少し、調べてみると Cloud Build でのビルドの実行方法によって、Cloud Build (build step) でのソースコードなどのアセットの取得範囲に違いがあるようでした。

今回は、Cloud Build でのビルド実行方法として、gcloud コマンドを利用してビルドを実行する方法と GitHub repository と連携させた Build Trigger を定義する方法を比較しています。

gcloud builds submit のコマンドでビルドを実行する方法は下記のように説明されています。

https://cloud.google.com/build/docs/running-builds/start-build-command-line-api?hl=ja#running_builds

gcloud builds submit コマンド:

- current directory で参照される現在のディレクトリ内のアプリケーション コード、Dockerfile、その他のすべてのアセットを圧縮します。
- ファイルを Cloud Storage バケットにアップロードします。
- アップロードされたファイルを入力として使用して、ビルドを開始します。
- 指定された名前を使用してイメージをタグ付けします。
- ビルドされたイメージを Container Registry に push します。

ここでの注意点は、.git ディレクトリは GCS への upload 対象のアセットに含まれない ということです。
GCS に upload されたアセット(tar file)をローカルで確認すると、.git ディレクトリが含まれていないことが確認できます。

~/Downloads ❯❯❯ cd source_1635053943.906395-03cd9004eaaa4a6e80245072d9beb730
~/D/source_1635053943.906395-03cd9004eaaa4a6e80245072d9beb730 ❯❯❯ ls -al
total 40
drwxr-xr-x@  8 nishikawatakushi  staff   256 Oct 30 15:21 .
drwx------@ 24 nishikawatakushi  staff   768 Oct 30 15:21 ..
-rw-r--r--@  1 nishikawatakushi  staff  1651 Oct 24 14:38 Dockerfile
-rw-r--r--@  1 nishikawatakushi  staff   116 Oct 24 09:35 README.md
-rw-r--r--@  1 nishikawatakushi  staff   231 Oct 23 14:18 image.yaml
-rw-r--r--@  1 nishikawatakushi  staff  5709 Oct 24 14:32 cloudbuild.yaml
drwxr-xr-x@ 11 nishikawatakushi  staff   352 Jan  1  1970 modules
drwxr-xr-x@  4 nishikawatakushi  staff   128 Jan  1  1970 policy
~/D/source_1635053943.906395-03cd9004eaaa4a6e80245072d9beb730 ❯❯❯ 

次に、GitHub repository と連携させた Build Trigger を定義する方法は下記のように説明されています。

https://cloud.google.com/build/docs/automating-builds/create-manage-triggers

Git リポジトリでソースをビルドするために、Cloud Build はリポジトリのシャロー クローンを実行します。
つまり、ビルドを開始した単一の commit だけが、ビルドするワークスペースにチェックアウトされます。

Build Trigger のドキュメントに git fetch --unshallow の説明が記載されているように、GitHub repository と連携した Build Trigger を利用すると、--unshallow のオプション指定の fetch が成功します。

https://cloud.google.com/build/docs/automating-builds/create-manage-triggers#including_the_repository_history_in_a_build

Finished Step #2 - "Fetch github repo"
Step #2 - "Fetch github repo":  * [new branch]      main                   -> origin/main
Step #2 - "Fetch github repo":  * [new branch]      feature/setup-pipeline -> origin/feature/setup-pipeline
Step #2 - "Fetch github repo":  * [new branch]      main                   -> main
Step #2 - "Fetch github repo":  * [new branch]      feature/setup-pipeline -> feature/setup-pipeline
Step #2 - "Fetch github repo": From github.com:taxintt/xxx
Step #2 - "Fetch github repo": Warning: Permanently added the RSA host key for IP address '140.82.114.4' to the list of known hosts.
Step #2 - "Fetch github repo": git clone and fetch --unshallow
Step #2 - "Fetch github repo": git remote set-url
Step #2 - "Fetch github repo": Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2 - "Fetch github repo"

最後に

Cloud Build での git コマンド実行時のハマりどころについて簡単にまとめました。

Discussion