GitLab Runner: gitへPushする際にgit remoteをキャッシュしてしまいエラーになる件

事象

GitLab Runner上でgitlab-ci.yamlの処理の中で、2度目の実行から、git remote add した際にリモートリポジトリの宛先が既に登録されているとエラーが表示される。

$ git remote add codecommit https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
fatal: remote codecommit already exists.

原因

GitLab Runner が GitLab リポジトリを持っている方法が、Git fetch になっていたため、git remote がそのまま残ってしまったことが原因です。

対処方法

対処方法は2通りあります。

  • 対処方法1: IF文で分岐処理させる
  • 対処方法2: リポジトリの取得方法をgit clone方式に変更

対処方法1: IF 文で分岐処理させる

単純にremoteに登録されていたら、set-urlで上書きをするif分で分岐処理する方法です。

修正前のコード
  script:
    - git config --global credential.helper '!aws codecommit --profile codecommit credential-helper $@'
    - git config --global credential.UseHttpPath true
    - git remote add codecommit https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
    - git push codecommit master
修正したコード
  script:
    - git config --global credential.helper '!aws codecommit --profile codecommit credential-helper $@'
    - git config --global credential.UseHttpPath true
    - >-
      if [ "codecommit" = $(git remote | grep codecommit) ]; then
        git remote set-url codecommit https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
      else
        git remote add codecommit https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
      fi
    - git push hogehoge master

対処方法2: リポジトリの取得方法を git clone 方式に変更

Runner によって実行されるたびに、リポジトリから git clone するため、remote の宛先リポジトリが保持され続けられる減少は回避できます。
ただ差分更新の fetch と比較して clone は 時間を要するので、Runner の実行時間との兼ね合いかなと思います。

以上