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?
2 odpowiedzi
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:
- Zainstaluj go podczas etapu integracji testowej.
- 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.
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.
Podobne pytania
Powiązane pytania
Nowe pytania
postgresql
PostgreSQL to system zarządzania relacyjnymi bazami danych typu open source (RDBMS) dostępny dla wszystkich głównych platform, w tym Linux, UNIX, Windows i OS X. Podczas zadawania pytań prosimy o podanie swojej wersji Postgres. Pytania dotyczące administracji lub zaawansowanych funkcji najlepiej kierować na dba.stackexchange.com.