Próbuję uruchomić pracę CI w Gitlab, gdzie testy integracyjne zależą od PostgreSQL.

W Gitlab użyłem biegacza PostgreSQL. Problem polega na tym, że testy integracji wymagają rozszerzenia UUID-OSSSP. Mogę uruchomić polecenia SQL przed każdym testem, aby zapewnić stosowanie rozszerzenia, ale wolałbym stosować go raz przed uruchomieniem wszystkich testów.

Użyłem więc znacznika obrazu w skrypcie CI, aby dodać plik .sh na obrazie PostgreSQL w /docker-entrypoint-initdb.d/, a następnie spróbuj uruchomić testy integracyjne z tym samym obrazem. Problem polega na tym, że wydaje się, że nie ma zastosowania rozszerzenia, ponieważ testy integracyjne nie działają, gdy używane są funkcje 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

Alternatywny, który miałem nadzieję, że działa

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

Ale w tym przypadku klient nie jest w stanie połączyć się z Postgres (wyobrażam sobie, że to dlatego, że edytuję obraz nie działa?)

Muszę brakować czegoś oczywistego, czy jest to nawet możliwe?

0
Ankur22 17 marzec 2020, 01:46

2 odpowiedzi

Najlepsza odpowiedź

W tej chwili musiałem zrobić coś małego śmierżnego i pobierania klienta postgres przed uruchomieniem instalacji rozszerzenia.

.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

To nie jest idealne. Mam nadzieję, że istnieje sposób na uratowanie stanu obrazu dokującego między etapami, ale nie wydaje się, aby ta opcja. Więc opcje wydają się być albo:

  1. Zainstaluj go podczas etapu integracji testowej.
  2. Utwórz wizerunek podstawy specjalnie w tym celu, w którym instalacja ekspansji została już wykonana.

Przeszedłem z opcją 1 na razie, ale odpowiem, jeśli znajdę coś bardziej zwięzły, łatwiej jest utrzymać i szybko.

0
Ankur22 17 marzec 2020, 10:04

W obu przypadkach w pracy prep-postgres wprowadzasz zmiany w pojemniku do biegania (z {X1}} Image), ale nie zapisujesz tych zmian, więc test-integration Praca nie może ich używać.

Poradzam, aby zbudować swój własny obraz za pomocą skryptu Dockerfile i skryptu wprowadzającego dla obrazu Docker Postgre. To Odpowiedź z @elton Stoneman może pomóc.

Po tym możesz skosztować wcześniej zbudowanego obrazu jako services: w pracy test-integration i skorzystasz z utworzonego rozszerzenia.

1
Nicolas Pepinster 17 marzec 2020, 07:17