GitHub Actions のアクションとして同一リポジトリーで定義した Docker イメージを使う

この記事では GitHub Actions のアクションとして同一リポジトリーで定義した Docker イメージを使う方法を説明します。

GitHub Actions のワークフローで Docker イメージをビルドする方法などは扱いません。

ここでアクションとワークフローの単語を次のように使い分けます。

  • アクション
    • …/action.yaml で定義する
    • ワークフローから参照される
  • ワークフロー
    • /.github/workflows/….yaml で定義する
    • アクションを参照する

まずリポジトリーのディレクトリー構成を示します。

  • /
    • .docker
      • Dockerfile
      • entrypoint.sh
    • .github
      • actions
      • workflows

次にそれぞれのファイルの役割を説明します。

/.docker/Dockerfile

イメージを定義する Dockerfile です。/.dockerディレクトリーは任意です。どこでも構いません。

Dockerfile の中身は次のようにしました。

FROM pandoc/ubuntu:2.10.1

COPY entrypoint.sh /

RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

/.docker/entrypoint.sh

コンテナー内で実行するスクリプトです。

#! /bin/sh

set -e

echo "Hello, $1!"

/.github/actions/hello/action.yaml

アクションを定義するファイルです。/.github/actions/helloディレクトリーは任意ですが、action.yaml の直上までがアクションの識別子となります。この場合は /.github/actions/hello が識別子です。

name: hello

description: say hello

inputs:
  whom:
    description: who to say hello
    required: true
    default: world

runs:
  using: docker
  image: ../../../.docker/Dockerfile
  args:
    - ${{ inputs.whom }}

usingdocker を指定することでアクションとして Docker イメージを使用できます。inputs でアクションの引数を定義し、runs.argsdocker run 時の引数として渡しています。

/.github/workflows/build.yaml

ワークフローを定義するファイルです。/.github/workflows/….yaml の形式のパスになります。

on : push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ./.github/actions/hello
        with:
          whom: Kazuki

jobs.….steps.uses に先ほど定義したアクションの識別子を指定します。

これで、GitHub Actions のワークフローで Docker イメージをビルドしてコンテナーを起動し実行することができます。

ちなみに Docker Hub にアップロードされたイメージを利用する場合は下記のように書けます。

jobs:
  build:steps:- uses: docker://alpine:3.8
      …

参照

docs.github.com

アクションとワークフローを別のリポジトリーにする場合は上記で解説されています。

docs.github.com

同一リポジトリー内に定義したアクションを参照する方法は上記で解説されています。

docs.github.com

GitHub Actions のアクションとする場合の Dockerfile の書き方は上記で解説されています。

docs.github.com

action.yaml の文法と意味については上記で解説されています。

docs.github.com

/.github/workflows/….yaml の文法と意味については上記で解説されています。