📦

GitHub Container registry が GA したので触ってみる

2021/07/10に公開

GitHub Container registry とは

GitHub Packages を構成する1つで Docker を始めとしたコンテナを扱えるレジストリです。
Docker registry (docker.pkg.github.com) から Container registry (ghcr.io) へ統合されました。

https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-container-registry

https://github.blog/2021-06-21-github-packages-container-registry-generally-available/

  • パブリックコンテナへの匿名アクセス
  • コンテナの Organizational レベルの所有権
  • コンテナのきめ細かいパーミッション制御
  • 有益な情報が豊富なコンテナ用ランディングページ
  • コンテナの可視性はリポジトリの可視性から独立
  • Organizational におけるコンテナの内部的な可視性設定
  • GITHUB_TOKEN による Actions ワークフローからコンテナへのセキュアでシームレスなアクセス
  • Container registry (ghcr.io) へパブリッシュするためのクリーンな開始ワークフロー

TexturePacker イメージをビルド

サンプルとして CI で利用する TexturePacker[1] イメージを作成します。
ライセンスへの同意があるので今回作ったイメージを不特定ユーザーへ配ることはできませんが、プロジェクトの CI に組み込むためには役に立つのではないかと思います。
もちろんそういうのが関係ないイメージであれば配布可能です。

Dockerfile

まずはビルドする Dockerfile を用意します。

https://www.codeandweb.com/texturepacker/documentation/docker-ci

基本的にはリンク先にある Dockerfile の通りなのですが Ubuntu 18 から tzdata のインストール時にタイムゾーン選択が必要になったようで ENV DEBIAN_FRONTEND=noninteractive を追加しています。

docker/texturepacker/Dockerfile
FROM ubuntu:latest

# tzdata
ENV DEBIAN_FRONTEND=noninteractive

# prepare ubuntu for TexturePacker
RUN apt-get update && \
apt-get install -y libgl1-mesa-glx libglib2.0-0 wget npm git dpkg && \
rm -rf /var/lib/apt/lists/*

# Copy pre-downloaded TexturePacker.deb package into container
COPY TexturePacker.deb /tmp
RUN /usr/bin/dpkg -i /tmp/TexturePacker.deb

# Uncomment this line if you agree to the license terms
# RUN echo agree | TexturePacker --version

配置するディレクトリはどこでも良いです。今回は docker/texturepacker/ にしました。

GitHub Actions ワークフロー

.github/workflow/texturepacker.yml
name: TexturePacker

on:
  push:
    paths:
      - .github/workflows/texturepacker.yml
      - docker/texturepacker/**/*
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-20.04
    timeout-minutes: 5
    strategy:
      matrix:
        version: [ 5.5.0, 5.4.0 ]
    defaults:
      run:
        working-directory: docker/texturepacker/

    steps:
      - uses: snow-actions/sparse-checkout@v1.1.0
        with:
          patterns: |
            docker/texturepacker/
      - name: Download TexturePacker.deb
        run: |
          curl -o TexturePacker.deb \
            https://www.codeandweb.com/download/texturepacker/${VERSION}/TexturePacker-${VERSION}-ubuntu64.deb
        env:
          VERSION: ${{ matrix.version }}
      - name: Build
        run: docker build -t ghcr.io/${OWNER,,}/texturepacker:${VERSION} .
        env:
          OWNER: ${{ github.repository_owner }}
          VERSION: ${{ matrix.version }}
      - name: Login
        run: echo $CR_PAT | docker login ghcr.io -u ${OWNER,,} --password-stdin
        env:
          CR_PAT: ${{ secrets.GITHUB_TOKEN }}
          OWNER: ${{ github.repository_owner }}
      - name: Push
        run: docker push ghcr.io/${OWNER,,}/texturepacker:${VERSION}
        env:
          OWNER: ${{ github.repository_owner }}
          VERSION: ${{ matrix.version }}

チェックアウト

モノリポを想定して sparse checkout していますが普通の actions/checkout でも大丈夫です。
https://github.com/snow-actions/sparse-checkout

TexturePacker.deb

Docker の build context の兼ね合いで Dockerfile と同じディレクトリに置くことを推奨。
必要あれば .gitignore へ。

ログイン

Docker registry では Personal Access Token の発行が必要でしたが Container registry では認証に GITHUB_TOKEN シークレットを使用できるようになりました。

タグ

タグ名に大文字は使えないので変数展開時に ${OWNER,,} で小文字にします。

大文字使用時のエラー
invalid argument "ghcr.io/SnowCait/texturepacker:5.5.0" for "-t, --tag" flag: invalid reference format: repository name must be lowercase

イメージの利用

認証なしで docker pull できます。
非公開にするためにはもう少し設定が要りそうです。(今回は割愛します)

CI

[YOUR-OWNER]snowcait のときのサンプルです。

.github/workflows/spritesheet.yml
name: Spritesheet

on:
  push:
    paths:
      - .github/workflows/spritesheet.yml
      - path/to/images/**/*
  workflow_dispatch:

  texturepacker:
    runs-on: ubuntu-20.04
    timeout-minutes: 30
    env:
      TEXTUREPACKER_TAG: ghcr.io/snowcait/texturepacker:5.5.0

    steps:
      - name: License agreement
        run: docker run ${TEXTUREPACKER_TAG} TexturePacker

ライセンスの同意を求められます。
指示に従い Dockefile のコメントを解除しましょう。

ライセンスに同意すると以下のような形で使えるようになります。
リポジトリの Settings > Secrets に TEXTUREPACKER_LICENSE_KEY を登録しています。
source=/tmp/spritesheets 等、パスはご利用の環境に応じて調整してあげてください。

.github/workflows/spritesheet.yml
      - name: Version
        run: docker run ${TEXTUREPACKER_TAG} TexturePacker --version
      - name: License (Not activated)
        run: docker run ${TEXTUREPACKER_TAG} TexturePacker --license-info
      - name: License (Activated)
        run: docker run ${TEXTUREPACKER_TAG} TexturePacker --activate-license ${LICENSE_KEY} --license-info
        env:
          LICENSE_KEY: ${{ secrets.TEXTUREPACKER_LICENSE_KEY }}
      - name: Spritesheet
        run: |
          docker run ${TEXTUREPACKER_TAG} \
          --mount type=bind,source=/tmp/spritesheets,target=/spritesheets \
          TexturePacker --activate-license ${LICENSE_KEY} /spritesheets/*.tps
        env:
          LICENSE_KEY: ${{ secrets.TEXTUREPACKER_LICENSE_KEY }}

コマンド

公式ドキュメントの通りですが --rm オプションも付けた方がいいかもしれません。

Bash
docker run ghcr.io/[YOUR-OWNER]/texturepacker:[VERSION] \
--mount type=bind,source=/tmp/spritesheets,target=/spritesheets \
TexturePacker --activate-license [YOUR-LICENSE-KEY] /spritesheets/*.tps

まとめ

Docker Hub の利用制限回避や CI/CD におけるイメージの管理に使えそうです。

脚注
  1. ゲーム等に利用されるスプライトシート画像の生成ツール ↩︎

Discussion