AWS CodePipelineでサブモジュールを使う

Tech

過去のプロジェクトでCodePipelineでサブモジュール入りのリポジトリをcloneしようと思ったときに一日頭を抱えていたときの話です。

やりたかったこと

とあるシステムのソースコードはBacklogのGitで管理していたのですが、ブランチの保護が出来なかったり外部連携がめんどかったりしたので、CodeCommitにリポジトリを作成してそこへのpushでデプロイさせるというパイプラインを組んでいました。

CodePipelineの構成

そのシステムのサブシステムを構築する際にパイプラインをそのまま流用したんですが、ソースコードがサブモジュールで構成されていたのでサブモジュール毎cloneする必要がありました。

サブモジュールのイメージ

できなかったこと

冒頭にも書いた通り、CodePipelineでサブモジュールが使えなかったんですよね。。

試してみたことと結果は↓の通りです。

  • CodeBuildのGitSubmodulesConfigFetchSubmodulesでサブモジュールをfetchしてくる設定をする→CodePipelineのArtifactでは使えない
  • CodeBuildでCodePipeline以外のところからsourceを取ってくる→CodePipeline以外のInputArtifactを許容してくれない

最悪、buildespec.ymlで submodule sync 書いてCodeBuild動かして終わりかなぁーなどと思ってたらそんな簡単な話ではなかったでした。なんでサブモジュールにしたんだろ。。

やったこと

どう転んでもCodeCommitからサブモジュールは持って来られないということらしいので、もはや力技に頼るしかありません。

やったことは以下です。

  1. CodeCommitはただのCodePipelineのトリガーにさせる
  2. CodeBuildでソースをリポジトリをcloneする
  3. サブモジュールを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でいいじゃん。。

タイトルとURLをコピーしました