7

GitHub Actions 允许您在每个作业的基础上运行后台服务。遵循示例后,我无法弄清楚如何连接到正在运行的 PostgreSQL 容器。

我在这个pull request中尝试了几种不同的方法,但都没有奏效。

name: dinosql test suite
on: [push]
jobs:

  build:
    name: Build
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432/tcp

    steps:
    - uses: actions/checkout@master

    - name: Test dinosql/ondeck
      run: go test -v ./...
      working-directory: internal/dinosql/testdata/ondeck
      env:
        PG_USER: postgres
        PG_DATABASE: postgres
        PG_PASSWORD: postgres
        PG_PORT: ${{ job.services.postgres.ports['5432'] }}

此设置导致以下错误

Run go test -v ./...
=== RUN   TestQueries
=== PAUSE TestQueries
=== RUN   TestPrepared
=== PAUSE TestPrepared
=== CONT  TestQueries
=== CONT  TestPrepared
--- FAIL: TestPrepared (0.00s)
##[error]    db_test.go:212: db: postgres://postgres:postgres@127.0.0.1:32768/postgres?sslmode=disable
##[error]    db_test.go:212: dial tcp 127.0.0.1:32768: connect: connection refused
--- FAIL: TestQueries (0.00s)
##[error]    db_test.go:83: db: postgres://postgres:postgres@127.0.0.1:32768/postgres?sslmode=disable
##[error]    db_test.go:83: dial tcp 127.0.0.1:32768: connect: connection refused
FAIL
FAIL    example.com/ondeck  0.005s
?       example.com/ondeck/prepared [no test files]
##[error]Process completed with exit code 1.

如果可以建立有效的数据库连接,则测试应该通过。

4

1 回答 1

9

I ran into the same problem and found this example via GitHub's code search after a lot of trial and error.

name: dinosql test suite
on: [push]
jobs:

  build:
    name: Build
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres
        env:
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432/tcp
        # needed because the postgres container does not provide a healthcheck
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

    steps:
    - uses: actions/checkout@master

    - name: Test dinosql/ondeck
      run: go test -v ./...
      working-directory: internal/dinosql/testdata/ondeck
      env:
        # use postgres for the host here because we have specified a contaienr for the job.
        # If we were running the job on the VM this would be localhost
        PG_HOST: postgres
        PG_USER: postgres
        PG_DATABASE: postgres
        PG_PASSWORD: postgres
        PG_PORT: ${{ job.services.postgres.ports['5432'] }}

Adding the healthcheck options and changing the database hostname from 127.0.0.1 to postgres should do the trick.

It appears that without the healthcheck options, the postgres container will be shut down and won't be available for the tests.

于 2019-08-15T21:03:51.587 回答