⛄️

Jibで作ったコンテナイメージをGitHub Packagesへデプロイする

2021/02/11に公開

概要

jib-maven-pluginを使ってコンテナイメージを作ってGitHub Packagesへデプロイする、というのをGitHub Actionsで行う方法です。

jib-maven-pluginでコンテナイメージをビルドする

jib-maven-pluginではbuildゴールでコンテナイメージをビルドしつつpushできます(ちなみに、コンテナイメージをビルドしつつローカルのDockerへ保存する場合はdockerBuildゴールを使用します)。

buildゴールに必要な値のいくつかはシステムプロパティで渡せます。

項目 システムプロパティ
コンテナイメージ jib.to.image
バージョン jib.to.version
push先のユーザー名 jib.to.auth.username
push先のパスワード jib.to.auth.password

コマンドの例は後ほど登場します。

GitHub Actionsのワークフロー定義を書く

ソースコードのチェックアウトやJavaのセットアップ、Mavenローカルリポジトリのキャッシュなどは一般的なJavaプロジェクトと同様です。

コンテナイメージのビルドとpushもMavenを用いるので、一般的なJavaプロジェクトとそう変わりはありません。
前のセクションで解説した値を設定しつつmvnコマンドを組み立てます。

pushするときのコンテナイメージ名はConfiguring Docker for use with GitHub Packagesにあるようにdocker.pkg.github.com/OWNER/REPOSITORY/IMAGE_NAME:VERSIONという形式です。
push先のユーザー名はGitHubのアカウント、パスワードはPersonal access tokenです。
MavenでGitHub PackagesへJARをデプロイするという記事でも書いたのですが、GitHub ActionsではsecretsコンテキストからGITHUB_TOKENという名前でPersonal access tokenを取得できます。

以上のことから、コンテナイメージをビルドしてpushするmvnコマンドは次のようになります(ユーザー名はbackpaper0、GitHubリポジトリ名はdemorepoとします)。

mvn -B package jib:build \
    -Djib.to.image=docker.pkg.github.com/backpaper0/demorepo/demo \
    -Djib.to.version=latest \
    -Djib.to.auth.username=backpaper0 \
    -Djib.to.auth.password=${{ secrets.GITHUB_TOKEN }}

ワークフロー定義の例の全体は次の通りです。

name: Building container image with Jib

on:
  push:
    branches: [ master ]

jobs:
  build:
    name: Build container image
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-java@v1
        with:
          java-version: 11

      - uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build by Jib
        env:
          CONTAINER_IMAGE: docker.pkg.github.com/backpaper0/demorepo/demo
        run: |
          mvn -B package jib:build -DskipTests \
              -Djib.to.image=$CONTAINER_IMAGE \
              -Djib.to.version=latest \
              -Djib.to.auth.username=backpaper0 \
              -Djib.to.auth.password=${{ secrets.GITHUB_TOKEN }}

以上です。

Discussion