Как добавить скрипты в изображение перед запуском их в gitlab CI - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь запустить задание CI в gitlab, где интеграционные тесты зависят от postgresql.

В gitlab я использовал бегун postgresql. Проблема в том, что интеграционные тесты требуют расширения uuid-ossp. Я мог бы запускать команды SQL перед каждым тестом, чтобы убедиться, что расширение применено, но я бы предпочел применить его один раз перед запуском всех тестов.

Так что я использовал тег image в скрипте CI добавить файл. sh в образ postgresql в /docker-entrypoint-initdb.d/, а затем попытаться запустить интеграционные тесты с тем же образом. Проблема в том, что оно, кажется, не применяет расширение, поскольку интеграционные тесты не выполняются там, где используются функции 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 ]

1 голос
/ 17 марта 2020

В обоих случаях в задании prep-postgres вы вносите изменения в работающий контейнер (из образа postgres:12.2-alpine), но не сохраняете эти изменения, поэтому test-integration задание не может их использовать.

Я советую вам создать свой собственный образ, используя Dockerfile и скрипт точки входа для Postgres Docker изображения. Этот ответ от @Elton Stoneman может помочь.

После этого вы можете ссылаться на ранее созданное изображение как services: в задании test-integration, и вы получите выгоду от созданного расширения.

0 голосов
/ 17 марта 2020

В данный момент мне пришлось сделать что-то немного вонючее и загрузить 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, но отвечу, если найду что-то более краткое, более простое в обслуживании и быстрое.

...