ノート: 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:
# 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 table, populates
# the table with data, and then retrieves the data.
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:
# 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 table, populates
# the table with data, and then retrieves the data.
run: node client.js
# 新しい PostgreSQL クライアントを作成するために
# `client.js` スクリプトによって使用される環境変数。
env:
# PostgreSQLサービスコンテナとの通信に使われるホスト名
POSTGRES_HOST: postgres
# デフォルトのPostgreSQLポート
POSTGRES_PORT: 5432
client.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:
# 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 table, populates
# the table with data, and then retrieves the data
run: node client.js
# Environment variables used by the `client.js` script to create
# a new PostgreSQL table.
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:
# 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 table, populates
# the table with data, and then retrieves the data
run: node client.js
# Environment variables used by the `client.js` script to create
# a new PostgreSQL table.
env:
# PostgreSQLサービスコンテナとの通信に使われるホスト名
POSTGRES_HOST: localhost
# デフォルトのPostgreSQLポート
POSTGRES_PORT: 5432
client.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' } ]