GithubContainerRegistryにコンテナを自動Pushする簡単なActionを作ってみた

※ 注: 半年以上放置していた記事です 現在はGitlabを使っておりこのアクションは利用していません...

## あらすじ
手動でビルドしたりすると時間はかかってしまうし、地味にPCに負荷かかる。そこで、Github ActionsCI上で全自動でなんとかコンテナを作るようにしたい。しかし、リリースバージョンとかなにやらを指定するのはもうめんどくさいのでやらないと割り切り、日付タグだけをつけてコンテナを作るアクションが欲しくなりました。ついでにGithub Container Registryも試したくなったので試しました。

### なぜ Github Container Registry?
- 1 プライベートコンテナにしたかったから。
  - (DockerHubでは無料プライベートコンテナは1つまで)
- 2 リポジトリをサイト上で見たときの右欄に載ってたらなんかかっけー感があるから。
  - (つまりただのロマン)
- 3 自分でContainer Registry Serverを建てるのは大変だったから
  - (主に自己署名/SSL関連の設定がよくわからなかった...)

## 今回作ったアクションの仕様
- Githubのmainブランチにマージ(push)されたときコンテナを作る
  - 自動実行!
- Github Container Registryに コンテナを入れる
  - 無制限のプライベートコンテナ!
- AMD64 / ARM64 両対応
  - Oracleの無料インスタンスでもローカルでも使えるようにしたい!
- バージョン管理はしない
  - 個人用途だから、とにかく過去バージョンが残りさえすればいい!
    - 日付と時刻をコンテナタグにつけてくれ!
- Botアカウントにリリースさせる
  - 気持ち的に個人アカウントでリリースしたくない!

## 実際作ったアクション

### 前提
- Dockerfileをリポジトリ直下に用意
- Setting->Secrets->Actions に BOT_NAME と BOT_TOKEN(PERSONAL_ACCESS_TOKEN)を入力

### アクション本体
```.github/workflows/build-container.yml
name: Build and push image
on:
  push:
    branches:
      - main

jobs:
  push:
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/checkout@v3

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-
      - name: Prepare Current Date Arg
        env:
          TZ: 'Asia/Tokyo' # タイムゾーン指定
        run: echo "CURRENT_DATETIME=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV

      - name: Prepare Repository Name
        run: |
          echo "REPO_LC=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV}
        env:
          GITHUB_REPOSITORY: ${{ github.repository }}

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ secrets.BOT_NAME }}
          password: ${{ secrets.BOT_TOKEN }}

      - name: Build and push Docker image to GitHub Container Registry
        uses: docker/build-push-action@v2
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: |
            ghcr.io/${{ env.REPO_LC }}:${{ env.CURRENT_DATETIME }},ghcr.io/${{ env.REPO_LC }}:latest
          labels: |
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache-new

      - name: Move cache
        run: |
          rm -rf /tmp/.buildx-cache
          mv /tmp/.buildx-cache-new /tmp/.buildx-cache
```

### 簡単な処理の流れ
- 1 Dockerxのビルド環境を用意する
- 2 既存コンテナのキャッシュを利用する
- 3 タグに使うビルド日付時刻を環境変数に書き出す
- 4 イメージ名をリポジトリ名から生成して環境変数に書き出す
- 5 Github Container Registryにログインする
- 6 ビルドしてイメージを Github Container Registry にアップロードする

### できあがる例
下記画像のようなクールなやつができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254984/3bfd8c5f-e770-692b-0c06-f069ef14ce72.png)

## 感想
自分のOrgでは当たり前のようにこのActionを流用しまくっているが、そういえばなんだかんだちょこっと作るのに苦戦したので、GithubActionsに不慣れな(自分のような)方に向けて、記事を書いてみました。実際便利でGithubActionsええやん!と思うようになったきっかけでもあるので、明確なバージョン管理が必須ではない、個人開発の方にはいかがでしょうか?