github actionsでdockerイメージを作成し、Dockerhub&AmazonECRへpushする

※事前に各種「secrets」変数は設定しておいたください。
　→ログイン情報であったり、PUSH先のリポジトリ名になります

## ■secrets

※ github の 上部メニュー「settings」を選択し、「Secrets」メニューから追加してください。

|  キー |  -|
| ---- | ---- |
| AWS_ACCESS_KEY_ID | AWSのIAMから発行してください |
| AWS_SECRET_ACCESS_KEY  | AWSのIAMから発行してください |
| AWS_ECR_REPO_NAME  | ECRでリポジトリを作成してください |
| DOCKER_HUB_USERNAME  | docker hub のアカウントを生成してください |
| DOCKER_HUB_ACCESS_TOKEN   | docker hub から発行してください |
| SLACK_WEBHOOK  | slackから通知先を取得してください |

## ■yml

```create_image.yml
name: create image

# トリガーになります。
# イメージを作成したいタイミングを記載します。
# 下記の場合、githubのタグを生成した際に先頭に「v」をつけると処理が実行されます
on:
  push:
    tags:
      - v*

jobs:
  create:
    runs-on: ubuntu-latest

    steps:
      # ソースを src 配下に配置
      - name: checkout
        uses: actions/checkout@v2
        with:
          path: src

      # 準備処理
      - name: setup
        run: |
          ### タグ名を取得
          CURRENT_VERSION=$(echo $GITHUB_REF | sed 's/refs\/tags\///')
          ### リポジトリ名を少々カスタマイズ（dockerhubやecrにpushするための）
          REPO_NAME=$(echo ${{ github.repository }} | sed -e 's/^.\+\/\(.\+\)$/\1/g')
          ### 次のstepに値を渡す
          echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV
          echo "REPO_NAME=$REPO_NAME" >> $GITHUB_ENV

      # AWSのログイン処理（アクセスキーやシークレットキーをAWSから取得＆設定をしておいてください）
      - name: setup - AWS
        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

      # ECRのログイン処理
      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1

      # dockerイメージを作成
      - name: build image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
        run: |
          ### dockerhubのPUSH先のタグ名を作成
          DOCKER_HUB_BASE_NAME=${{ secrets.DOCKER_HUB_USERNAME }}/${{ env.REPO_NAME }}
          TAG_HUB=${DOCKER_HUB_BASE_NAME}:${{ env.CURRENT_VERSION }}
          ### ECRのPUSH先のタグ名を作成（privateリポジトリ用）
          AWS_ECR_BASE_NAME=${ECR_REGISTRY}/${ECR_REPOSITORY}
          TAG_ECR=${AWS_ECR_BASE_NAME}:${{ env.CURRENT_VERSION }}
          ### dockerコマンドでイメージを作成（dockerhubとecrの両方のタグを設定しています）
          docker build src/. --target prod -t ${TAG_HUB} -t ${TAG_ECR} \
            --build-arg TEST_ARG=123
          ### 次のstepにタグ名を渡す
          echo "TAG_HUB=$TAG_HUB" >> $GITHUB_ENV
          echo "TAG_ECR=$TAG_ECR" >> $GITHUB_ENV

      # ECRへpush
      - name: push - Amazon ECR
        run: |
          docker push ${{ env.TAG_ECR }}

      # dockerhubにログイン
      - name: setup - Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

      # dockerhubへpush
      - name: push - dockerhub
        run: |
          docker push ${{ env.TAG_HUB }}

      # 完成したことを通知する
      - name: complete
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
          SLACK_MESSAGE: "image を作成しました。"
```

:::note info
※Stack Overflow等の多くのサイトを参考にさせて頂いています。
:::