ドキュメントには頻繁に更新が加えられ、その都度公開されています。本ページの翻訳はまだ未完成な部分があることをご了承ください。最新の情報については、英語のドキュメンテーションをご参照ください。本ページの翻訳に問題がある場合はこちらまでご連絡ください。

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

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

GitHub ActionsはGitHub Free、GitHub Pro、GitHub FreeのOrganization、GitHub Team、GitHub Enterprise Cloud、GitHub Oneで利用できます。 GitHub Actionsは、レガシーのリポジトリごとのプランを使っているアカウントが所有しているプライベートリポジトリでは利用できません。 For more information, see "GitHub's products."

ここには以下の内容があります:

Did this doc help you?

Help us make these docs great!

All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.

Make a contribution

OR, learn how to contribute.

GitHub Actions の支払いを管理する GitHubは、macOSランナーのホストにMacStadiumを使用しています。

はじめに

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

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

  • If you are using GitHub-hosted runners, you must use an Ubuntu runner.
  • セルフホストランナーを使っているなら、ランナーとしてLinuxマシンを使い、Dockerをインストールしておかなければなりません。

必要な環境

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

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

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

ジョブをコンテナ内で実行するように設定すれば、ジョブとサービスコンテナ間のネットワーク設定が単純になります。 同じユーザ定義ブリッジネットワーク上にある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

ステップの設定

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

  1. ランナー上にリポジトリをチェックアウト
  2. 依存関係のインストール
  3. クライアントを作成するスクリプトの実行
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

client.jsスクリプトは、クライアントを作成するために環境変数のPOSTGRES_HOSTPOSTGRES_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
        # posgresが起動するまで待つヘルスチェックの設定
        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

ステップの設定

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

  1. ランナー上にリポジトリをチェックアウト
  2. 依存関係のインストール
  3. クライアントを作成するスクリプトの実行
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

client.jsスクリプトは、クライアントを作成するために環境変数のPOSTGRES_HOSTPOSTGRES_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クライアントのインスタンスを作成し、テーブルを作成し、プレースホルダーデータを追加し、そしてそのデータを取り出します。

以下のコードで、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のClientを作成します。これは、パラメーターとしてhostportを受け付けます。 スクリプトは環境変数のPOSTGRES_HOSTPOSTGRES_PORTを使って、クライアントのIPアドレスとポートを設定します。 hostportが定義されていない場合、デフォルトのホストはlocalhostで、デフォルトのポートは5432になります。

スクリプトはテーブルを作成し、そのテーブルにプレースホルダーデータを展開します。 PostgreSQLデータベースがデータを含んでいることをテストするために、スクリプトはテーブルの内容をコンソールログに出力します。

このワークフローを実行すると、"Connect to 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' } ]

Did this doc help you?

Help us make these docs great!

All GitHub docs are open source. See something that's wrong or unclear? Submit a pull request.

Make a contribution

OR, learn how to contribute.