Как обновить скрипты Liquibase для образа kecloak 12.0.4?

#keycloak

Вопрос:

Я пытаюсь настроить свой контейнер для докеров Keycloak. Я использую jboss/keycloak:12.0.4 в качестве базового изображения для своего образа docker.

Мне нужно запустить инструкцию SQL update для одной конкретной таблицы, как только все необходимые обновления будут сделаны сценариями Liquibase, включенными в запуск контейнера.

Где находятся сценарии на изображении? Кажется, я не могу их найти.

Примечание: Я также был бы рад получить альтернативные подходы. До тех пор, пока записи базы данных обновляются до запуска сервера блокировки ключей

Сценарий, который я хочу добавить, будет выглядеть примерно так:

db.список изменений.после развертывания.json
 {
  "databaseChangeLog": [
    {
      "changeSet": {
        "id": "RUNALWAYS-AFTER-DEPLOYMENT",
        "author": "DevOps",
        "runAlways": true,
        "failOnError": false,
        "changes": [
          {
            "sql": {
              "sql": "UPDATE public.table_name SET col1='VALUUE' WHERE id='id';"
            }
          }
        ]
      }
    }
  ]
}
 

Ответ №1:

Исходные списки изменений в базе данных Keycloak liquibase расположены в файлах JAR Keycloak, чтобы было ясно, что они доступны только для чтения.

Вам нужно будет создать свою собственную банку, которая будет содержать ваши списки изменений liquibase и некоторую конфигурацию, чтобы указать Keycloak для запуска этих сценариев.

Keycloak использует систему SPI (Интерфейсы поставщика услуг) для расширения сервера, в вашем случае вам необходимо реализовать JpaEntityProvider , которая содержит метод для указания Keycloak местоположения списков изменений liquibase.

Пример :

 public class ExampleJpaEntityProvider implements JpaEntityProvider {

// List of your JPA entities.
@Override
public List<Class<?>> getEntities() {
    return Collections.emptyList();
}

// This is used to return the location of the Liquibase changelog file.
// You can return null if you don't want Liquibase to create and update the DB schema.
@Override
public String getChangelogLocation() {
        return "META-INF/example-changelog.xml";
}

// Helper method, which will be used internally by Liquibase.
@Override
public String getFactoryId() {
    return "sample";
}

...
 

}

Keycloak автоматически развернет банки SPI, если вы поместите их в следующую папку : standalone/deployments/

Вот документация, относящаяся к поставщику JpaEntityProvider : https://www.keycloak.org/docs/latest/server_development/index.html#_extensions_jpa

Вот еще несколько общих документов о том, как создавать и развертывать SPI : https://www.keycloak.org/docs/latest/server_development/index.html#_providers

Комментарии:

1. Спасибо, @Lucas Decercq. Как только я удостоверюсь, что решение работает для меня, я отмечу это как ответ!