我们经常发布文档更新,此页面的翻译可能仍在进行中。有关最新信息,请访问英文文档。如果此页面上的翻译有问题,请告诉我们

创建 PostgreSQL 服务容器

您可以创建 PostgreSQL 服务容器用于您的工作流程。 本指南举例说明如何为容器中运行或直接在运行器机器上运行的作业创建 PostgreSQL 服务。

GitHub Actions 可用于 GitHub Free、GitHub Pro、组织的 GitHub Free、GitHub Team、GitHub Enterprise Cloud 和 GitHub One。 GitHub Actions 不适用于使用旧版按仓库计划的帐户所拥有的私有仓库。 For more information, see "GitHub's products."

本文内容

此文档对您有帮助吗?

帮助我们创建出色的文档!

所有 GitHub 文档都是开源的。看到错误或不清楚的内容了吗?提交拉取请求。

做出贡献

或, 了解如何参与。

简介

本指南演示了使用 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 的语法和 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 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:
          # The hostname used to communicate with the PostgreSQL service container
          POSTGRES_HOST: postgres
          # The default PostgreSQL port
          POSTGRES_PORT: 5432

配置运行器作业

此工作流程配置在 node:10.18-jessie 容器中运行的作业,并使用 ubuntu-latest GitHub 托管的运行器作为容器的 Docker 主机。 有关 node:10.18-jessie 容器的更多信息,请参阅 Docker Hub 上的节点映像

工作流程用 postgres 标签配置服务容器。 所有服务必须在容器中运行,因此每个服务都需要指定容器映像。 此示例使用 postgres 容器映像,提供默认 PostgreSQL 密码,并包括状态检查选项以确保服务正在运行。 更多信息请参阅 Docker Hub 上的 postgres 映像

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:
  # 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:
      # The hostname used to communicate with the PostgreSQL service container
      POSTGRES_HOST: postgres
      # The default PostgreSQL port
      POSTGRES_PORT: 5432

client.js 脚本寻找 POSTGRES_HOSTPOSTGRES_PORT 环境变量来创建客户端。 工作流程将这两个环境变量设置为“连接到 PostgreSQL”步骤的一部分,使它们可用于 client.js 脚本。 关于脚本的更多信息,请参阅“测试 PostgreSQL 服务容器”。

PostgreSQL 文档中的服务的主机名是您在工作流程中配置的标签,本例中为 postgres。 由于同一用户定义的网桥网络上的 Docker 容器默认打开所有端口,因此您将能够访问默认 PostgreSQL 端口 5432 上的服务容器。

直接在运行器机器上运行作业

直接在运行器机器上运行作业时,需要将服务容器上的端口映射到 Docker 主机上的端口。 您可以使用 localhost 和 Docker 主机端口号从 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:
          # The hostname used to communicate with the PostgreSQL service container
          POSTGRES_HOST: localhost
          # The default PostgreSQL port
          POSTGRES_PORT: 5432

配置运行器作业

示例使用 ubuntu-latest GitHub 托管的运行器作为 Docker 主机。

工作流程用 postgres 标签配置服务容器。 所有服务必须在容器中运行,因此每个服务都需要指定容器映像。 此示例使用 postgres 容器映像,提供默认 PostgreSQL 密码,并包括状态检查选项以确保服务正在运行。 更多信息请参阅 Docker Hub 上的 postgres 映像

工作流程将 PostgreSQL 服务容器上的端口 5432 映射到 Docker 主机。 有关 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:
  # 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:
      # The hostname used to communicate with the PostgreSQL service container
      POSTGRES_HOST: localhost
      # The default PostgreSQL port
      POSTGRES_PORT: 5432

client.js 脚本寻找 POSTGRES_HOSTPOSTGRES_PORT 环境变量来创建客户端。 工作流程将这两个环境变量设置为“连接到 PostgreSQL”步骤的一部分,使它们可用于 client.js 脚本。 关于脚本的更多信息,请参阅“测试 PostgreSQL 服务容器”。

主机名为 localhost127.0.0.1

测试 PostgreSQL 服务容器

您可以使用以下脚本测试工作流程,该脚本将创建 PostgreSQL 客户端,并添加包含某些占位符数据的新表。 然后,脚本将存储在 PostgreSQL 客户端中的值打印到终端。 您的脚本可以使用任何您喜欢的语言,但此示例使用 Node.js 和 Pg npm 模块。 更多信息请参阅 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()
});

该脚本创建新的 PostgreSQLL Client,接受 hostport 参数。 该脚本使用 POSTGRES_HOSTPOSTGRES_PORT 环境变量来设置客户端的 IP 地址和端口。 如果未定义 hostport,则默认主机为 localhost,默认端口为 5432。

脚本创建一个表并将用占位符数据添加。 要测试 PostgreSQL 数据库是否包含数据,脚本将会表的内容打印到控制台日志。

运行此工作流程时,应会在“连接到 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' } ]

此文档对您有帮助吗?

帮助我们创建出色的文档!

所有 GitHub 文档都是开源的。看到错误或不清楚的内容了吗?提交拉取请求。

做出贡献

或, 了解如何参与。