LoginSignup
12
9

More than 5 years have passed since last update.

GitLab-CIでAmazon ECRからpullしてbuildしてpushする

Last updated at Posted at 2017-07-18

概要

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コマンドのところを押してでてくるコマンドのところです。

Amazon EC2 Container Service.png

この結果を、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 CLI 環境変数チートシート

ログイン後について

aws ecr get-loginのあと、docker loginが成功すれば、あとは通常のdocker pull、build、pushの要領です。
Dockerfileの場所、中に書いてる資材とのパスの関係に注意して終了です。

参考

12
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9