Skip to main content

Docker コンテナーのアクションを作成する

このガイドでは、Docker コンテナのアクションを作成するために最低限必要なステップを案内します。

注: GitHub ホステッド ランナーは、現在 GitHub Enterprise Server でサポートされていません。 GitHub public roadmap で、今後の計画的なサポートの詳細を確認できます。

はじめに

このガイドでは、パッケージ化されたDockerコンテナのアクションを作成して使うために必要な、基本的コンポーネントについて学びます。 アクションのパッケージ化に必要なコンポーネントのガイドに焦点を当てるため、アクションのコードの機能は最小限に留めます。 このアクションは、ログに "Hello World" を出力するものです。また、カスタム名を指定した場合は、"Hello [who-to-greet]" を出力します。

このプロジェクトを完了すると、あなたの Docker コンテナのアクションをビルドして、ワークフローでテストする方法が理解できます。

セルフホストランナーでDockerコンテナアクションを実行するためには、Linuxオペレーティングシステムを使い、Dockerがインストールされていなければなりません。 セルフホステッド ランナーの要件の詳細については、「セルフホステッド ランナーについて」を参照してください。

警告: ワークフローとアクションを作成するときは、コードが攻撃者からの信頼されていない入力を実行する可能性があるかどうかを常に考慮する必要があります。 攻撃者が悪意あるコンテンツを挿入してくるかもしれないので、特定のコンテキストは信頼できない入力として扱うべきです。 詳細については、「スクリプト インジェクションのリスクについて」を参照してください。

前提条件

GitHub Actionsの環境変数及びDockerコンテナのファイルシステムに関する基本的な理解があれば役立つでしょう。

始める前に、GitHub リポジトリを作成する必要があります。

  1. your GitHub Enterprise Server instance に新しいリポジトリを作成します。 リポジトリ名は任意です。この例のように "hello-world-docker-action" を使ってもいいでしょう。 詳細については、「新しいリポジトリの作成」を参照してください。

  2. リポジトリをお手元のコンピューターにクローンします。 詳細については、「リポジトリをクローンする」を参照してください。

  3. ターミナルから、ディレクトリを新しいリポジトリに変更します。

    Shell
    cd hello-world-docker-action

Dockerfileの作成

新しい hello-world-docker-action ディレクトリに、新しい Dockerfile ファイルを作成します。 問題が発生する場合は、ファイル名で大文字が正しく使用されていることを確認します (D は大文字にしますが、f は大文字にしません)。 詳細については、「GitHub Actions のための Dockerfile サポート」を参照してください。

Dockerfile

Dockerfile
# Container image that runs your code
FROM alpine:3.10

# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]

アクションのメタデータファイルの作成

上で作成した hello-world-docker-action ディレクトリに新しい action.yml ファイルを作成します。 詳細については、「GitHub Actions のメタデータ構文」を参照してください。

action.yml

YAML
# action.yml
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
  who-to-greet:  # id of input
    description: 'Who to greet'
    required: true
    default: 'World'
outputs:
  time: # id of output
    description: 'The time we greeted you'
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.who-to-greet }}

このメタデータでは、1 つの who-to-greet 入力パラメーターと 1 つの time 出力パラメーターが定義されています。 入力を Docker コンテナーに渡すには、inputs を使用して入力を宣言し、args キーワードで入力を渡す必要があります。 args に含めたすべてのものがコンテナーに渡されますが、アクションのユーザーにわかりやすいよう、inputs を使用することをお勧めします。

GitHub によって Dockerfile からイメージがビルドされ、このイメージを使用して新しいコンテナーでコマンドが実行されます。

アクションのコードの記述

任意のベース Docker イメージを選択できるので、アクションに任意の言語を選択できます。 次のシェル スクリプトの例では、who-to-greet 入力変数を使って、ログ ファイルに "Hello [who-to-greet]" と出力されます。

次に、スクリプトは現在の時刻を取得し、それをジョブ内で後に実行するアクションが利用できる出力変数に設定します。 GitHub に出力変数を認識させるには、echo "::set-output name=<output name>::<value>" という構文でワークフロー コマンドを使う必要があります。 詳細については、「GitHub Actions のワークフロー コマンド」を参照してください。

  1. hello-world-docker-action ディレクトリに新しい entrypoint.sh ファイルを作成します。

  2. 次のコードを entrypoint.sh ファイルに追加します。

    entrypoint.sh

    Shell
    #!/bin/sh -l
    
    echo "Hello $1"
    time=$(date)
    echo "::set-output name=time::$time"

    entrypoint.sh がエラーなしで実行された場合、アクションの状態は success に設定されます。 アクションのコード中で明示的に終了コードを設定して、アクションのステータスを提供することもできます。 詳細については、「アクションの終了コードの設定」を参照してください。

  3. 次のコマンドをシステムで実行して、entrypoint.sh ファイルを実行可能にします。

    Shell
    $ chmod +x entrypoint.sh

READMEの作成

アクションの使用方法を説明するために、README ファイルを作成できます。 README はアクションの公開を計画している時に非常に役立ちます。また、アクションの使い方をあなたやチームが覚えておく方法としても優れています。

hello-world-docker-action ディレクトリに、次の情報を指定する README.md ファイルを作成します。

  • アクションの動作に関する詳細な説明。
  • 必須の入力および出力の引数。
  • 省略可能な入力および出力の引数。
  • アクションで使用されるシークレット。
  • アクションで使用される環境変数。
  • ワークフローでのアクションの使用方法の例。

README.md

markdown
# Hello world docker action

This action prints "Hello World" or "Hello" + the name of a person to greet to the log.

## Inputs

## `who-to-greet`

**Required** The name of the person to greet. Default `"World"`.

## Outputs

## `time`

The time we greeted you.

## Example usage

uses: actions/hello-world-docker-action@v1
with:
  who-to-greet: 'Mona the Octocat'

アクションのGitHub Enterprise Serverへのコミットとタグ、プッシュ

お使いのターミナルから、action.ymlentrypoint.shDockerfileREADME.md の各ファイルをコミットします。

アクションのリリースにはバージョンタグを加えることもベストプラクティスです。 アクションのバージョン管理の詳細については、アクションの概要に関するページを参照してください。

Shell
git add action.yml entrypoint.sh Dockerfile README.md
git commit -m "My first action is ready"
git tag -a -m "My first action release" v1
git push --follow-tags

ワークフローでアクションをテストする

これで、ワークフローでアクションをテストできるようになりました。 アクションがプライベート リポジトリ内にある場合、そのアクションは同じリポジトリ内のワークフローでのみ使用できます。 パブリック アクションは、任意のリポジトリ内のワークフローで使用できます。

注: your GitHub Enterprise Server instance の GitHub Actions では、GitHub.com または GitHub Marketplace に対するアクションへのアクセスが制限される場合があります。 詳細については、「GitHub.com からのアクションへのアクセスを管理する」を参照し、GitHub Enterprise サイト管理者にお問い合わせください。

パブリックアクションを使用する例

次のワークフロー コードでは、パブリックの actions/hello-world-docker-action リポジトリにある完全な hello world アクションを使用します。 次のワークフローの例のコードを .github/workflows/main.yml ファイルにコピーしますが、actions/hello-world-docker-action を実際のリポジトリとアクション名に置き換えてください。 who-to-greet 入力を自分の名前に置き換えることもできます。

.github/workflows/main.yml

YAML
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - name: Hello world action step
        id: hello
        uses: actions/hello-world-docker-action@v1
        with:
          who-to-greet: 'Mona the Octocat'
      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

プライベートアクションを使用する例

次の例のワークフロー コードを、アクションのリポジトリ内の .github/workflows/main.yml ファイルにコピーします。 who-to-greet 入力を自分の名前に置き換えることもできます。

.github/workflows/main.yml

YAML
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      # To use this repository's private action,
      # you must check out the repository
      - name: Checkout
        uses: actions/checkout@v2
      - name: Hello world action step
        uses: ./ # Uses an action in the root directory
        id: hello
        with:
          who-to-greet: 'Mona the Octocat'
      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

リポジトリから [アクション] タブをクリックして、最新のワークフロー実行を選択します。 [ジョブ] または視覚化グラフで、"A job to say hello" をクリックします。 "Hello Mona the Octocat" または who-to-greet 入力に使用した名前と、ログに出力されたタイムスタンプが表示されます。

ワークフローでアクションを使用しているスクリーンショット