本投稿は数年前に書かれたものですので、情報が古いです。
以下の投稿はもっと新しい情報で書かれていますので、併せてご参照ください。
過去のプロジェクトでCodePipelineでサブモジュール入りのリポジトリをcloneしようと思ったときに一日頭を抱えていたときの話です。
やりたかったこと
とあるシステムのソースコードはBacklogのGitで管理していたのですが、ブランチの保護が出来なかったり外部連携がめんどかったりしたので、CodeCommitにリポジトリを作成してそこへのpushでデプロイさせるというパイプラインを組んでいました。
そのシステムのサブシステムを構築する際にパイプラインをそのまま流用したんですが、ソースコードがサブモジュールで構成されていたのでサブモジュール毎cloneする必要がありました。
できなかったこと
冒頭にも書いた通り、CodePipelineでサブモジュールが使えなかったんですよね。。
試してみたことと結果は↓の通りです。
- CodeBuildの
GitSubmodulesConfig
のFetchSubmodules
でサブモジュールをfetchしてくる設定をする→CodePipelineのArtifactでは使えない - CodeBuildでCodePipeline以外のところからsourceを取ってくる→CodePipeline以外のInputArtifactを許容してくれない
最悪、buildespec.ymlで submodule sync
書いてCodeBuild動かして終わりかなぁーなどと思ってたらそんな簡単な話ではなかったでした。なんでサブモジュールにしたんだろ。。
やったこと
どう転んでもCodeCommitからサブモジュールは持って来られないということらしいので、もはや力技に頼るしかありません。
やったことは以下です。
- CodeCommitはただのCodePipelineのトリガーにさせる
- CodeBuildでソースをリポジトリをcloneする
- サブモジュールをsyncする
buildspec.ymlは以下のようになります。
version: 0.2
env:
variables:
remote_origin: "hoge.git.backlog.jp"
remote_user: "hoge"
parameter-store:
backlog_build_ssh_key: "ssh-key"
phases:
install:
commands:
- export OLDDIR=$PWD
- export GIT_ALLOW_PROTOCOL="ssh"
- cd
- mkdir -p ~/.ssh
- cd .ssh
- echo "$backlog_build_ssh_key" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keygen -F "$remote_origin" || ssh-keyscan "$remote_origin" >> ~/.ssh/known_hosts
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_rsa
- cd $OLDDIR
- git clone "$remote_user"@"$remote_origin":/{Backlogのプロジェクト名}/{リポジトリ名}.git
- cd {リポジトリ名}
- git checkout master
- git submodule sync
- git submodule update --init
artifacts:
files:
- '**/*'
base-directory: {リポジトリ名}
SSH用に秘密鍵が必要になるので、SSMパラメータで管理しているものを取得しています。
結論
そもそもサブモジュールにする必要がなかった。Composerでいいじゃん。。