ECRの更新をGithub Actionsで自動化してみた
はじめに
チーム内の定常業務として、社内システムに関するイメージをローカルでビルドし、AmazonECRにpushするという作業がありました。
しかし、毎回同じコマンドをローカルで実行しているだけだったため、CIを用いて自動化できないかを検討しました。
今回は、社内システムに関するECRの更新を、Github Actionsを用いて自動化した話をご紹介します。
本題
完成形
早速ですが、完成形は以下の通りです。
name: AppBuild
on:
workflow_dispatch:
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_USERNAME: test
SLACK_ICON: https://ec-force.com/favicon.ico
SLACK_CHANNEL: test-slack-channel
jobs:
app-build:
runs-on: ubuntu-latest
steps:
- uses: styfle/cancel-workflow-action@0.9.1
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Set env variables
env:
TZ: "Asia/Tokyo"
run: |
echo "DATE_TODAY=$(date +'%Y%m%d')" >> $GITHUB_ENV
- name: Build, tag, and push docker image `app` to Amazon ECR
env:
IMAGE_NAME: app
ECR_URL: ${{ steps.login-ecr.outputs.registry }}
DOCKERFILE_PATH: docker/Dockerfile
run: |
docker build . -t $IMAGE_NAME:${{ env.DATE_TODAY }} --platform linux/amd64 -f $DOCKERFILE_PATH --rm=true
docker tag $IMAGE_NAME:${{ env.DATE_TODAY }} $ECR_URL/$IMAGE_NAME:${{ env.DATE_TODAY }}
docker push $ECR_URL/$IMAGE_NAME:${{ env.DATE_TODAY }}
- name: Slack Notification on Success
if: success()
uses: rtCamp/action-slack-notify@v2.0.2
env:
SLACK_TITLE: イメージ更新に成功しました
SLACK_COLOR: good
- name: Slack Notification on Failure
uses: rtCamp/action-slack-notify@v2.0.2
if: failure()
env:
SLACK_TITLE: イメージ更新に失敗しました
SLACK_COLOR: danger
コード解説
workflow_dispatch
別システムのリリースに合わせてこのワークフローを実行する必要があるため、手動実行できる workflow_dispatch
を採用しました。
ECRのURL取得
ライブラリ aws-actions/amazon-ecr-login
を使用すると、ログインしたECRの情報を取得できます。
以下のように、 login-ecr
というidを付与し、 ${{ steps.login-ecr.outputs.xxx }}
といった形で参照できます。
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
env:
ECR_URL: ${{ steps.login-ecr.outputs.registry }}
実行日(YYYYMMDD)でタグ付け
チーム内で 実行日(YYYYMMDD) でタグ付けができること
というルールで運用しているため、これをyml上で実現する必要があります。
Github Actionsには、後続のステップでも環境変数を利用できるように、
GITHUB_ENV
という共有領域があります。
実行日でタグ付けするにあたり、 YYYYMMDD
をechoし GITHUB_ENV
に書き込み、 ${{ env.XXX }}
で参照という形で実現しました。
echo "DATE_TODAY=$(date +'%Y%m%d')" >> $GITHUB_ENV
${{ env.DATE_TODAY }}
苦戦したところ
ここでは使用していませんが、環境変数の後ろ :latest
が意図しない値になりました。
export IMAGE_NAME=app
echo $IMAGE_NAME:latest
#=> appatest (期待値は `app:latest`)
これを回避するために latest
も環境変数化しました。
export IMAGE_NAME=app
export LATEST_TAG=latest
echo $IMAGE_NAME:$LATEST_TAG
#=> app:latest
他にGithubActionsで動かしているもの
他にも以下のような自動化を組んでいます。
- フロントのコードがビルドできるかの事前検証
- フロントエンドをビルドしてECRにpush
- PythonコードをビルドしてECRにpush
- functionに対するpytest実行
まとめ
今回はGithub Actionを用いて、Dockerイメージをビルドし、ECRを更新する手順を自動化しました。
Github Actionsは実行したいステップを上から下に書けるため、ワークフローの実装をより簡単にできました。
ライブラリも充実しており、やりたいことが1ステップや1行で書けるところも魅力的だと思いました。
またGithub Actionsのコードは 実行ができる仕様書
のようなもので、ドキュメントの肥大化を防ぐことにも繋がると感じました。
SUPER STUDIOの採用について
SUPER STUDIOでは、積極的にエンジニアを採用しています。
少しでも興味がありましたら、以下の記事をご覧ください。
また、下記はSUPER STUDIOで年に一度開催されるKICKOFFイベントにて、社内表彰されたエンジニアの受賞インタビューです。SUPER STUDIOのエンジニア組織についてより理解を深められる内容となっておりますので、ぜひご一読ください。
Discussion