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

本投稿は数年前に書かれたものですので、情報が古いです。
以下の投稿はもっと新しい情報で書かれていますので、併せてご参照ください。


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

やりたかったこと

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

CodePipeline構成
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をコピーしました