Внутри этого рабочего процесса я разворачиваю базу данных с помощью Docker и использую ее для интеграционного тестирования.
Однако при запуске команды тестирования ./gradlew она может подключиться к базе данных, но миграция не выполняется — она ведет себя так, как будто схема уже обновлена.
/>Это странно, поскольку перед инициализацией базы данных я удаляю все существующие контейнеры и тома Docker.
Мой рабочий процесс:
`имя: Java CI с Docker Compose Postgres
on: push
jobs:
build-run:
runs-on: последняя версия Ubuntu
Код: Выделить всё
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Copy .env-test to .env
run: cp .env-test .env
- name: Stop and remove all containers and volumes
run: |
docker compose down -v --remove-orphans
docker system prune -f --volumes
- name: Start services via Docker Compose
run: docker compose --env-file .env-test up -d --build
- name: Wait for Postgres to be ready
env:
POSTGRES_USER: test
POSTGRES_DB: test
run: |
echo "Waiting for database..."
POSTGRES_CONTAINER=$(docker ps -qf "name=postgres")
until docker exec db pg_isready -U $POSTGRES_USER -d $POSTGRES_DB; do
echo "Waiting for Postgres..."
sleep 2
done
- name: Print environment variables from Postgres container
run: docker exec db env
- name: Clean Database Schema
env:
DATABASE_NAME: $DATABASE_NAME
DATABASE_PASSWORD: $DATABASE_PASSWORD
DATABASE_USER: $DATABASE_USER
run: |
echo "Cleaning database schema before tests..."
docker exec -e PGPASSWORD=$DATABASE_PASSWORD db \
psql -h localhost -U $DATABASE_USER -d $DATABASE_NAME \
-c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
echo "Schema cleaned successfully."
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
- name: Grant execute permission for Gradle wrapper
run: chmod +x gradlew
- name: Cache Gradle packages
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle
- name: Run tests
env:
DATABASE_NAME: $DATABASE_NAME
DATABASE_PASSWORD: $DATABASE_PASSWORD
DATABASE_USER: $DATABASE_USER
DATABASE_HOST: $DATABASE_HOST
DATABASE_PORT: $DATABASE_PORT
JWT_SECRET_KEY: $JWT_SECRET_KEY
JWT_ISSUER: $JWT_ISSUER
FRONT_URL: $FRONT_URL
run: ./gradlew test`
- После инициализации контейнера базы данных я создаю шаг для входа в этот контейнер и запускаю
DROP SCHEMA public CASCADE;
CREATE SCHEMA public; - Проверяю переменные среды
Подробнее здесь: https://stackoverflow.com/questions/797 ... ning-tests
Мобильная версия