GitHub Package Registry に GitHub Actions から Docker イメージを push

GitHub Actions に続き GitHub Package Registry も僕のアカウントで使えるようになりました。

github.com

blog.kondoumh.com

この時は、コンテナをビルドして終わりでしたが Registry が使えるようになったので コンテナイメージを格納する処理を追加してみます。

事前にアクセストークンを取得して、リポジトリの Settings で Secret を追加しておきます。

f:id:kondoumh:20190928101638p:plain

ワークフロー定義。イメージビルド後に Package Registry (docker.pkg.github.com) にログイン、イメージを push する処理を追加。

jobs:
  package:

    runs-on: ubuntu-latest

    steps:
          :
  build-image:

    needs: package
    runs-on: ubuntu-latest
 
    steps:
    - uses: actions/checkout@v1
    - uses: actions/download-artifact@master
      with:
        name: sb-sample-service.jar
        path: ./target

    - name: Build and push Docker image
      run: |
        docker build . --file Dockerfile --tag docker.pkg.github.com/kondoumh/sb-sample-service/app:latest
        docker login docker.pkg.github.com -u kondoumh -p ${{ secrets.DOCKER_REGISTRY_TOKEN }}
        docker push docker.pkg.github.com/kondoumh/sb-sample-service/app:latest

実行すると push 成功 しました。

f:id:kondoumh:20190928101821p:plain

格納されたコンテナを pull してみます。

$ docker login docker.pkg.github.com -u kondoumh
Password: 
  :
Login Succeeded

$ docker pull docker.pkg.github.com/kondoumh/sb-sample-service/app:latest
1.0: Pulling from kondoumh/sb-sample-service/app
e7c96db7181b: Pull complete 
f910a506b6cb: Pull complete 
c2274a1a0e27: Pull complete 
87e0b7342010: Pull complete 
Digest: sha256:97f2da5372e9f659dbe976e245835a4cb082960b2b6aac96ca6e84cdc7305d5b
Status: Downloaded newer image for docker.pkg.github.com/kondoumh/sb-sample-service/app:latest


$ docker image ls
REPOSITORY                                             TAG                 IMAGE ID            CREATED             SIZE
docker.pkg.github.com/kondoumh/sb-sample-service/app   latest                 a9ed328094d5        31 minutes ago      138MB

大丈夫みたいです。

さて、上記ワークフローだと、Git のブランチ名やタグ名をイメージのタグ名に付与するような処理を書く必要があり、やや面倒です。探したらコンテナイメージのビルドとタグ付け、push までをやってくれる Action がありました。

github.com

Master ブランチでビルドした場合は latest タグをつけてくれるようです。これを使ってワークフローを書き直してみます。

   :
  build-image:

    needs: package
    runs-on: ubuntu-latest
 
    steps:
    - uses: actions/checkout@v1
    - uses: actions/download-artifact@master
      with:
        name: sb-sample-service.jar
        path: ./target

    - name: Build image and Publish to Registry
      uses: elgohr/Publish-Docker-Github-Action@master
      with:
        name: docker.pkg.github.com/kondoumh/sb-sample-service/app
        username: kondoumh
        password: ${{ secrets.DOCKER_REGISTRY_TOKEN }}
        registry: docker.pkg.github.com

run でコマンドを書くよりも行増えてますが、より宣言的なスタイルになっています。デフォルトだと docker.io に push しようとするので、registry パラメータで Package Registry の URL を指定する必要があります。

ログを見るとちゃんと latest タグをつけてくれています。

f:id:kondoumh:20190928102313p:plain

CI とレジストリを完全装備した GitHub、ソースコードだけでなく、ビルド成果物の生成と管理ができるようになってしまいました。