ノート: GitHubホストランナーは、現在GitHub Enterprise Serverでサポートされていません。 GitHubパブリックロードマップで、計画されている将来のサポートに関する詳しい情� �を見ることができます。
はじめに
このガイドでは、Docker Hubのpostgresイメージを使ってサービスコンテナを設定するワークフローの例を紹介します。 ワークフローの実行スクリプトは、PostgreSQL サービスに接続し、テーブルを作成してから、データを入力します。 ワークフローが PostgreSQL テーブルを作成してデータを入力することをテストするために、スクリプトはテーブルからコンソールにデータを出力します。
Note: If your workflows use Docker container actions, job containers, or service containers, then you must use a Linux runner:
- GitHubホストランナーを使うなら、Ubuntuランナーを使わなければなりません。
 - セルフホストランナーを使っているなら、ランナーとしてLinuxマシンを使い、Dockerをインストールしておかなければなりません。
 
必要な環境
GitHub Actionsとのサービスコンテナの動作と、ジョブを直接ランナー上で動作させる� �合とコンテナ内で動作させる� �合のネットワーキングの差異について、親しんでおいてく� さい。 詳しい情� �については「サービスコンテナについて」を参照してく� さい。
YAML、GitHub Actionsの構文、PosgreSQLの基本な理解があれば役立つかも知れません。 詳しい情� �については、以下を参照してく� さい。
- 「GitHub Actions を学ぶ」
 - PostgreSQLのドキュメンテーション中のPostgreSQLチュートリアル
 
コンテナ内でのジョブの実行
ジョブをコンテナ内で実行するように設定すれば、ジョブとサービスコンテナ間のネットワーク設定が単純になります。 同じユーザ定義ブリッジネットワーク上にあるDockerコンテナは、すべてのポートを互いに公開するので、サービスコンテナのポートをDockerホストにマップする必要がありません。 ワークフロー中で設定したラベルを使って、ジョブコンテナからサービスコンテナにアクセスできます。
このワークフローファイルはリポジトリの.github/workflowsディレクトリにコピーして、必要に応じて修正できます。
name: PostgreSQL service example
on: push
jobs:
  # コンテナジョブのラベル
  container-job:
    # コンテナは Linux ベースのオペレーティングシステ� で実行しなければならない
    runs-on: ubuntu-latest
    # `container-job` が実行される Docker Hub イメージ
    container: node:10.18-jessie
    # `container-job` で実行するサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使用されるラベル
      postgres:
        # Docker Hub のイメージ
        image: postgres
        # postgres のパスワードを入力する
        env:
          POSTGRES_PASSWORD: postgres
        # postgres が起動するまで待機するようにヘルスチェックを設定する
        options: >-
          --health-cmd pg_isready
          --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 PostgreSQL
        # PostgreSQLテーブルを作成し、テーブルにデータを入力してから
        # データを取得するスクリプトを実行する。
        run: node client.js
        # `client.js` スクリプトが新しいPostgreSQLクライアントの作成に使う環境変数。
        env:
          # PostgreSQLサービスコンテナとの通信に使われるホスト名
          POSTGRES_HOST: postgres
          # デフォルトのPostgreSQLポート
          POSTGRES_PORT: 5432ランナージョブの設定
このワークフローはnode:10.18-jessieコンテナ内で実行されるジョブを設定し、ubuntu-latest GitHubホストランナーをコンテナ用のDockerホストとして使用します。 node:10.18-jessieコンテナに関する詳しい情� �についてはDocker Hubのnodeイメージを参照してく� さい。
ワークフローはpostgresというラベルでサービスコンテナを設定します。 すべてのサービスはコンテナ内で実行しなければならないので、各サービスについてコンテナのイメージを指定しなければなりません。 この例はpostgresコンテナイメージを使っており、デフォルトのPostgreSQLのパスワードが提供され、サービスが動作していることを確認するためのヘルスチェックオプションが含まれます。 詳しい情� �については、Docker Hubのpostgres imageを参照してく� さい。
jobs:
  # コンテナジョブのラベル
  container-job:
    # コンテナはLinuxベースのオペレーティングシステ� 内で実行しなければならない
    runs-on: ubuntu-latest
    # `container-job`が実行されるDocker Hubのイメージ
    container: node:10.18-jessie
    # `container-job`と実行されるサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使われるラベル
      postgres:
        # Docker Hubのイメージ
        image: postgres
        # postgresのパスワードを提供
        env:
          POSTGRES_PASSWORD: postgres
        # postgresが起動するまで待つヘルスチェックの設定
        options: >-
          --health-cmd pg_isready
          --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 PostgreSQL
    # PostgreSQL テーブルを作成し、テーブルにデータを入力してから
    # データを取得するスクリプトを実行する。
    run: node client.js
    # 新しい PostgreSQL クライアントを作成するために
    # `client.js` スクリプトによって使用される環境変数。
    env:
      # PostgreSQLサービスコンテナとの通信に使われるホスト名
      POSTGRES_HOST: postgres
      # デフォルトのPostgreSQLポート
      POSTGRES_PORT: 5432client.jsスクリプトは、クライアントを作成するために環境変数のPOSTGRES_HOSTとPOSTGRES_PORTを探します。 ワークフローは、これら2つの環境変数を"Connect to PostgreSQL"ステップの一部として設定し、client.jsスクリプトから利用できるようにします。 このスクリプトに関する詳しい情� �については「PostgreSQLサービスコンテナのテスト」を参照してく� さい。
PostgreSQLサービスのホスト名は、ワークフロー中で設定されたラベルで、ここではpostgresです。 同じユーザー定義ブリッジネットワーク上のDockerコンテナは、デフォルトですべてのポートをオープンするので、サービスコンテナにはデフォルトのPostgreSQLのポートである5432でアクセスできます。
ランナーマシン上で直接のジョブの実行
ランナーマシン上で直接ジョブを実行する� �合、サービスコンテナ上のポートをDockerホスト上のポートにマップしなければなりません。 Dockerホストからサービスコンテナへは、localhostとDockerホストのポート番号を使ってアクセスできます。
このワークフローファイルはリポジトリの.github/workflowsディレクトリにコピーして、必要に応じて修正できます。
name: PostgreSQL Service Example
on: push
jobs:
  # ランナージョブのラベル
  runner-job:
    # サービスコンテナまたはコンテナジョブを使用する� �合は Linux 環境を使用する必要がある
    runs-on: ubuntu-latest
    # `runner-job` で実行されるサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使用されるラベル
      postgres:
        # Docker Hub イメージ
        image: postgres
        # postgres のパスワードを入力する
        env:
          POSTGRES_PASSWORD: postgres
        # postgres が起動するまで待機するようにヘルスチェックを設定する
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # サービスコンテナの tcp ポート 5432 をホストにマップする
          - 5432:5432
    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 PostgreSQL
        # PostgreSQLテーブルを作成し、テーブルにデータを入力してから
        # データを取得するスクリプトを実行する
        run: node client.js
        # `client.js` スクリプトが新しいPostgreSQLクライアントの
        # 作成に使う環境変数
        env:
          # PostgreSQLサービスコンテナとの通信に使われるホスト名
          POSTGRES_HOST: localhost
          # デフォルトのPostgreSQLポート
          POSTGRES_PORT: 5432ランナージョブの設定
この例では、 ubuntu-latest GitHubホストランナーをDockerホストとして使います。
ワークフローはpostgresというラベルでサービスコンテナを設定します。 すべてのサービスはコンテナ内で実行しなければならないので、各サービスについてコンテナのイメージを指定しなければなりません。 この例はpostgresコンテナイメージを使っており、デフォルトのPostgreSQLのパスワードが提供され、サービスが動作していることを確認するためのヘルスチェックオプションが含まれます。 詳しい情� �については、Docker Hubのpostgres imageを参照してく� さい。
このワークフローはPostgreSQLサービスコンテナ上のポート5432をDockerホストにマップします。 portsキーワードに関する詳しい情� �については「サービスコンテナについて」を参照してく� さい。
jobs:
  # ランナージョブのラベル
  runner-job:
    # サービスコンテナもしくはコンテナジョブを使う� �合にはLinux環境を使わなければならない
    runs-on: ubuntu-latest
    # `runner-job`と実行されるサービスコンテナ
    services:
      # サービスコンテナへのアクセスに使われるラベル
      postgres:
        # Docker Hubのイメージ
        image: postgres
        # postgresにパスワードを提供
        env:
          POSTGRES_PASSWORD: postgres
        # postgresが起動するまで待つヘルスチェックの設定
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # サービスコンテナ上のTCPポート5432をホストにマップ
          - 5432:5432ステップの設定
ワークフローは以下のステップを実行します。
- ランナー上にリポジトリをチェックアウト
 - 依存関係のインストール
 - クライアントを作成するスクリプトの実行
 
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 PostgreSQL
    # PostgreSQL テーブルを作成し、テーブルにデータを入力してから
    # データを取得するスクリプトを実行する
    run: node client.js
    # `client.js` スクリプトが新しいPostgreSQLクライアントの
    # 作成に使う環境変数
    env:
      # PostgreSQLサービスコンテナとの通信に使われるホスト名
      POSTGRES_HOST: localhost
      # デフォルトのPostgreSQLポート
      POSTGRES_PORT: 5432client.jsスクリプトは、クライアントを作成するために環境変数のPOSTGRES_HOSTとPOSTGRES_PORTを探します。 ワークフローは、これら2つの環境変数を"Connect to PostgreSQL"ステップの一部として設定し、client.jsスクリプトから利用できるようにします。 このスクリプトに関する詳しい情� �については「PostgreSQLサービスコンテナのテスト」を参照してく� さい。
ホスト名はlocalhostもしくは127.0.0.1です。
PostgreSQLサービスコンテナのテスト
次のスクリプトを使用してワークフローをテストできます。このスクリプトは、PostgreSQL サービスに接続し、プレースホルダーデータを含む新しいテーブルを追� します。 そしてそのスクリプトは PostgreSQL テーブルに保存されている値をターミナルに出力します。 スクリプトには好きな言語を使えますが、この例ではNode.jsとnpmモジュールのpgを使っています。 詳しい情� �についてはnpm pgモジュールを参照してく� さい。
client.jsを修正して、ワークフローで必要なPostgreSQLの操作を含めることができます。 この例では、スクリプトは PostgreSQL サービスに接続し、postgres データベースにテーブルを追� し、プレースホルダーデータを挿入してから、データを取得します。
以下のコードで、client.js と名付けた新しいファイルをリポジトリに追� してく� さい。
const { Client } = require('pg');
const pgclient = new Client({
    host: process.env.POSTGRES_HOST,
    port: process.env.POSTGRES_PORT,
    user: 'postgres',
    password: 'postgres',
    database: 'postgres'
});
pgclient.connect();
const table = 'CREATE TABLE student(id SERIAL PRIMARY KEY, firstName VARCHAR(40) NOT NULL, lastName VARCHAR(40) NOT NULL, age INT, address VARCHAR(80), email VARCHAR(40))'
const text = 'INSERT INTO student(firstname, lastname, age, address, email) VALUES($1, $2, $3, $4, $5) RETURNING *'
const values = ['Mona the', 'Octocat', 9, '88 Colin P Kelly Jr St, San Francisco, CA 94107, United States', 'octocat@github.com']
pgclient.query(table, (err, res) => {
    if (err) throw err
});
pgclient.query(text, values, (err, res) => {
    if (err) throw err
});
pgclient.query('SELECT * FROM student', (err, res) => {
    if (err) throw err
    console.log(err, res.rows) // Print the data in student table
    pgclient.end()
});このスクリプトは、PostgreSQL サービスへの新しい接続を作成し、POSTGRES_HOST および POSTGRES_PORT 環境変数を使用して PostgreSQL サービスの IP アドレスとポートを指定します。 hostとportが定義されていない� �合、デフォルトのホストはlocalhostで、デフォルトのポートは5432になります。
スクリプトはテーブルを作成し、そのテーブルにプレースホルダーデータを展開します。 postgres データベースにデータが含まれていることをテストするために、スクリプトはテーブルの内容をコンソールログに出力します。
このワークフローを実行すると、「PostgreSQL への接続」ステップに次の出力が表示されます。これにより、PostgreSQL テーブルが正常に作成されてデータが追� されたことを確認できます。
null [ { id: 1,
    firstname: 'Mona the',
    lastname: 'Octocat',
    age: 9,
    address:
     '88 Colin P Kelly Jr St, San Francisco, CA 94107, United States',
    email: 'octocat@github.com' } ]