事象
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 の実行時間との兼ね合いかなと思います。
以上