GitHub Container registry が GA したので触ってみる
GitHub Container registry とは
GitHub Packages を構成する1つで Docker を始めとしたコンテナを扱えるレジストリです。
Docker registry (docker.pkg.github.com
) から Container registry (ghcr.io
) へ統合されました。
- パブリックコンテナへの匿名アクセス
- コンテナの Organizational レベルの所有権
- コンテナのきめ細かいパーミッション制御
- 有益な情報が豊富なコンテナ用ランディングページ
- コンテナの可視性はリポジトリの可視性から独立
- Organizational におけるコンテナの内部的な可視性設定
-
GITHUB_TOKEN
による Actions ワークフローからコンテナへのセキュアでシームレスなアクセス - Container registry (
ghcr.io
) へパブリッシュするためのクリーンな開始ワークフロー
TexturePacker イメージをビルド
サンプルとして CI で利用する TexturePacker[1] イメージを作成します。
ライセンスへの同意があるので今回作ったイメージを不特定ユーザーへ配ることはできませんが、プロジェクトの CI に組み込むためには役に立つのではないかと思います。
もちろんそういうのが関係ないイメージであれば配布可能です。
Dockerfile
まずはビルドする Dockerfile を用意します。
基本的にはリンク先にある Dockerfile の通りなのですが Ubuntu 18 から tzdata のインストール時にタイムゾーン選択が必要になったようで ENV DEBIAN_FRONTEND=noninteractive
を追加しています。
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 ワークフロー
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
でも大丈夫です。
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
のときのサンプルです。
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
等、パスはご利用の環境に応じて調整してあげてください。
- 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
オプションも付けた方がいいかもしれません。
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 におけるイメージの管理に使えそうです。
-
ゲーム等に利用されるスプライトシート画像の生成ツール ↩︎
Discussion