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

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

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

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

はじめに

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

Note: If your workflows use Docker container actions or service containers, then you must use a Linux runner:

  • If you are using GitHub-hosted runners, you must use the ubuntu-latest runner.
  • If you are using self-hosted runners, you must use a Linux machine as your runner and Docker must be installed.

必要な環境

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

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

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

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

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

name: PostgreSQL service example
on: push

jobs:
  # Label of the container job
  container-job:
    # Containers must run in Linux based operating systems
    runs-on: ubuntu-latest
    # Docker Hub image that `container-job` executes in
    container: node:10.18-jessie

    # Service containers to run with `container-job`
    services:
      # Label used to access the service container
      postgres:
        # Docker Hub image
        image: postgres
        # Provide the password for postgres
        env:
          POSTGRES_PASSWORD: postgres
        # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      # Downloads a copy of the code in your repository before running CI tests
      - name: Check out repository code
        uses: actions/checkout@v2

      # Performs a clean installation of all dependencies in the `package.json` file
      # For more information, see https://docs.npmjs.com/cli/ci.html
      - name: Install dependencies
        run: npm ci

      - name: Connect to PostgreSQL
        # Runs a script that creates a PostgreSQL client, populates
        # the client with data, and retrieves data
        run: node client.js
        # Environment variable used by the `client.js` script to create a new PostgreSQL client.
        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というラベルでサービスコンテナを設定します。 すべてのサービスはコンテナ内で実行しなければならないので、各サービスについてコンテナのイメージを指定しなければなりません。 This example uses the postgres container image, provides the default PostgreSQL password, and includes health check options to make sure the service is running. 詳しい情報については、Docker Hubのpostgres imageを参照してください。

jobs:
  # Label of the container job
  container-job:
    # Containers must run in Linux based operating systems
    runs-on: ubuntu-latest
    # Docker Hub image that `container-job` executes in
    container: node:10.18-jessie

    # Service containers to run with `container-job`
    services:
      # Label used to access the service container
      postgres:
        # Docker Hub image
        image: postgres
        # Provide the password for postgres
        env:
          POSTGRES_PASSWORD: postgres
        # Set health checks to wait until postgres has started
        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:
  # Label of the runner job
  runner-job:
    # You must use a Linux environment when using service containers or container jobs
    runs-on: ubuntu-latest

    # Service containers to run with `runner-job`
    services:
      # Label used to access the service container
      postgres:
        # Docker Hub image
        image: postgres
        # Provide the password for postgres
        env:
          POSTGRES_PASSWORD: postgres
        # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # Maps tcp port 5432 on service container to the host
          - 5432:5432

    steps:
      # Downloads a copy of the code in your repository before running CI tests
      - name: Check out repository code
        uses: actions/checkout@v2

      # Performs a clean installation of all dependencies in the `package.json` file
      # For more information, see https://docs.npmjs.com/cli/ci.html
      - name: Install dependencies
        run: npm ci

      - name: Connect to PostgreSQL
        # Runs a script that creates a PostgreSQL client, populates
        # the client with data, and retrieves data
        run: node client.js
        # Environment variable used by the `client.js` script to create
        # a new PostgreSQL client.
        env:
          # PostgreSQLサービスコンテナとの通信に使われるホスト名
          POSTGRES_HOST: localhost
          # デフォルトのPostgreSQLポート
          POSTGRES_PORT: 5432

ランナージョブの設定

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

ワークフローはpostgresというラベルでサービスコンテナを設定します。 すべてのサービスはコンテナ内で実行しなければならないので、各サービスについてコンテナのイメージを指定しなければなりません。 This example uses the postgres container image, provides the default PostgreSQL password, and includes health check options to make sure the service is running. 詳しい情報については、Docker Hubのpostgres imageを参照してください。

The workflow maps port 5432 on the PostgreSQL service container to the Docker host. portsキーワードに関する詳しい情報については「サービスコンテナについて」を参照してください。

jobs:
  # Label of the runner job
  runner-job:
    # You must use a Linux environment when using service containers or container jobs
    runs-on: ubuntu-latest

    # Service containers to run with `runner-job`
    services:
      # Label used to access the service container
      postgres:
        # Docker Hub image
        image: postgres
        # Provide the password for postgres
        env:
          POSTGRES_PASSWORD: postgres
        # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          # Maps tcp port 5432 on service container to the host
          - 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' } ]

担当者にお尋ねください

探しているものが見つからなかったでしょうか?

弊社にお問い合わせください