如何在gitlab CI中运行脚本之前将脚本添加到图像

时间:2020-03-16 22:46:31

标签: postgresql gitlab gitlab-ci

我正在尝试在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(我想是因为我正在编辑未运行图像的图像?)

我肯定想念一些明显的东西,或者甚至有可能吗?

2 个答案:

答案 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. 在测试集成阶段安装它。
  2. 为此目的专门创建一个基础映像,其中已经完成了扩展的安装。

我现在已经选择了选项1,但是如果我发现更简洁,更易于维护和更快捷的内容,则会回复。