Cloud Buildで git fetch --unshallow する時の注意点
Cloud Build を利用している際に、少しハマったことがあったので備忘録として記事を書いておきます。
何があったか?
Cloud Build で git fetch --unshallow
を含むビルド処理を gcloud builds submit
コマンドを利用して実行したところ、下記のようなエラーになりました。
エラー的には、git の設定か .git
ディレクトリに原因がありそうな内容でした。
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
のコマンドでビルドを実行する方法は下記のように説明されています。
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 を定義する方法は下記のように説明されています。
Git リポジトリでソースをビルドするために、Cloud Build はリポジトリのシャロー クローンを実行します。
つまり、ビルドを開始した単一の commit だけが、ビルドするワークスペースにチェックアウトされます。
Build Trigger のドキュメントに git fetch --unshallow
の説明が記載されているように、GitHub repository と連携した Build Trigger を利用すると、--unshallow
のオプション指定の fetch が成功します。
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