【问题标题】:Setup postgres in Github Actions for Django在 Github Actions for Django 中设置 postgres
【发布时间】:2020-11-13 21:17:12
【问题描述】:

我目前正在开发一个关于 Django 的网站。在我的计算机上,我在带有 postgres 数据库的 Docker 上运行它。这是我拥有的 docker-compose 文件:

version: '3'

services:
    db:
        image: postgres
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres


    web:
        build: .
        volumes:
            - .:/usr/src/app
        ports:
            - "8000:8000"

这是 settings.py 中的相关部分

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

当我使用此设置在 docker 容器中运行我的测试时,它可以找到并运行测试。但是,在 github 操作中,它不起作用。这是我的工作流程文件:

name: Django CI

on: push


jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.7, 3.8]

    services:
      db:
        image: postgres
        env:
          POSTGRES_DB: postgres
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
        ports:
          - 5432:5432

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v1
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run Tests
      run: |
        python manage.py test

当它在 github 操作中运行时,我收到以下错误:

django.db.utils.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution

有人可以帮我解决这个问题,如果您需要更多代码,请告诉我。

【问题讨论】:

  • 如果你使用localhost会发生什么?
  • 在我的电脑上,我在 127.0.0.1:8000 上运行它,这是 Django 的默认值,它工作正常。
  • 我指的是 github 操作
  • 哦,谢谢你的建议。出于某种原因,它说ModuleNotFoundError: No module named 'localhost:8000'。我想也许你不能在测试中指定 localhost?

标签: django github-actions django-testing django-postgresql


【解决方案1】:

这不起作用的原因是设置HOST 设置为db

当您使用仅包含服务的 Github Action 时,这称为“在虚拟机或 VM 上运行所有步骤”。

您知道是这种情况,因为您的stepsservices 的缩进级别相同。

在这种情况下,您不要将服务的容器名称(在本例中为 db)指定为主机。相反,问题中显示的在services 中运行的服务实际上是在localhost 上运行的,这与步骤发生的位置相同。

当到达run tests 步骤时,我们可以看到django 实际上正在尝试启动,因为django.db.utils.OperationalError... 错误 Django 运行时错误。它显示了 Django 尝试与数据库联系并与之对话。

这意味着设置配置错误。要专门回答这个问题,只需将设置更新为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'localhost',
        'PORT': 5432,
    }
}


注意一个非常相似的问题并解决答案is shown here


如果这不能解决问题

如果这仍然不适合你,很可能 Github Actions 正在运行的 settings.py 不是你正在编辑的那个。

正如我提到的here,首先确保您的设置未被覆盖,并且您的 Github Actions 作业正在拉动您正在编辑 @987654334 的正确分支 @。

这可能特别困难,因为等待 Github Actions 构建的延迟会导致您正在执行的操作与结果之间存在某种脱节。

您可能认为自己正在编写相关代码/推送到正确的位置/设置正确的环境变量,但实际上并非如此。而且您可能不会检测到它,因为等待您的修复是否有效很容易分心。 :)

对此还有一点说明,Github 有一个 example simple service using postgres。仔细看。第二个示例显示了在这个问题中询问的示例,其中所有步骤都在虚拟机上运行。

【讨论】:

    【解决方案2】:

    正如@Rob 指出的正确点,settings.py 和在容器中运行的 PostgreSQL 之间的配置是错误的。简而言之,容器中的 PostgreSQL db 不会访问您的密钥,因此您需要明确地提供它们。

    settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': env('POSTGRES_DB'),
            'USER': env('POSTGRES_USER'),
            'PASSWORD': env('POSTGRES_PASSWORD'),
            'HOST': env('POSTGRES_HOST'),
            'PORT': 5432
        }
    }
    

    我使用django-environ 来存储我的环境变量。 os.getenv 也在这里工作。只需将os.getenv 更改为env

    在扩展名为.yml 的工作流文件中,services 部分应如下所示:

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

    在同一个文件中,可以安全地使用所有环境变量。例如,这显示了我的Django Testing 工作流程:

    - name: Django Testing
      env:
        DEBUG: ${{ secrets.DEBUG }}
        SECRET_KEY: ${{ secrets.SECRET_KEY }}
        POSTGRES_HOST: ${{ secrets.POSTGRES_HOST }}
        POSTGRES_DB: ${{ secrets.POSTGRES_DB }}
        POSTGRES_USER: ${{ secrets.POSTGRES_USER }}
        POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
      run: |
        python manage.py test
    

    最后,在 Github 存储库机密中,将变量定义为:

    POSTGRES_HOST --> localhost
    POSTGRES_DB --> postgres
    POSTGRES_USER --> postgres
    POSTGRES_PASSWORD --> postgres
    DEBUG --> True
    SECRET_KEY --> <Your Django Secret Key>
    

    最后,您将拥有:

    【讨论】:

      猜你喜欢
      • 2020-01-14
      • 1970-01-01
      • 2020-01-01
      • 2023-02-14
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      相关资源
      最近更新 更多