SpringBoot + GradleのプロジェクトのCIをGitHub Actions + Dockerで回す(改)


はじめに

Spring Boot + GradleのプロジェクトのCIをGitHub Actions + Dockerで回すということを先日から試している。
こちらのドキュメントのやり方では、その都度イメージをビルドしてしまうので、非効率であるという指摘をもらった。

そこで、先日の記事とは別のやり方を試してみた。

以下、手順。

  1. パブリックなカスタムDockerイメージを作る
  2. workflow.ymlを修正
  3. コミットをプッシュする

パブリックなカスタムDockerイメージを作る

先日の記事と同様にamazoncorretto:11.0.7というDockerイメージを使用する。
ただ、このイメージはかなりミニマムに作ってあり、デフォルトではtargzipコマンドが使えない。
このままでは、リポジトリのチェックアウトなどができないので、これらをインストールしたイメージを用意する必要がある。

まずは、amazoncorretto:11.0.7をベースに自前のイメージを作成する。
DockerHubのパブリックなリポジトリにプッシュするという前提で進める。

最初に下のようなDockerfileを用意する。
targzipをインストールするだけの簡単なものになっている。

Dockerfile
FROM amazoncorretto:11.0.7
RUN yum install -y tar gzip

このDockerfileを使って、イメージをビルドする。

docker build .

DockerHubにリポジトリを作る。

DockerHubにログインする。
パスワードにはDockerHub上で作成したトークンを入力する。

docker login

先ほどビルドしたイメージに名前とタグを付ける。

docker tag {ImageID} shavada/mycorretto:11.0.7

リポジトリにイメージをプッシュする。

docker push shavada/mycorretto:11.0.7

これで、DockerHubからイメージをpullできるようになる。

workflow.ymlを修正

workflow.ymlを改めて書き直す。

./.github/workflows/workflow.yml
name: SpringBoot CI with Gradle

on:
  push:
    branches: [ master ]

jobs:
  test-build:
    runs-on: ubuntu-latest
    container:
      image: 'shavada/mycorretto:11.0.7'
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Add exec Permission
        run: chmod +x gradlew
      - name: Build with Gradle
        run: ./gradlew build
      - name: Archive production artifacts
        uses: actions/upload-artifact@v2
        with:
          name: demo.zip
          path: build/libs/demo-0.0.1-SNAPSHOT.jar
      - name: Archive test reports
        uses: actions/upload-artifact@v2
        with:
          name: test-reports.zip
          path: build/reports/tests/test

下のURLのドキュメントにも書かれている通り、ジョブの最初でcontainerを指定できる。

このようにしておくと、ジョブ内の全てのステップで同じコンテナが使用される。
また、先の記事ようにわざわざDockerfileを使ってその都度イメージをビルドすることなく、イメージをプルしてくるだけで済む。

プッシュする

修正のコミットをプッシュすると、ワークフローが成功する。
ジョブの最初にコンテナを作成し、その中で処理を行った後、最後にコンテナを片付けているのが分かる。