ローカル環境でGitLab CI実行時、GitLab Container Registoryの認証が度々 `Denied Access Forbidden`になってしまうのを回避する

GitLab CIをテストしたい時、ローカル環境にgitlab-runnerをインストールしてそのままテストすることが出来ます。
蛇足ですが、以下のような感じでセットアップします。

# install
brew install gitlab-runner

# ローカル実行
gitlab-runner exec docker test_job --env hoge=fuga

便利!! 1


GitLab Container Registoryを利用する

GitLabはリポジトリ毎にContainerRegistoryを持つことができます。
.gitlab-ci.ymlに以下のような記述を追記すると利用可能です。

image: oreore-gitlab.com:4567/charisma

services:
  - oreore-gitlab.com:4567/my-redis

test_job:
  script:
    - echo '4000man'

ただし、ローカルPCから実行すると何故か oreore-gitlab.com の認証時に denied: access forbidden でたま~に怒られることがあります。 複数リポジトリを利用していると失敗確率が増えるため、Max Retryに到達してしまいそもそも起動せずに終わってしまうことがあります。

原因/回避方法

そもそもの原因としては、dockerの認証に osxkeychain を利用していると認証が不安定になってしまうようです。
こちらを回避するには、.docker/config.json内の対象のauthにuser:passを直接記述してあげる必要があります。

# base64を得る
echo -n 'username:password' | base64

$HOME/.docker/config.json

{
    "auths": {
        ...
        "oreore-gitlab.com:4567": {
            "auth": "<base64文字列>"
        },
        ...
    },
    "credsStore": "osxkeychain"
}

これで確実に認証を通すことが出来ます。


まとめ

GitLab CI+GitLab Container Registoryをローカルで実行できるのは超絶便利ですが、こんなハマりどころもあるのでご注意くださいませ。


  1. オンデマンドで毎回起動ではなくdocker-composeのように実行環境だけ利用するテクニックもあったりしますが、それはまた別の機会に…