このバージョンの GitHub Enterprise はこの日付をもって終了となりました: 2021-09-23. 重大なセキュリティの問題に対してであっても、パッチリリースは作成されません。 パフォーマンスの向上、セキュリティの改善、新機能のためには、最新バージョンのGitHub Enterpriseにアップグレードしてください。 アップグレードに関する支援については、GitHub Enterprise supportに連絡してください。

Redisサービスコンテナの作成

サービスコンテナを使って、ワークフロー中でRedisのクライアントを作成できます。 このガイドでは、コンテナで実行されるジョブか、ランナーマシン上で直接実行されるジョブのためのRedisサービスの作成例を紹介します。

ノート: GitHub Actionsは、GitHub Enterprise Server 2.22で限定ベータとして利用可能でした。 ベータは終了しました。 GitHub Actionsは、GitHub Enterprise Server 3.0以降で一般に利用可能になりました。 詳しい情報については、GitHub Enterprise Server 3.0 のリリースノートを参照してください。


ノート: GitHubホストランナーは、現在GitHub Enterprise Serverでサポートされていません。 GitHubパブリックロードマップで、計画されている将来のサポートに関する詳しい情報を見ることができます。

はじめに

このガイドでは、Docker Hubのredisイメージを使ってサービスコンテナを設定するワークフローの例を紹介します。 このワークフローは、Redisのクライアントを作成してクライアントにデータを展開するスクリプトを実行します。 Redisクライアントを作成して展開するワークフローをテストするために、このスクリプトはクライアントのデータをコンソールに出力します。

ノート: ワークフローがDockerコンテナアクションあるいはサービスコンテナを使うなら、Linuxのランナーを利用しなければなりません。

  • GitHubホストランナーを使うなら、Ubuntuランナーを使わなければなりません。
  • セルフホストランナーを使っているなら、ランナーとしてLinuxマシンを使い、Dockerをインストールしておかなければなりません。

必要な環境

GitHub Actionsとのサービスコンテナの動作と、ジョブを直接ランナー上で動作させる場合とコンテナ内で動作させる場合のネットワーキングの差異について、親しんでおいてください。 詳しい情報については「サービスコンテナについて」を参照してください。

YAML、GitHub Actionsの構文、Redisの基本な理解があれば役立つかも知れません。 詳しい情報については、以下を参照してください。

コンテナ内でのジョブの実行

ジョブをコンテナ内で実行するように設定すれば、ジョブとサービスコンテナ間のネットワーク設定が単純になります。 同じユーザ定義ブリッジネットワーク上にあるDockerコンテナは、すべてのポートを互いに公開するので、サービスコンテナのポートをDockerホストにマップする必要がありません。 ワークフロー中で設定したラベルを使って、ジョブコンテナからサービスコンテナにアクセスできます。

このワークフローファイルはリポジトリの.github/workflowsディレクトリにコピーして、必要に応じて修正できます。

YAML
name: Redis container example
on: push

jobs:
  # コンテナジョブのラベル
  container-job:
    # コンテナはLinuxベースのオペレーティングシステム内で実行しなければならない
    runs-on: ubuntu-latest
    # `container-job`が実行されるDocker Hubのイメージ
    container: node:10.18-jessie

    # `container-job`と実行されるサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使われるラベル
      redis:
        # Docker Hubのイメージ
        image: redis
        # redisが起動するまで待つヘルスチェックの設定
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      # CIテストの実行前にリポジトリからコードのコピーをダウンロード
      - name: Check out repository code
        uses: actions/checkout@v2

      # `package.json`ファイル内のすべての依存関係のクリーンインストールの実行
      # 詳しい情報についてはhttps://docs.npmjs.com/cli/ci.htmlを参照
      - name: Install dependencies
        run: npm ci

      - name: Connect to Redis
        # Redisクライアントを作成し、クライアントにデータを展開し、
        # データを取り出すスクリプトを実行
        run: node client.js
        # `client.js`スクリプトが新しいRedisクライアントを作成するのに使う環境変数
        env:
          # Redisサービスコンテナとの通信に使われるホスト名
          REDIS_HOST: redis
          # デフォルトのRedisポート
          REDIS_PORT: 6379

コンテナジョブの設定

このワークフローはnode:10.18-jessieコンテナ内で実行されるジョブを設定し、ubuntu-latest GitHubホストランナーをコンテナ用のDockerホストとして使用します。 node:10.18-jessieコンテナに関する詳しい情報についてはDocker Hubのnodeイメージを参照してください。

ワークフローはredisというラベルでサービスコンテナを設定します。 すべてのサービスはコンテナ内で実行しなければならないので、各サービスについてコンテナのイメージを指定しなければなりません。 この例はredisコンテナイメージを使っており、サービスが動作していることを確認するためのヘルスチェックオプションが含まれます。 詳しい情報については、Docker Hubのredis imageを参照してください。

YAML
jobs:
  # コンテナジョブのラベル
  container-job:
    # コンテナはLinuxベースのオペレーティングシステム内で実行しなければならない
    runs-on: ubuntu-latest
    # `container-job`が実行されるDocker Hubのイメージ
    container: node:10.18-jessie

    # `container-job`と実行されるサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使われるラベル
      redis:
        # Docker Hubのイメージ
        image: redis
        # redisが起動するまで待つヘルスチェックの設定
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

ステップの設定

ワークフローは以下のステップを実行します。

  1. ランナー上にリポジトリをチェックアウト
  2. 依存関係のインストール
  3. クライアントを作成するスクリプトの実行
YAML
steps:
  # CIテストの実行前にリポジトリのコードのコピーをダウンロード
  - name: Check out repository code
    uses: actions/checkout@v2

  # `package.json`ファイル中のすべての依存関係のクリーンインストールの実行
  # 詳しい情報については https://docs.npmjs.com/cli/ci.html を参照
  - name: Install dependencies
    run: npm ci

  - name: Connect to Redis
    # Redisクライアントを作成し、クライアントにデータを展開し、
    # データを取り出すスクリプトを実行
    run: node client.js
    # `client.js`スクリプトが新しいRedisクライアントを作成する際に利用する環境変数
    env:
          # Redisサービスコンテナとの通信に使われるホスト名
          REDIS_HOST: redis
          # デフォルトのRedisポート
          REDIS_PORT: 6379

client.jsスクリプトは、クライアントを作成するために環境変数のREDIS_HOSTREDIS_PORTを探します。 ワークフローは、これら2つの環境変数を"Connect to Redis"ステップの一部として設定し、client.jsスクリプトから利用できるようにします。 このスクリプトに関する詳しい情報については「Redisサービスコンテナのテスト」を参照してください。

Redisサービスのホスト名は、ワークフロー中で設定されたラベルで、ここではredisです。 同じユーザー定義ブリッジネットワーク上のDockerコンテナは、デフォルトですべてのポートをオープンするので、サービスコンテナにはデフォルトのRedisのポートである6379でアクセスできます。

ランナーマシン上で直接のジョブの実行

ランナーマシン上で直接ジョブを実行する場合、サービスコンテナ上のポートをDockerホスト上のポートにマップしなければなりません。 Dockerホストからサービスコンテナへは、localhostとDockerホストのポート番号を使ってアクセスできます。

このワークフローファイルはリポジトリの.github/workflowsディレクトリにコピーして、必要に応じて修正できます。

YAML
name: Redis runner example
on: push

jobs:
  # ランナージョブのラベル
  runner-job:
    # サービスコンテナもしくはコンテナジョブを使う際にはLinux環境を使わなければならない
    runs-on: ubuntu-latest

    # `runner-job`と実行されるサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使われるラベル
      redis:
        # Docker Hubのイメージ
        image: redis
        # redisが起動するまで待つヘルスチェックの設定
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # サービスコンテナのポート6379をホストにマップ
          - 6379:6379

    steps:
      # CIテストの実行前にリポジトリのコードのコピーをダウンロード
      - name: Check out repository code
        uses: actions/checkout@v2

      # `package.json`ファイル内のすべての依存関係のクリーンインストールの実行
      # 詳しい情報についてはhttps://docs.npmjs.com/cli/ci.htmlを参照
      - name: Install dependencies
        run: npm ci

      - name: Connect to Redis
        # Redisクライアントを作成し、クライアントにデータを展開し、
        # データを取り出すスクリプトを実行
        run: node client.js
        # `client.js`スクリプトが新しいRedisクライアントを作成するのに
        # 使う環境変数
        env:
          # Redisサービスコンテナとの通信に使われるホスト名
          REDIS_HOST: localhost
          # デフォルトのRedisポート
          REDIS_PORT: 6379

ランナージョブの設定

この例では、 ubuntu-latest GitHubホストランナーをDockerホストとして使います。

ワークフローはredisというラベルでサービスコンテナを設定します。 すべてのサービスはコンテナ内で実行しなければならないので、各サービスについてコンテナのイメージを指定しなければなりません。 この例はredisコンテナイメージを使っており、サービスが動作していることを確認するためのヘルスチェックオプションが含まれます。 詳しい情報については、Docker Hubのredis imageを参照してください。

このワークフローはRedisサービスコンテナ上のポート6379をDockerホストにマップします。 portsキーワードに関する詳しい情報については「サービスコンテナについて」を参照してください。

YAML
jobs:
  # ランナージョブのラベル
  runner-job:
    # サービスコンテナもしくはコンテナジョブを使う際にはLinux環境を使わなければならない
    runs-on: ubuntu-latest

    # `runner-job`と実行するサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使うラベル
      redis:
        # Docker Hubのイメージ
        image: redis
        # redisが起動するまで待つヘルスチェックの設定
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # サービスコンテナ上のポート6379をホストにマップ
          - 6379:6379

ステップの設定

ワークフローは以下のステップを実行します。

  1. ランナー上にリポジトリをチェックアウト
  2. 依存関係のインストール
  3. クライアントを作成するスクリプトの実行
YAML
steps:
  # CIテストの実行前にリポジトリのコードのコピーをダウンロード
  - name: Check out repository code
    uses: actions/checkout@v2

  # `package.json`ファイル中のすべての依存関係のクリーンインストールの実行
  # 詳しい情報については https://docs.npmjs.com/cli/ci.html を参照
  - name: Install dependencies
    run: npm ci

  - name: Connect to Redis
    # Redisクライアントを作成し、クライアントにデータを展開し、
    # データを取り出すスクリプトを実行
    run: node client.js
    # `client.js`スクリプトが新しいRedisクライアントを作成する際に
    # 利用する環境変数
    env:
          # Redisサービスコンテナとの通信に使われるホスト名
          REDIS_HOST: localhost
          # デフォルトのRedisポート
          REDIS_PORT: 6379

client.jsスクリプトは、クライアントを作成するために環境変数のREDIS_HOSTREDIS_PORTを探します。 ワークフローは、これら2つの環境変数を"Connect to Redis"ステップの一部として設定し、client.jsスクリプトから利用できるようにします。 このスクリプトに関する詳しい情報については「Redisサービスコンテナのテスト」を参照してください。

ホスト名はlocalhostもしくは127.0.0.1です。

Redisサービスコンテナのテスト

ワークフローを以下のスクリプトでテストできます。このスクリプトはRedisクライアントを作成し、いくつかのプレースホルダーデータをクライアントに展開します。 そしてこのスクリプトは、Redisクライアント内に保存された値をターミナルに出力します。 スクリプトには好きな言語を使えますが、この例ではNode.jsとnpmモジュールのredisを使っています。 詳しい情報についてはnpm redisモジュールを参照してください。

client.jsを修正して、ワークフローで必要なRedisの操作を含めることができます。 この例では、スクリプトはRedisクライアントのインスタンスを作成し、プレースホルダーデータを追加し、そしてそのデータを取り出します。

以下のコードで、client.js と名付けた新しいファイルをリポジトリに追加してください。

JavaScript
const redis = require("redis");

// 新しいRedisクライアントの作成
// REDIS_HOSTが設定されていなければ、デフォルトのホストはlocalhost
// REDIS_PORTが設定されていなければ、デフォルトのポートは6379
const redisClient = redis.createClient({
  host: process.env.REDIS_HOST,
  port: process.env.REDIS_PORT  
});

redisClient.on("error", function(err) {
    console.log("Error " + err);
});

// キー"octocat"に"Mona the octocat"という値を設定
redisClient.set("octocat", "Mona the Octocat", redis.print);
// キーを"octocat"、フィールドを"species"、"value"を"Cat and Octopus"に設定
redisClient.hset("species", "octocat", "Cat and Octopus", redis.print);
// キーを"octocat"、フィールドを"species"、"value"を"Dinosaur and Octopus"に設定
redisClient.hset("species", "dinotocat", "Dinosaur and Octopus", redis.print);
// キーを"octocat"、フィールドを"species"、 "value"を"Cat and Robot"に設定
redisClient.hset(["species", "robotocat", "Cat and Robot"], redis.print);
// キー"species"のすべてのフィールドを取得

redisClient.hkeys("species", function (err, replies) {
    console.log(replies.length + " replies:");
    replies.forEach(function (reply, i) {
        console.log("    " + i + ": " + reply);
    });
    redisClient.quit();
});

このスクリプトは新しいRedisクライアントをcreateClientメソッドを使って作成します。これは、パラメーターとしてhostportを受け付けます。 スクリプトは環境変数のREDIS_HOSTREDIS_PORTを使って、クライアントのIPアドレスとポートを設定します。 hostportが定義されていない場合、デフォルトのホストはlocalhostで、デフォルトのポートは6379になります。

このスクリプトは、set及びhsetメソッドを使ってデータベースにいくつかのキー、フィールド、値を展開します。 Redisデータベースがデータを含んでいることを確認するために、スクリプトはデータベースの内容をコンソールログに出力します。

このワークフローを実行すると、"Connect to Redis"ステップで以下のように出力され、Redisのクライアントが作成され、データが追加されたことが確認できます。

Reply: OK
Reply: 1
Reply: 1
Reply: 1  
3 replies:
    0: octocat
    1: dinotocat
    2: robotocat

問題がまだ解決していませんか?