概要
GitLabには、DockerのRegistoryがついていますが、いろいろな大人の事情でAWS上にコンテナレジストリがあり、
そこに対してGitLab-CIでいろいろやりたい、というときの.gitlab-ci.ymlの内容です。
これで、毎回まっさらな環境でビルドが繰り返し行えるようになります。
前提
- ビルド環境には、gitlab-ciからDocker(Docker in Docker)を使う
試した環境
製品 | バージョン |
---|---|
GitLab-CE | 9.3.6 |
結論
こんな感じのymlになると思われる。
build_image:
image: gitlab/dind:latest
services:
- docker:dind
stage: release
before_script:
- curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
- python get-pip.py
- pip install awscli --ignore-installed six
- export AWS_ACCESS_KEY_ID=$BUILD_ACCESS_KEY
- export AWS_SECRET_ACCESS_KEY=$BUILD_SECRET_KEY
- export AWS_DEFAULT_REGION=$AWS_ECR_REGION
- export AWS_DEFAULT_OUTPUT=json
- login_string=`/usr/local/bin/aws ecr get-login --no-include-email`
- eval $login_string;
script:
- docker pull 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/barbar:2.1.0-SNAPSHOT
- docker build -t 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/piyopiyo:2017.4Q ./resources
- docker push 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge/piyopiyo:2017.4Q
解説
ECR用のdocker login
AzureやDockerHubでは、docker loginコマンドでユーザ名、パスワード等を渡すことでログインできますが、AWSのECRでは下記のようにしてdocker login文字列を取得する必要があります。
aws ecr get-login --no-include-email
この内容は、Amazon ECRのレポジトリのpushコマンドのところを押してでてくるコマンドのところです。
この結果を、login_stringとして格納し、evalでスクリプトとして実行することで、ログインを行います。
そもそもawsコマンドをはどこから
そもそもawsコマンドは以下のようにインストールすることができます、とあります。
https://aws.amazon.com/jp/cli/
pip install awscli
しかし、そもそもgitlab/dindにはpipが入ってない、というわけです。pipから入れた例が上記になります。
docker:latestは?
imageに、gitlab/dind:latestを指定しています。
GitLab-CIのドキュメント等では、docker:latestのイメージを利用している例が多いです。
image:docker:latest
このイメージにはcurlもpipも入っていないので、awscliを入れるのが遠くなります。なので、curlが入っていたgitlab/dind:latestを使いました。
aws configure相当の内容
awscliでは、キー、シークレットキー、リージョン、出力形式などをaws configure
を行うことで保存します。
これらの情報がない状態で、aws ecr get-login
を実行しても、エラーになります。
ファイルに書いておくよりも環境変数の方がビルド時に切り替えられて便利だろうということで、環境変数で渡しています。
上記の例では、exportが続いているところです。
環境変数に設定する値は、GitLabのPipeline設定の中で変数設定をした内容です。
ログイン後について
aws ecr get-login
のあと、docker loginが成功すれば、あとは通常のdocker pull、build、pushの要領です。
Dockerfileの場所、中に書いてる資材とのパスの関係に注意して終了です。