在我的 Django 项目中,我有一个用于运行测试的 CI 工作流,它需要 Postgres 服务。最近一个新的应用程序引入了更重的包,如 pandas、matplotlib、pytorch 等,这将 run-tests
的工作时间从 2 分钟增加到 12 分钟,这是荒谬的。同样在我的项目中,我有一个带有 Python 的基础 Docker 映像,这些包更重以加快映像的构建。所以我想在运行这些步骤时在工作流中使用相同的图像,因为包已经被加载了。
不幸的是,一切顺利,直到到达实际运行测试的步骤,因为似乎 postgres 服务未与容器连接,我收到以下错误:
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
这是我现在的工作流程。关于我做错了什么的任何想法?
name: server-ci
on:
pull_request:
types: [opened]
env:
DJANGO_SETTINGS_MODULE: settings_test
jobs:
run-tests:
name: Run tests
runs-on: ubuntu-latest
container:
image: myimage/django-server:base
credentials:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
ports:
- 8000:8000
services:
postgres:
image: postgres
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: admin
POSTGRES_DB: mydb
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
env:
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
POSTGRES_PASSWORD: admin
POSTGRES_USER: postgres
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Cache dependencies
uses: actions/cache@v2
with:
path: /opt/venv
key: /opt/venv-${{ hashFiles('**/requirements.txt') }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
if: steps.cache.outputs.cache-hit != 'true'
- name: Run tests
run: |
./manage.py test --parallel --verbosity=2
答案 0 :(得分:0)
事实证明,工作流现在在自己的容器中运行,紧挨着 postgres 容器。所以映射到运行器 VM 的端口不再做任何事情(因为它会影响主机,而不是它上面的 Docker 容器)。
作业和服务容器连接到同一个 Docker 网络,所以我需要做的就是将 POSTGRES_HOST
更改为 postgres
(服务容器的名称),剩下的由 Docker 的 DNS 完成.