au Commerce&Life Tech Blog

au コマース&ライフ株式会社の開発ブログ

JenkinsのフリースタイルジョブでAWS ECRにイメージ登録!

f:id:seri_wb:20181114205542p:plain

KDDIコマースフォワード㈱ 、略称「KCF」は2019年4月1日、同グループ会社の㈱ルクサと合併し「auコマース&ライフ株式会社」として再設立いたしました。  本記事は2019年3月31日以前に書かれた記事のアーカイブとなります。予めご了承ください。

エンジニアの土田です。

今はシステムリプレイスからDMP構築に業務が変わり、データ収集に勤しんでいます。

JenkinsでのECRデプロイ

JenkinsでのECRデプロイ方法を調べていたところ、パイプラインジョブを使った記事はいくつか見つかったのですが、 昔ながらのフリースタイルジョブでの手順が見当たらなかったので、今回はその方法を記載します。

作業概要

実現のためには、以下を行う必要があります。

  • ECRにアクセスするためのアクセスキー発行
  • JenkinsサーバにDockerをインストール
  • JenkinsサーバにAWS CLIをインストール
  • Jenkinsに必要なプラグインのインストールと設定
  • Jenkinsでデプロイ用のジョブ作成

Jenkinsサーバの設定

まだ、JenkinsでDockerを使っていない場合は、JenkinsにDockerをインストールしてください。

インストールできたら、Jenkinsの実行ユーザ(通常はjenkins)をdockerグループに所属させます。

$ sudo usermod -a -G docker jenkins
$ sudo systemctl restart jenkins

これで、JenkinsからDockerが利用できるようになります。

次に、JenkinsジョブからAWS CLIを使うためのプロファイルを作成します。
AWS CLIのインストールは以下のリンク参照

sudo -u jenkins aws configure --profile プロファイル名

実行すると以下のように問われるので、適時入力してください。

AWS Access Key ID [None]: アクセスキー
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json

これで、サーバ側での設定は終了です。

Jenkinsの設定

ここからはJenkinsのWeb画面の設定になります。

JenkinsからECRにイメージ登録するためには、以下のプラグインが必要になるので、こちらをインストールします。

Dockerプラグインの設定

Jenkinsの管理からシステムの設定を開き、『クラウド』の項目でDockerを追加し、設定をしてきます。

f:id:seri_wb:20181114204521p:plain:w600

といってもName以外はDocker Host URIが最低限設定できていれば問題ありません。

設定値はCentOSであればunix:///var/run/docker.sockになると思います。

認証情報の設定

ECRにイメージ登録をするためのアクセスキーの情報を、Jenkinsの認証情報として登録します。

認証情報を登録する際は、認証情報をジョブから利用できるスコープが選択できます。 フォルダから認証情報のページに遷移すると、『Stores scoped to フォルダ名』のような項目があるので、 スコープ設定をしたい場合は、そこから遷移した先で認証情報を追加すると良いです。

認証情報の追加で、AWS Credentialsを選択し、先程のアクセスキー情報を設定してください。

f:id:seri_wb:20181114204507p:plain:w600

フリースタイルジョブの作成

いよいよジョブ作成です。

まずはソースコード管理に、作成するコンテナイメージを作るDockerfileが記載されたリポジトリを指定します。

次に、ビルド項目の『ビルド手順の追加』からBuild / Publish Docker Imageを選択します。

f:id:seri_wb:20181114204439p:plain:h300

『Build / Publish Docker Image』は以下のようになっているので、高度な設定ボタンを押下し、すべての項目を表示させてください。

f:id:seri_wb:20181114204450p:plain:w600

各項目に設定する値は以下のようになります。

項目
Directory for Dockerfile コードリポジトリのルートからたどってDockerfileのある場所
Docker registry URL https://ECRリポジトリのURI
Registry credentials ECRリポジトリの存在するリージョンの入ったキー情報
Cloud システム設定のクラウドで追加したDocker設定の名前
Image ECRのプッシュコマンドで指定されるタグ名
Push image チェックする
Registry Credentials 上記のクレデンシャルと同じ

これらの値を設定した画面が以下です。

f:id:seri_wb:20181114204535j:plain:w600

これで設定は完了です。

あとはこのジョブを実行すると、コンテナイメージが作成され、そのイメージがECRへ登録されます。


ECRのイメージへ独自タグの追加

コンテナイメージの運用をしていると独自のタグが必要になると思いますが、 今のところECRのコンソールからタグ追加はできないので、これもついでにJenkinsで行ってしまいましょう。

Jenkinsのシェル実行で、以下のようなタグ追加のCLIコマンドを記載してください。

$(aws ecr get-login --no-include-email --region ap-northeast-1 --profile 作成したプロファイル名)
 
MANIFEST=$(aws ecr batch-get-image --repository-name ECRのリポジトリ名 --image-ids imageTag=latest --query images[].imageManifest --output text --profile 作成したプロファイル名)
aws ecr put-image --repository-name ECRのリポジトリ名 --image-tag 付与するタグ名 --profile 作成したプロファイル名 --image-manifest "$MANIFEST"

必要なのはこれだけです。

まとめ

冒頭に書いたように、パイプラインを使って行う記事はあったのですが、昔ながらのやり方でやる方法がなかったのでまとめてみました。
Jenkinsはパイプラインが出てきてからGUIを使わないやり方が推されている感じがしますが、昔ながらのやり方もわかりやすくて良いと思うので、 状況にあわせて使っていきたいです。

ちなみにこれらの内容はAWS Batchで使うイメージのプッシュと、本番環境で参照するイメージ切り替えのためのタグ追加に利用しています。 プッシュして、開発でテストが終わったら本番用のタグを付与、といった感じで運用しています。

参考