GitHub Actions 上で docker build するだけ

## 背景

割と最近 Docker を触るようになってきました。自作した Web アプリのデプロイ用 `Dockerfile` を作ったりなんかして。

で、「`Dockerfile` がちゃんとビルドできるか常に確かめる Actions Workflow も多分作れるよな？」と思ったのです。

ということで、(n番煎じかも分からん) 記事表題の通り。(※ 本記事では docker push はやりません)

GitHub Actions と Docker (cli) の基礎が分かっていれば、やることはとっても簡単。動作チェックされたサンプルコードとして見てもらえればと思います。

## 実装 (普通のビルド)

適当に GitHub リポジトリを作り、リポジトリルート直下に適当な `Dockerfile` を作ります。[別の記事で作った](https://qiita.com/aKuad/items/6f278607972463ee9c4f)、ubuntu に git 入れるだけのやつでやってみます。

```dockerfile
FROM ubuntu:latest

RUN apt update
RUN apt install -y git
```

そして workflow 作成。Docker のセットアップは [`docker/setup-buildx-action@v3`](https://github.com/marketplace/actions/docker-setup-buildx) を呼ぶだけで OK。

```.github/workflows/docker-build.yml
name: Docker build test

on: push

jobs:
  docker-build:
    runs-on: ubuntu-latest

    steps:
    - name: Source checkout
      uses: actions/checkout@v4
    - name: Set up docker buildx
      uses: docker/setup-buildx-action@v3
    - name: Build docker image
      run: docker build -t built-image .
```

push して結果確認。

![docker-actions-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/8d666c6b-73e9-8205-45e4-6ab89546fdf8.png)

![docker-actions-1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/3cd4acd7-3ac8-98e1-b40a-d742630d5884.png)

ビルドのログを確認できました。

### イメージファイルを出力してみる

もうちょっと応用を効かせて、作ったイメージを Artifact として出力させてみます。

Docker のコマンドでイメージを tar に出力した後、`actions/upload-artifact` で出力します。

```diff_yaml
name: Docker build test

on: push

jobs:
  docker-build:
    runs-on: ubuntu-latest

    steps:
    - name: Source checkout
      uses: actions/checkout@v4
    - name: Set up docker buildx
      uses: docker/setup-buildx-action@v3
    - name: Build docker image
      run: docker build -t built-image .
+   - name: Export docker image
+     run: docker save -o built-image.tar built-image
+   - name: Save image as artifact
+     uses: actions/upload-artifact@v4
+     with:
+       name: built-image.tar
+       path: built-image.tar
```

push して確認。

![docker-actions-2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/42ef959e-2e9b-4b8e-db48-47621f235861.png)

![docker-actions-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/ce84bfc0-fa67-20b2-4a96-cbd61a188a4b.png)

無事イメージが出力されました。

## 実装 (もっとリッチなビルド)

(2024/11/22 追記)

自分で Artifact 出力とかしていましたが、もっと良いのが用意されているではありませんか。

https://github.com/marketplace/actions/build-and-push-docker-images

```diff_yaml
name: Docker build test

on: push

jobs:
  docker-build:
    runs-on: ubuntu-latest

    steps:
    - name: Source checkout
      uses: actions/checkout@v4
    - name: Set up docker buildx
      uses: docker/setup-buildx-action@v3
    - name: Build docker image
-     run: docker build -t built-image .
+     uses: docker/build-push-action@v6
+     with:
+       context: .
+       push: false
+       cache-from: type=gha
+       cache-to: type=gha
```

(ここからビルド内容は、Git インストールじゃなくて[また別記事で作ったビルド](https://qiita.com/aKuad/items/0bef8ba384a79c43fdec)になります。ビルド時間の差が分かりやすいし。)

push して結果を見てみると？

![docker-build-action-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/64986cfc-fbd0-9a5f-7333-e1ef59b0a4ff.png)

ビルド結果が出力されているではありませんか。それに、いい感じにキャッシュしてくれる機能もあるようです。早速 Re-run all jobs してみると？

![docker-build-action-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540894/b7b3bdc4-8229-949f-e9fe-ba4528197c8d.png)

ビルド時間が 36秒からたったの 3秒に！(まぁ変更無しだからそりゃ早いけど･･･)

勝手に「push は用無いし」と思ってたら、push しなくても色々ありました。他にも色々オプションがあるようで、[Customizing](https://github.com/marketplace/actions/build-and-push-docker-images#customizing) を参照。

# おわり

これで、`Dockerfile` が壊れていないか自動テストすることができます。

~~それだけでなく、`docker push` も活用すれば自動でイメージをアップデートすることもできるようです。~~ Docker 公式で色々 Actions を用意してくれているようなので、探ってみると色々便利なものが見つかるかも。