Релизы
Contents
Релизы#
Релиз представляет из себя снимок файлов определенной версии.
Решение#
Релиз решения содержит перечень модулей и их версии.
Конфигурация#
Релиз конфигурации содержит данные и скрипты обновления конфигурации решения
.
База выпуска релизов выбирается по согласованию с заказчиком.
Сервер приложения#
Содержит в себе ядровой функционал необходимый для запуска решения. Использует семантическое версионирование.
Комплект сборки#
Содержит скомпилированные прикладные модули. Версия формируется по следующему правилу:
GENERATION
Модули должны содержать одно поколение.MAJOR
Перещелкивается при любом изменении мажорной версии модуля в составе комплекта.MINOR
Перещелкивается при любом изменении минорной версии модуля в составе комплекта.BUILD
Перещелкивается при любом изменении билда версии модуля в составе комплекта.PATCH
Перещелкивается при любом изменении патч версии модуля в составе комплекта.
Snapshot версия#
Используется для распространения артефактов из ночной сборки или внеплановой сборки. Артефакты snapshot версии могут повторно закачиваться в репозиторий.
Для обновления Snapshot версий разработчику необходимо выполнить следующие команды sbt
sbt clean
sbt update
sbt updateClassifiers
sbt publishDevDependencies
Релиз прикладного модуля#
Исходный код, согласованный на момент выпуска релиза, а также скрипты необходимые для установки обновления модуля в базе даннхы.
Версия модуля#
Версия модуля задается в формате: Поколение.МажорнаяВерсия.МинорнаяВерсия.Билд.Патч
Типы релиза#
Поколение
- Крупные изменения, которые ломают обратную совместимость. Старшая версия может означать полное переписывание кода. Так же в этом типе релиза происходит очистка миграционных скриптов предыдущей версии. Устанавливается только на предыдущее поколение.Мажор
– Крупные изменения, которые могут ломать обратную совместимость. К примеру переключение сервера приложений или обновление SBT плагина.Минор
– Плановые изменения в рамках развития модуля, а так же изменение конфигурации модулей проекта (добавление, удаление модулей).Билд
– Сквозная нумерация. Увеличивается при выпуске любой из версий, не считая патчей.Патч
– Изменения критических ошибок на уже выпущенных версиях. От патчей нельзя создавать другие версии, кроме последующих патчей.
Состав релиза#
Релиз состоит из:
Исходного кода
Первичных данных, указанных в
odm.xml
иpkg.xml
Первичных и миграционных данных, указанных в пакетах миграции (
<Имя модуля>_MigratePkg
)Sql
-скриптов миграции
Схема базы данных модуля#
Схема базы данных, прикладного модуля создается в базе данных при установке модуля.
Объекты схемы, которые были сформированы ранее, и были удалены из исходного кода приложения, не удаляются из БД автоматически. Этим занимается администратор используя инструмент «Корзина удаленных объектов схемы».
Доменная схема#
Доменная схема, представляет из себя таблицы, индексы и последовательности создаваемые по описанию классов в odm
-файлах.
Расширенная схема#
Расширенная схема, может быть описана в odm
-, pkg
-файлах, в тэге dbSchema
.
Поставочные данные модуля#
Поставочные данные прикладного модуля устанавливаются в базу данных при установки модуля.
Миграционные данные#
Миграционные данные делятся на 2 типа:
Sql-скрипты
- используются для работы с изменением схемы напрямую в БД, безeclipse-link
. Хранятся в структуре модуля в веткеresource/migration/dbSchema
Миграционные задачи
– скрипты, которые написаны с использованиемApi
иPkg
. Хранятся в миграционных пакетах модуля.
Миграционные пакеты#
Общие сведения#
В каждом модуле возможно создание миграционного пакета, который должен иметь имя <Имя модуля>_MigratePkg
, и находится в рутовом scala
-каталоге модуля. Например, полное имя пакета модуля btk
будет иметь вид: ru.bitec.app.btk.Btk_MigratePkg
Этот пакет используется для написания кода по установке первичных данных или выполнения миграции данных, которое можно выполнить с помощью scala
-кода.
Миграционные пакеты требуется наследовать от MigratePkg
, переопределяя в них методы onUpMigrate
и onDownMigrate
, в этих методах требуется создавать соответствующие задачи миграции через методы upTask
и downTask
.
Вызов миграционных пакетов осуществляется после выполнения команды установки первичных данных (init data
).
Порядок вызова#
Вызов миграционных пакетов осуществляется в 2 прохода:
первый раз осуществляется вызов метода
upMigrate
, при обходе модулей от низкоуровневых (например,gtk
), к высокоуровневым (например,stk
). В этом методе можно писать логику по созданию новых данныхпри втором проходе вызывается метод
downMigrate
, при проходе модулей от высокоуровневых к низкоуровневым. В этом методе можно удалять данные.
Миграционные задачи#
Задачи имеют имя и версию. Задача выполняется только один раз, для того чтобы выполнить задачу повторно, требуется изменить ее версию или имя. Задачи делятся на 2 вида:
upTask
- используется вupMigrate
downTask
– используется вdownMigrate
UpTask#
Задачи метода upMigrate
. Позволяют указывать зависимости от других задач, от скриптов dbData
из odm.xml
и pkg.xml
. Могут содержать секцию, которая будет выполнена, если задача уже выполнялась на целевой базе. А также могут быть анонимными и не содержать тело.
Простая задача#
Содержит только тело. Пример объявления задачи:
upTask("taskWOElse", 1){
//Код задачи
}
Задача с секцией orElse#
Если задача выполняет установку каких-то данных, например, типа объекта, то можно указать ей секцию orElse
, которая будет вызвана, если тело задачи уже было выполнено, например, в этой секции можно вызвать метод поиска типа объекта по его системному имени. Пример объявления такой задачи:
upTask("installType", 1){
Btk_AuditActionApi().register("someName", "someCaption", "SomeDesc")
}.orElse{
Btk_AuditActionApi().findByMnemoCode("someName")
}
Анонимная задача#
Задача без тела, выполняется для группировки зависимостей. Пример объявления:
upTask("dependencyGroup")
.dependsOnDbData("Wf_Doc", "dataInstall", 25)
.dependsOn(installStkTypeTask())
Зависимости#
Для каждой задачи можно указать зависимость как от другой задачи, так и от данных, устанавливаемых секцией dbData
.
Пример объявления зависимостей.
val someOtherTask = upTask("someOtherTask", 1){
//Код задачи
}
upTask("taskWOElse", 1){
//Код задачи
}
.dependsOnDbData("Wf_Doc", "dataInstall", 25) //зависимость от dbData
.dependsOn(someOtherTask) // зависимость от другой задачи
Зависимости между модулями.#
Для того чтобы сделать зависимость задачи одного модуля (module1
) от задачи другого (module2
) требуется:
В
Module1_MigratePkg
задачу вынести в отдельный метод и вызывать его изupMigrate.
def someTask(): UpTask[NLong] = { upTask("someTask", 1){ 1.nl } } override def onUpMigrate(): Unit = { someTask() }
В
Module2_MigratePkg
для задачи указать зависимость от задачи изmodule1
.override def onUpMigrate(): Unit = { val someTask = Module1_MigratePkg().someTask() upTask("someDepTask", 1){ //Получаем значение, которое вернула задача, от которой зависим val someTaskValue = someTask.get() } .dependsOn(someTask) }
DownTask#
Задачи метода downMigrate
. Содержат только тело задачи. Пример объявления задачи:
downTask("Task_Down", 1) {
//код задачи
}
Sql-скрипты миграции#
Общие сведения#
Используются для внесения изменений в схему БД, до инициализации eclipse-link
. Позволяют гарантированно выполняться в схеме, идентичной той, что была на момент выпуска релиза.
Описание файла скриптов#
Миграционные скрипты размещаются внутри файла resource/migration/trunk.script.jexl
. А при выпуске релиза копируются в подкаталог resource/migration/dbSchema
.
Скрипты пишутся в формате jexl
-скрипта, и могут быть выполнены до обновления схемы или после.
Исполняются внутри специального jexl
-контекста, который обладает функциями:
before
– скрипт будет выполнен до обновления схемыafter
– скрипт будет выполнен после обновления схемы.
Если при выполнении скрипта миграции будет получена ошибка, то процесс установки релиза и обновления базы будет прерван. Для того, чтобы выполнить какой-либо скрипт с игнорированием ошибок нужно добавить к нему директиву force()
.
Пример файла скриптов#
//выполнение скрипта после обновления схемы
after("scriptName1", `
delete from btk_class where 1=2 asd
`);
//выполнение скрипта перед обновлением схемы
before("scriptName2", `
delete from btk_class where 1=2
`);
//выполнение скрипта с игнорированием ошибок.
//Если в таком скрипте произойдет ошибка, то обновление не будет остановлено
after("scriptName3", `
delete from btk_class where 1=2
`).force();
Инструкции#
Создание задачи миграции#
Зайдите в IDE
В нужном модуле в
scala
-ветки найдите или создайте пакет с именем<Имя модуля>_MigratePkg
Создайте задачу миграции, используя методы
upTask
илиdownTask
Создание sql-скрипта миграции#
Зайдите в IDE
В нужном модуле в ветке
resource/migration
найдите или создайте файлtrunk.script.jexl
Добавьте в него скрипт используя методе
before
илиafter
Выпуск новой версии#
Установка релиза#
Сервер приложений Global должен быть запущен.
Подключитесь к серверу
SSH
-клиентом. И выполните скрипт.attach db {dbAlias} as sys upgrade detach exit
dbAlias
– алиас базы данных. Если не указан, будет использоваться значение по умолчанию изglobal3.config.xml
Обновление будет выполняться под суперпользователем SYS
Алгоритм работы#
Shh
-командаattach db as sys
переключает консоль в режим работы с обновлениями.Команда
upgrade
запустит процесс обновления, состоящий из следующих действий:Формирование очереди выполнения
sql
-скриптов миграции.Последовательное обновление схемы с промежуточными выполнениями скриптов
Установка первичных данных (
dbData
)Выполнение задач миграции
Отключение от базы
Выход из SSH
Сброс состояния обновления#
Если требуется откатить информацию об установленных первичных данных или миграционных задачах, то используется ssh
-команда reset upgrade
Если в нее не передан идентификатор обновления, то будет сброшено последнее выполненное обновление.
attach db {dbAlias} as sys
reset upgrade
detach
exit
или
attach db {dbAlias} as sys
reset upgrade 10202
detach
exit