在Gitlab-CI中以User身份运行Pytest



在我的python包存储库中有以下gitlab-ci.yml:

image: python:latest
unit-test:
stage: test
tags:
- docker
script:
- pip install tox
- tox
formatting-check:
stage: test
tags:
- docker
script:
- pip install black
- black --check .

使用tox.ini文件:

[tox]
envlist = my_env
[testenv]
deps =
-rrequirements.txt
commands =
python -m pytest tests -s

这是我想要的。

然而,然后我添加了测试,使用https://pypi.org/project/pytest-postgresql/针对本地Postgresql数据库测试我的代码。为此,我必须安装PostgreSQL(apt -y install postgresql postgresql-contrib libpq5)。

当我把这个添加到我的gitlab-ci.yml:

image: python:latest
unit-test:
stage: test
tags:
- docker
script:
- apt -y install postgresql postgresql-contrib libpq5
- pip install tox
- tox
formatting-check:
stage: test
tags:
- docker
script:
- pip install black
- black --check .

我从tox得到了错误,Postgres (pg_ctl)中的一些模块不允许作为根运行。登录这里:https://pastebin.com/fMu1JY5L

因此,我必须以用户而不是根用户的身份执行tox。

我的第一个想法是创建一个新用户(useradd),然后切换到该用户,但su需要输入密码。

通过谷歌搜索,我发现创建新用户最简单的解决方案是使用Docker-in-Docker创建一个新的Docker镜像。

所以,到目前为止,我有这样的配置:gitlab-ci.yml:

image: docker:19.03.12
services:
- docker:19.03.12-dind
stages:
- build
- test
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
CONTAINER_TEST_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker info
docker-build:
stage: build
script:
- docker build --pull -t $CONTAINER_TEST_IMAGE .
- docker push $CONTAINER_TEST_IMAGE
formatting-check:
stage: test
script:
- docker pull $CONTAINER_TEST_IMAGE
- docker run $CONTAINER_TEST_IMAGE black --check .
unit-test:
stage: test
script:
- docker pull $CONTAINER_TEST_IMAGE
- docker run $CONTAINER_TEST_IMAGE tox

Dockerfile:

FROM python:latest
RUN apt update
RUN apt -y install postgresql postgresql-contrib libpq5
RUN useradd -m exec_user
USER exec_user
ENV PATH "$PATH:/home/exec_user/.local/bin"
RUN pip install black tox

(我不得不添加ENV PATH "$PATH:/home/exec_user/.local/bin",因为pip会因为它不在路径中而哭泣)

tox.ini:

[tox]
envlist = my_env
[testenv]
deps =
-rrequirements.txt
commands =
python -m pytest tests -s

任务docker-build完成,其他两个任务失败。

对于formatting-check:

$ docker run $CONTAINER_TEST_IMAGE black --check .
ERROR: Job failed: execution took longer than 1h0m0s seconds

black命令通常执行得非常快(<1s)。

对于unit-test:

/bin/sh: eval: line 120: tox: not found
Cleaning up file based variables
00:01
ERROR: Job failed: exit code 127

我也发现,用docker run $CONTAINER_TEST_IMAGE python3 -m tox代替docker run $CONTAINER_TEST_IMAGE tox不起作用。在这里,没有找到python3(这似乎很奇怪,因为基础图像是python:latest)。


如果你知道如何解决这个问题,请告诉我:D

我的第一个想法是创建一个新用户(useradd),然后切换到该用户,但是su需要输入密码。

这应该适用于您的用例。以root身份运行su不需要密码。您也可以使用sudo -u postgres tox(必须先使用apt install sudo)。

作为一个基本的工作示例,使用su(如图- job所示)使用postgres用户,该用户是在安装postgres时自动创建的。

myjob:
image: python:3.9-slim
script:
- apt update && apt install -y --no-install-recommends libpq-dev postgresql-client postgresql build-essential
- pip install psycopg2 psycopg pytest pytest-postgresql
- su postgres -c pytest  
# or in your case, you might use: su postgres -c tox

或者,如果这是你唯一的障碍,你可以考虑使用GitLab的服务特性来运行你的postgres服务器。您可以将--postgresql-host--postgresql-password传递给pytest,告诉扩展使用这些服务。

相关内容

  • 没有找到相关文章