GitHub Actionsの最適化(Dockerビルド)の記録
GitHub Actionsを使用してマルチプラットフォーム対応のDockerイメージを構築する際、実行速度が常に遅かった。そこで、AIを使ってタスク構成ファイルを最適化した。
レンダリング中...
## 主な改善点(良かった点)
1. Checkout に `fetch-depth: 0` を追加:改善前はデフォルトでシャロークローン(`depth=1`)だったため、`git describe --tags` が履歴タグを正しく取得できず、バージョン番号の抽出に失敗することがよくありました。`fetch-depth: 0` を追加することで、信頼性が大幅に向上しました。
2. バージョン番号の出力方法を `$GITHUB_OUTPUT` に変更:これは正しく推奨される方法です。改善前は `>> $GITHUB_ENV` でも機能しましたが、`GITHUB_OUTPUT` はよりモダンでスコープが明確な方法です(特に後続のステップでの参照に適しています)。
3. 公式の `docker/build-push-action@v5` への切り替え:これが最大かつ最も重要な改善点です。
- `docker buildx build ...` コマンドを手動で記述する必要がなくなり、構文エラーのリスクが減少しました。
- マルチプラットフォームの manifest、プッシュ、タグなどを自動で処理します。
- コードがより簡潔になり、可読性が向上しました。
4. `setup-qemu-action` を追加:`linux/arm64` プラットフォームの場合、`ubuntu-latest(x86_64)` 上でビルドする際に QEMU エミュレーションが必要です。改善前はこのステップが不足しており、arm64 ビルドが失敗するか、非常に遅くなる可能性がありました。追加することでマルチプラットフォームサポートがより完全になりました。
5. Buildx キャッシュを有効化(`cache-from + cache-to: type=gha,mode=max`):特にマルチプラットフォーム + マルチステージの Dockerfile の場合、後続のビルド速度を大幅に向上させることができます。
6. `context: .` と `file: ./Dockerfile` を明示的に指定:より明確になり、` .` はデフォルト値ですが、明記することでメンテナンス性が向上します。
7. `steps.get_version.outputs.VERSION` を使用してバージョンを参照:`GITHUB_OUTPUT` と連携して使用します。
## 以前の設定
```yaml
name: Docker
on:
push:
tags:
- v*.*.*
jobs:
docker_build:
environment: docker_hub
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Get version
id: get_version
run: |
VERSION=$(git describe --tags --always --match 'v*' | sed -n 's|^v\([0-9]*\.[0-9]*\.[0-9]*\)\(-.*\)\{0,1\}|\1|p')
echo "VERSION=$VERSION" >> $GITHUB_ENV # バージョンを環境変数として保存
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker Buildx をセットアップ (マルチプラットフォームビルドをサポート)
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# マルチプラットフォームイメージを一度にビルドしてプッシュ
- name: Build and push multi-platform image
run: |
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag dingdangdog/jimily:${VERSION} \
--tag dingdangdog/jimily:latest \
--push .
- name: Clean up Docker images
run: docker system prune -af
```
## 新しい設定
```yaml
name: Docker
on:
push:
tags:
- v*.*.*
jobs:
docker_build:
environment: docker_hub
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # バージョン番号生成のためにタグが取得できることを保証
- name: Get version
id: get_version
# v5.1.3 から 5.1.3 のようにセマンティックバージョン番号を抽出
run: |
VERSION=$(git describe --tags --always --match 'v*' | sed -n 's|^v\([0-9]*\.[0-9]*\.[0-9]*\)\(-.*\)\{0,1\}|\1|p')
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64 # エミュレートするプラットフォームを明示的に指定
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push multi-platform image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
dingdangdog/jimily:${{ steps.get_version.outputs.VERSION }}
dingdangdog/jimily:latest
# 重要な改善:GitHub Actions キャッシュバックエンドを有効化
cache-from: type=gha
cache-to: type=gha,mode=max
# ビルド引数を渡す(Dockerfile で VERSION 変数が必要な場合は、以下の行を有効にしてください)
# build-args: |
# APP_VERSION=${{ steps.get_version.outputs.VERSION }}
```END
コメント
ログインしてコメントを閲覧・投稿してください
ログインへ