ノート: GitHub Actionsは、GitHub Enterprise Server 2.22で限定ベータとして利用可能でした。 ベータは終了しました。 GitHub Actionsは、GitHub Enterprise Server 3.0以降で一般に利用可能になりました。 詳しい情報については、GitHub Enterprise Server 3.0 のリリースノートを参照してください。
- GitHub Enterprise Server 3.0以降へのアップグレードに関する詳しい情報については「GitHub Enterprise Serverのアップグレード」を参照してください。
- アップグレード後のGitHub Actionsの設定に関する詳しい情報については、GitHub Enterprise Server 3.0のドキュメンテーションを参照してください。
ノート: GitHubホストランナーは、現在GitHub Enterprise Serverでサポートされていません。 GitHubパブリックロードマップで、計画されている将来のサポートに関する詳しい情報を見ることができます。
はじめに
このガイドでは、Docker Hubのpostgres
イメージを使ってサービスコンテナを設定するワークフローの例を紹介します。 ワークフローの実行スクリプトは、PostgreSQL サービスに接続し、テーブルを作成してから、データを入力します。 ワークフローが PostgreSQL テーブルを作成してデータを入力することをテストするために、スクリプトはテーブルからコンソールにデータを出力します。
ノート: ワークフローがDockerコンテナアクションあるいはサービスコンテナを使うなら、Linuxのランナーを利用しなければなりません。
- 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: 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:
# ランナージョブのラベル
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: 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' } ]