Gitlab CI使用postgres13运行PGTap测试报pg_prove不存在如何解决
问题原因
pg_prove: command not found报错是因为你当前CI使用的postgres:13.1-alpine官方镜像仅预装了PostgreSQL服务端和基础客户端工具,未包含PGTap对应的测试执行工具pg_prove。
方案1:直接在script段安装pg_prove
不需要修改镜像,直接在CI任务的script开头添加alpine包安装命令即可,修改后的pgtap任务配置如下:
pgtap: only: refs: - merge_request - master changes: - ddl/**/* image: postgres:13.1-alpine services: - name: postgres:13.1-alpine alias: db variables: POSTGRES_DB: postgres POSTGRES_USER: postgres POSTGRES_PASSWORD: "" POSTGRES_HOST_AUTH_METHOD: trust script: # 新增安装pgtap(包含pg_prove工具) - apk add --no-cache pgtap - psql postgres://postgres@db/postgres -c 'create extension pgtap;' - psql postgres://postgres@db/postgres -f ddl/01.sql - cd ddl/ - psql postgres://postgres@db/postgres -f 02.sql - psql postgres://postgres@db/postgres -f 03.sql - pg_prove -d postgres://postgres@db/postgres --recurse test_*
这个方案改动最小,适合临时验证使用,缺点是每次CI任务执行都会重复执行安装操作,会增加任务耗时。
方案2:复用本地现有Dockerfile(更优)
你本地已经有基于postgres:13.3-alpine安装好PGTap的Dockerfile,可以直接复用这个镜像解决CI问题,优势如下:
- CI环境和本地开发环境完全一致,避免出现本地测试通过、CI执行失败的兼容性问题
- 不需要每次CI执行都重复安装依赖,大幅缩短任务执行时间
操作步骤:
- 将本地的Dockerfile构建为镜像,推送到你所在团队的私有镜像仓库或者Gitlab自带的容器Registry
- 将CI配置中
image: postgres:13.1-alpine替换为你推送的自定义镜像地址即可 - 若要保证服务端PGTap扩展版本和客户端一致,也可以将
services中的镜像地址同步替换为你的自定义镜像
额外注意事项
- 原配置中
POSTGRES_PASSWORD: ""属于转义错误,要替换为POSTGRES_PASSWORD: ""否则数据库初始化会异常 - 若使用自定义镜像,注意镜像的PostgreSQL大版本要保持13.x,避免和服务端版本不兼容
内容的提问来源于stack exchange,提问作者nimgwfc
相关产品推荐
相关产品推荐

