※ 注: 半年以上放置していた記事です 現在は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 にアップロードする
できあがる例
感想
自分のOrgでは当たり前のようにこのActionを流用しまくっているが、そういえばなんだかんだちょこっと作るのに苦戦したので、GithubActionsに不慣れな(自分のような)方に向けて、記事を書いてみました。実際便利でGithubActionsええやん!と思うようになったきっかけでもあるので、明確なバージョン管理が必須ではない、個人開発の方にはいかがでしょうか?