我正在尝试在gitlab中运行CI作业,其中集成测试取决于PostgreSQL。
在gitlab中,我使用了postgresql运行程序。问题是集成测试需要扩展名uuid-ossp。我可以在每次测试之前运行SQL命令以确保应用了扩展名,但我希望在运行所有测试之前先应用一次。
因此,我已使用CI脚本中的image标签在/docker-entrypoint-initdb.d/
中的postgresql图像中添加了一个.sh文件,然后尝试对同一图像运行集成测试。问题在于,由于使用uuid函数的集成测试失败,因此似乎未应用扩展-function uuid_generate_v4() does not exist
prep-postgres:
stage: setup-db
image: postgres:12.2-alpine
script:
- echo "#!/bin/bash
set -e
psql \"$POSTGRES_DB\" -v --username \"$POSTGRES_USER\" <<-EOSQL
create extension if not exists \"uuid-ossp\";
EOSQL" > /docker-entrypoint-initdb.d/create-uuid-ossp-ext.sh
artifacts:
untracked: true
test-integration:
stage: test
services:
- postgres:12.2-alpine
variables:
POSTGRES_DB: db_name
POSTGRES_USER: postgres
script:
- go test ./... -v -race -tags integration
我希望能够奏效的另一种选择是
prep-postgres:
stage: setup-db
image: postgres:12.2-alpine
script:
- psql -d postgresql://postgres@localhost:5432/db_name -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";"
artifacts:
untracked: true
但是在这种情况下,客户端无法连接到postgres(我想是因为我正在编辑未运行图像的图像?)
我肯定想念一些明显的东西,或者甚至有可能吗?
答案 0 :(得分:1)
在两种情况下,作业prep-postgres
都在运行容器中进行更改(来自postgres:12.2-alpine
图像),但是您没有保存这些更改,因此test-integration
作业无法使用它们。
我建议您使用Dockerfile
和Postgres Docker映像的入口点脚本构建自己的映像。 @Elton Stoneman的answer可以为您提供帮助。
此后,您可以在services:
作业中将以前构建的映像称为test-integration
,您将受益于创建的扩展名。
答案 1 :(得分:0)
此刻,我必须做点臭事,并在运行扩展安装之前下载postgres客户端。
.prepare_db: &prepare_db |
apt update \
&& apt install -y postgresql-client \
&& psql -d postgresql://postgres@localhost/db_name -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";"
test-integration:
stage: test
services:
- postgres:12.2-alpine
variables:
POSTGRES_DB: db_name
POSTGRES_USER: postgres
script:
- *prepare_db
- go test ./... -v -race -tags integration
这不是完美的。我希望有一种方法可以在阶段之间保存Docker映像的状态,但是似乎没有这种选择。因此,选项似乎是:
我现在已经选择了选项1,但是如果我发现更简洁,更易于维护和更快捷的内容,则会回复。