メモ: CodePipelineでキックしたCodeBuildでgit submoduleを使う


タイトル通りのメモです。元ネタはここです。

CodePipelineでCI/CDを組んでいて、CodeStar Connectionsを使ってCloneしたリポジトリの中のsubmoduleを後続のCodeBuildで使いたかったのですが、なかなか解決策にたどり着けませんでした。

結論から言うと、env.git-credential-helperを使ってごくシンプルに実現可能です。

buildspecの例は以下です。

version: 0.2

env:
  git-credential-helper: yes

phases:
  pre_build:
    commands:
      - git submodule update --init --recursive

注意点としては、Output artifact formatをFull clone(CloudFormationでは CODEBUILD_CLONE_REF)を指定する必要があることが挙げられます。これを指定しないと.gitフォルダが落ちて来ず、gitコマンドを使うことができません。

他の選択肢

この手法が使えない場合は、別のやり方を模索する必要があります。
CI用のユーザを新規に作成し、そのユーザのトークンをSSMパラメータ等を用いてCodeBuildに持ってくる方法などがあるようですが、やはりやや大仰に感じられますね。

また、CodeBuildにはGitSubmodulesConfig.FetchSubmodulesというオプションもあるのですが、こちらはPipelineでトリガーする場合には使えないようです。

Git submodules config is not supported for CodePipeline source