如何在github工作流CI / CD中设置数据库服务容器?

时间:2019-09-12 18:01:44

标签: laravel postgresql docker continuous-integration github-actions

我有一个laravel应用和一个工作正常的Postgis容器。我正在尝试使用github工作流程beta为我的项目设置配置项。我的工作流尝试访问数据库时失败。对于本地环境,我正在使用容器名称canie-db设置数据库主机。但是在我的github工作流程中,我无法通过容器名称找到数据库主机。我在尝试运行测试时收到此错误:

  

Doctrine \ DBAL \ Driver \ PDOException:SQLSTATE [08006] [7]无法   将主机名“ canie-db”转换为地址:名称中的临时故障   分辨率

这是我的.github/workflows/ci.yml

name: CanieCICD

on:
  push:
    branches:
      - master
      - stage
      - ci/cd-patch
  pull_request:
    branches:
      - stage
      - ci/cd-patch

jobs:
  build:

    runs-on: ubuntu-18.04

    services:
      canie-db:
        image: mdillon/postgis:10
        ports:
        - 5432:5432
        env:
          POSTGRES_DB: canie-db
          POSTGRES_USER: iabs_user
          POSTGRES_PASSWORD: p@ssw0rd

    steps:

    - uses: actions/checkout@v1

    - name: Use Node.js 12.x
      uses: actions/setup-node@v1
      with:
        node-version: 12.x

    - name: Install composer dependencies
      run: composer install --prefer-dist

    - name: Run PHPUnit tests # CI fails here!
      run: vendor/bin/phpunit --no-coverage

    - name: Install npm dependencies
      run: npm install

    - name: Run Mix
      run: npm run production

我的Laravel后端数据库配置文件config/database.php具有'default' => env('DB_CONNECTION', 'pgsql'),

'pgsql' => [
    'driver' => 'pgsql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', 'canie-db'),
    'port' => env('DB_PORT', '5432'),
    'database' => env('DB_DATABASE', 'canie-db'),
    'username' => env('DB_USERNAME', 'iabs_user'),
    'password' => env('DB_PASSWORD', 'p@ssw0rd'),
    'charset' => 'utf8',
    'prefix' => '',
    'prefix_indexes' => true,
    'schema' => 'public',
    'sslmode' => 'prefer',
],

我还尝试将docker-compose up -d canie-db添加到我的工作流程中,但是它也不起作用

1 个答案:

答案 0 :(得分:0)

我认为答案是在https://github.com/actions/example-services/blob/master/.github/workflows/postgres-service.yml发布的评论和示例中阐明的。

为什么它不起作用,是因为您的工作流程/步骤在VM中运行(ubuntu-18.04),并且VM不知道 canie-db

的docker容器主机名

一种解决方法是使用localhost,因为端口已公开

'host' => env('DB_HOST', 'localhost'),

或者(可选),如您在示例中找到的那样,在容器中运行工作流和postgres。这样就可以知道主机 canie-db

container:
  image:  node:10.16-jessie