Что делать, если не срабатывает использование тестового профиля Java в Workflow gihub'a?
Столкнулся со следующей проблемой:
Имеется интеграционный тест, использующий тестовый профиль
@ActiveProfiles("test")
@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
class TelegramUserRepositoryIT {
@Autowired
private TelegramUserRepository telegramUserRepository;
@Sql(scripts = {"/sql/clear_tg_users.sql", "/sql/insert_tg_users.sql"})
@Test
public void shouldProperlyFindAllActiveUsers() {
//when
List<TelegramUser> users = telegramUserRepository.findAllByActiveTrue();
//then
Assertions.assertEquals(5, users.size());
}
@Sql(scripts = {"/sql/clear_tg_users.sql"})
@Test
public void shouldProperlySaveTelegramUser() {
//given
TelegramUser telegramUser = new TelegramUser();
telegramUser.setChatId("1234567890");
telegramUser.setActive(false);
telegramUserRepository.save(telegramUser);
//when
Optional<TelegramUser> saved = telegramUserRepository.findById(telegramUser.getChatId());
//then
Assertions.assertTrue(saved.isPresent());
Assertions.assertEquals(telegramUser, saved.get());
}
}
И соответсвенно, два файла с пропертями, в которых прописаны данные для реального подключения к БД и для тестового
application.properties - здесь используется БД из контейнера Докера, поднятая в той же сети что и приложение. Имя БД jrtb-db
bot.username = ${BOT_NAME}
bot.token = ${BOT_TOKEN}
spring.datasource.url=jdbc:postgresql://jrtb-db:5432/jrtb_db
spring.datasource.username = ${BOT_DB_NAME}
spring.datasource.password = ${BOT_DB_PASSWORD}
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.driver-class-name = org.postgresql.Driver
application-test.properties - БД, поднятая на localost
bot.username = ${BOT_NAME}
bot.token = ${BOT_TOKEN}
spring.datasource.url=jdbc:postgresql://localhost:5432/dev_jrtb_db
spring.datasource.username=dev_jrtb_user
spring.datasource.password=dev_jrtb_pass
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.driver-class-name = org.postgresql.Driver
При ручном запуске теста с поднятой на локалхосте БД, всё работает норм. Для подключения используются данные из application-test.properties
При запуске workflow на гитхабе, тесты ломаются с ошибкой
org.postgresql.util.PSQLException: The connection attempt failed.
Caused by: java.net.UnknownHostException: jrtb-db
Судя по выведенному имя БД, используются данные из application.properties. И это действительно так.
Вопрос - как сделалать, чтобы данные для подключения смотрелись в application-test.properties ? Почему на срабатывает @ActiveProfiles("test")
?
Файл worflow github'a:
# Имя workflow, т.е. рабочего процесса, который будет в git hub actions
name: Java CI with Maven
# указываем, при каких действиях он будет вызываться.
# Подробный список действий https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
# указываем "работы" (группировки действий), которые будут выполняться в рамках текущего workflow
# по умолчанию выполняются параллельно друг другу. Можно настроить, чтобы последовательно
jobs:
# имя работы
build:
# какое то разрешение
permissions: write-all
# указываем на чем она будет запускаться ( можно виндоус еше и т д. Это ресурсы гитхаба)
runs-on: ubuntu-latest
services:
# Label used to access the service container
postgres:
# Docker Hub image
image: postgres
# Provide the password for postgres
env:
POSTGRES_USER: dev_jrtb_user
POSTGRES_PASSWORD: dev_jrtb_pass
POSTGRES_DB: dev_jrtb_db
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
# указываем конкретные шаги в рамках текущей работы, которые надо выполнить
steps:
# имя шага
- name: Checkout
# указываем действие. Действие - это сразу группа команд. Действия есть куча предопределенных, их можно брать тут https://github.com/marketplace?type=actions
uses: actions/checkout@v3
# имя след шага
- name: Set up JDK 17
uses: actions/setup-java@v3
# для текущего действия надо задать доп параметры
with:
java-version: '17'
distribution: 'temurin'
cache: maven
- name: Build with Maven
env:
BOT_NAME: ${{ secrets.BOT_NAME }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
POSTGRES_HOST: localhost
# The default PostgreSQL port
POSTGRES_PORT: 5432
# вместо действия можно указать конкретнкую команду, которая выполнится. Здесь мы указываем, чтобы выполнилась команда mvn -B package --file pom.xml
# выполнится она на ubuntu-latest, которую мы указали ранее для Job
run: mvn -B package --file pom.xml
# Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive
- name: Update dependency graph
uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6
Полный код:
https://github.com/Naroru/JavaRushTelegramBot/tree/STEP_5_JRTB-1