🙌

ECRの更新をGithub Actionsで自動化してみた

2024/11/15に公開

はじめに

チーム内の定常業務として、社内システムに関するイメージをローカルでビルドし、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では、積極的にエンジニアを採用しています。
少しでも興味がありましたら、以下の記事をご覧ください。

https://hrmos.co/pages/superstudio/jobs/0000400
https://hrmos.co/pages/superstudio/jobs/0000414
https://hrmos.co/pages/superstudio/jobs/0010025

また、下記はSUPER STUDIOで年に一度開催されるKICKOFFイベントにて、社内表彰されたエンジニアの受賞インタビューです。SUPER STUDIOのエンジニア組織についてより理解を深められる内容となっておりますので、ぜひご一読ください。

https://www.wantedly.com/companies/super-studio/post_articles/497997
https://www.wantedly.com/companies/super-studio/post_articles/487617

SUPER STUDIOテックブログ

Discussion