Creatio позволяет использовать любые системы контроля версий. В этой статье мы рассмотрим применение наиболее популярной из них — Subversion (SVN).
Subversion (SVN) — это бесплатная система управления версиями с открытым исходным кодом.
Основа SVN — хранилище, которое содержит данные в форме иерархии файлов и каталогов — т. н. дерева файлов.
Возможные действия пользователей с хранилищем SVN:
-
Чтение данных других пользователей системы, к которым они предоставили доступ:
- Чтение файлов других пользователей системы и дерева каталогов.
- Чтение дерева каталогов.
- Просмотр предыдущих версий файлов и дерева каталогов.
-
Изменение данных:
- Cоздание новых каталогов и файлов.
- Переименование каталогов и файлов.
- Изменение содержимого файлов.
- Удаление каталогов и файлов.
- Запись данных для предоставления доступа другим пользователям системы.
В одном из нижеприведенных случаев система контроля версий SVN рекомендуется к использованию для:
- Приложений Creatio на платформе .NET Framework.
- Приложений, в которых разработка ведется, в основном, low-code инструментами.
- Cloud-приложений.
Для on-site приложений рекомендуется использовать Git. Работа с системой контроля версий Git описана в статье Контроль версий в Git.
Инструкция по настройке и использованию SVN содержится в документации SVN.
Основные понятия
Хранилище — центральная база данных, обычно расположенная на файловом сервере и содержащая файлы со своей историей версий. Хранилище может быть доступно посредством различных сетевых протоколов или с локального диска.
Рабочая копия — каталог на локальном компьютере, с которым работает пользователь. Рабочая копия содержит копию файлов, которые были в хранилище до того, как их начал изменять пользователь. Таким образом можно узнать, какие конкретно изменения были выполнены.
Ревизия — состояние дерева файловой системы. Ревизия подразумевает весь набор изменений файлов и каталогов как единое изменение.
Фиксация изменений дерева файловой системы — это атомарная операция, которая позволяет зафиксировать ревизию.
Ревизии в хранилище можно представить в виде серии деревьев файловой системы — массива номеров ревизий, начинающегося с 0 и растущего слева направо. Под каждым номером расположено дерево файловой системы — "снимок" состояния хранилища после фиксации.
Общая последовательность работы с файлами в рабочей копии:
- Получение из хранилища последней версии файлов.
- Локальная работа с файлами.
- Фиксация файлов в хранилище.
Модели версионирования
При работе с SVN может возникнуть ситуация, когда разработчики работают над одной и той же функциональностью, реализованной в одном и том же файле. Если первый разработчик сохранит свои изменения первым, а второй — несколькими секундами позже, то изменения, внесенные первым разработчиком, могут быть затерты. И хотя эти изменения содержатся в хранилище, правки, внесенные первым разработчиком, будут отсутствовать в последней ревизии файла. Чтобы избежать подобной проблемы, используются модели версионирования.
Типы моделей версионирования:
- Модель "Блокирование-Изменение-Разблокирование".
- Модель "Копирование-Изменение-Слияние".
Модель "Блокирование-Изменение-Разблокирование"
Хранилище разрешает вносить изменения в файл только одному пользователю за раз. До того как первый пользователь сможет внести изменения в файл, он должен сначала заблокировать этот файл. Второй пользователь не сможет зафиксировать изменения до тех пор, пока первый не внесет изменения в хранилище и не снимет блокировку.
Особенности модели:
-
Блокирование может вызвать проблемы администрирования.
Первый разработчик может забыть снять блокировку, что приведет к потере времени вторым разработчиком.
-
Блокирование может вызвать излишнюю пошаговость.
Если разработчики работают с непересекающимися частями файла, то можно было бы работать с файлом одновременно, предполагая корректное слияние изменений.
-
Блокирование может вызвать ложное чувство безопасности.
Разработчики могут одновременно работать с разными файлами, содержащими зависящую друг от друга функциональность. Каждый разработчик заблокировал свой файл и считает, что начинает безопасную изолированную задачу. Это препятствует заблаговременному обсуждению изменений, которые могут быть несовместимы друг с другом, что приведет к неработоспособности разрабатываемого решения.
Эту модель необходимо использовать, если выполняется работа над файлами, не поддающимися слиянию. Например, если хранилище содержит изображения, и пользователи изменяют их в одно и то же время, то нет возможности выполнить слияние эти изменения.
Модель "Копирование-Изменение-Слияние"
Клиентское приложение каждого пользователя считывает из хранилища проект и создает персональную рабочую копию — локальную копию файлов и каталогов хранилища. После этого пользователи работают, одновременно изменяя свои личные копии. В результате работ, личные копии сливаются в новую, финальную версию. Обычно SVN выполняет слияние автоматически, но выполнение слияния необходимо подтвердить.
Если при одновременной работе двух пользователей изменения пересекаются, то возникает конфликт.
Чтобы разрешить конфликт необходимо:
- Обсудить изменения, которые вызвали конфликт, с пользователем, выполняющим предыдущую фиксацию файлов.
- Вручную выбрать, какие изменения из набора конфликтующих изменений необходимо зафиксировать.
- Зафиксировать в хранилище объединенный файл.
Решающим фактором при использовании этой модели является взаимодействие между пользователями.
Работа с файлами в SVN
В служебный каталог .svn рабочей копии для каждого файла SVN записывает свойства.
Свойства файла:
- Рабочая ревизия файла — номер ревизии, на которой основан файл в рабочей копии.
- Дата и время последнего обновления локальной копии файла из хранилища.
Назначение свойств — определить состояние файла рабочей копии.
Состояния файла рабочей копии:
-
Не изменялся и не устарел.
В хранилище не фиксировались изменения файла со времени его рабочей ревизии. При попытке его обновить или зафиксировать не будет выполнено никаких действий.
-
Изменен локально и не устарел.
В хранилище не фиксировались изменения этого файла со времени его базовой ревизии. Обновление выполняться не будет. Фиксация в хранилище выполнится успешно.
-
Не изменялся и устарел.
Файл в рабочей папке не изменялся, но был изменен в хранилище. Файл необходимо обновить для соответствия текущей публичной ревизии. Фиксация выполняться не будет. Обновление выполнится успешно.
-
Изменен локально и устарел.
Файл был изменен как в рабочей папке, так и в хранилище. Попытка фиксации потерпит неудачу. Файл необходимо сначала обновить, попытавшись объединить опубликованные другим разработчиком изменения с локальными. Если SVN не сможет выполнить объединение самостоятельно, решение конфликта будет выполнять пользователь.
Рабочая копия, используемая приложением Creatio
В Creatio по умолчанию включен режим работы с SVN. При выключенном режиме разработки в файловой системе приложение Creatio использует собственную рабочую копию каждого пользовательского пакета, для которого подключена версионность. Эти рабочие копии размещаются в каталоге, указанном в элементе defPackagesWorkingCopyPath конфигурационного файла ConnectionStrings.config.
Если включен режим разработки в файловой системе, то рабочая копия может быть создана вручную в каталоге [Путь к приложению]\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\НазваниеПакета.
Клиентское приложение для работы с SVN
Для работы с SVN в файловой системе рекомендуется использовать клиентское приложение TortoiseSVN версии не ниже 1.9. Оно реализовано как расширение оболочки Windows и встраивается в контекстное меню проводника Windows. Использование TortoiseSVN описано в документации по TortoiseSVN.
Если не предполагается разработка с использованием SVN, то при включенном режиме разработки в файловой системе последовательность создания пакета ничем не отличается от обычного режима.
При включенном режиме разработки в файловой системе механизм интеграции с системой хранения версий (SVN) отключен. Встроенными средствами можно только установить либо обновить пакеты из хранилища SVN. Поэтому рекомендуется создавать пакет с помощью встроенных средств, а привязывать его к хранилищу с помощью сторонних утилит, например, TortoiseSVN.
1. Создать пакет в приложении
На вкладке Пакеты (Packages) раздела Конфигурация (Configuration) в контекстном меню выбрать действие Добавить (Add)).
В появившейся карточке пакета заполнить основные поля свойств пакета. Необходимо указать название репозитория, к которому будет привязан пакет.
2. Выгрузить созданный пакет в файловую систему
Выполнить действие Выгрузить пакеты в файловую систему (Download packages to file system).
В результате пустой пакет будет выгружен в каталог Путь к установленному приложению\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\sdkPackageInFileSystem.
3. Создать необходимые каталоги для пакета в хранилище SVN
Чтобы создать каталоги для пакета, используя клиентское приложение для работы с SVN (например, TortoiseSvn), необходимо перейти в репозиторий, указанный в карточке пакета. Затем в репозитории создать каталог, название которого совпадает с названием созданного в приложении пакета.
В созданном каталоге необходимо создать подкаталоги branches и tags, т.е. повторить плоскую структуру пакетов Creatio. В завершение в каталоге branches необходимо создать каталог, название которого совпадает с номером версии пакета — 7.10.0.
4. Создать рабочую копию версионной ветки пакета
Чтобы создать рабочую копию версионной ветки пакета необходимо выполнить выгрузку (checkout) из хранилища каталога, имя которого совпадает с номером версии пакета, в каталог пакета в файловой системе и подтвердить выгрузку в существующий каталог.
В результате каталог пакета в файловой системе Путь к установленному приложению\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\sdkPackageInFileSystem станет связанным с веткой версии 7.10.0 пакета в хранилище.
5. Зафиксировать в хранилище каталог пакета
Чтобы зафиксировать каталог пакета необходимо добавить в хранилище все содержимое Путь к установленному приложению\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\sdkPackageInFileSystem и выполнить фиксацию.
Последовательность установки пакета из хранилища SVN в режиме разработки в файловой системе
- Установить пакет в файловую систему.
- Установить пакет в приложение.
- Выполнить генерацию исходных кодов.
- Скомпилировать изменения.
- Обновить структуру базы данных.
- При необходимости установить SQL-сценарии и привязанные данные.
Ключ AutoUpdateOnCommit отвечает за автоматическое обновление пакетов из SVN перед их заливкой. Если для этого ключа установлено значение false, то перед заливкой в SVN приложение предупредит пользователя о необходимости обновления в случае, если схемы пакета были изменены. Ключи AutoUpdateDBStructure, AutoInstallSqlScript, AutoInstallPackageData отвечают соответственно за автоматическое обновление структуры базы данных, автоматическую установку SQL-сценариев и установку привязанных данных.
После включения режима автоматического применения изменений выполнять шаги 3—6 нет необходимости. Включить этот режим необходимо до установки пакета.
Алгоритм реализации примера
1. Установить пакет в файловую систему
В каталоге приложения ...\Terrasoft.WebApp\Terrasoft.Configuration\Pkg, открытом в Проводнике, необходимо выполнить действие SVN Checkout.
В открывшемся диалоговом окне необходимо указать адрес хранилища, по которому размещено содержимое пакета (1), и каталог для выгрузки содержимого пакета.
После успешной выгрузки в каталоге ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg будет создана рабочая копия пакета.
2. Установить пакет в приложение
Для установки пакета из файловой системы в приложение в разделе Конфигурация (Configuration) необходимо выполнить действие Обновить пакеты из файловой системы (Update packages from file system).
В результате пакет будет добавлен в приложение.
3. Выполнить генерацию исходных кодов
Для этого в разделе Конфигурация (Configuration) необходимо выполнить действие Сгенерировать для требующих генерации (Generate where it is needed).
4. Скомпилировать изменения
Чтобы скомпилировать изменения, необходимо выполнить действие Компилировать измененное (Compile modified items).
5. Обновить структуру базы данных
После компиляции изменений нужно обновить структуру базы данных действием Обновить для требующих обновления (Update where it is needed).
6. Установить SQL-сценарии и привязанные данные (при необходимости)
Если пакет содержит привязанные SQL-сценарии или данные, то необходимо выполнить соответствующие действия для их выполнения или установки.
После успешной установки в приложении станет доступной реализованная в пакете функциональность. В приведенном примере это функциональность детали с редактируемым реестром.
Последовательность привязки существующего пакета к хранилищу
- Перейти в режим разработки в файловой системе.
- Выгрузить пакет в файловую систему.
- Создать необходимые каталоги для пакета в хранилище SVN.
- Создать рабочую копию версионной ветки пакета.
- Зафиксировать в хранилище каталог пакета.
Альтернативный вариант привязки пакета к хранилищу — через прямой запрос в базу данных. Для этого необходимо:
- В разделе Конфигурация добавить в приложение информацию о хранилище SVN.
- Привязать хранилище к пакету. Для этого:
- В таблице SysRepository считать идентификатор записи, содержащей адрес нужного хранилища SVN.
- В таблице SysPackage в запись, содержащую имя не привязанного к хранилищу SVN пакета, в колонку SysRepositoryId добавить полученный идентификатор.
Алгоритм реализации примера
1. Перейти в режим разработки в файловой системе
2. Выгрузить пакет в файловую систему
В разделе Конфигурация (Configuration) выполнить действие Выгрузить пакеты в файловую систему (Download packages to file system).
В результате пакет будет выгружен в каталог ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\UsrUnboundPackage.
3. Создать необходимые каталоги для пакета в хранилище SVN
Чтобы создать каталоги для пакета, используя клиентское приложение для работы с SVN (например, TortoiseSvn), необходимо перейти в репозиторий и создать каталог, название которого совпадает с названием пакета.
В созданном каталоге необходимо создать подкаталоги branches и tags, т.е. повторить плоскую структуру пакетов Creatio. В завершение в каталоге branches необходимо создать каталог, название которого совпадает с номером версии пакета — 7.11.0.
4. Создать рабочую копию версионной ветки пакета
Чтобы создать рабочую копию версионной ветки пакета, необходимо выгрузить из хранилища каталог, имя которого совпадает с номером версии пакета (SVN Checkout), в каталог пакета в файловой системе и подтвердить выгрузку в существующий каталог.
В результате каталог пакета в файловой системе ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\UsrUnboundPackage станет рабочей копией пакета версии 7.11.0 в хранилище.
5. Зафиксировать в хранилище каталог пакета
Чтобы зафиксировать в хранилище все содержимое каталога пакета, необходимо выполнить команду Add... приложения TortoiseSVN, а затем выполнить команду SVN Commit....
В результате все содержимое пакета будет привязано к хранилищу SVN.
Альтернативный вариант реализации примера
1. В разделе Конфигурация добавить в приложение информацию о хранилище SVN
Если информация о нужном хранилище не добавлена в разделе Конфигурация приложения, то необходимо:
- Выполнить команду Открыть список хранилищ (Open list of repositories).
- В открывшемся окне Список хранилищ (List of repositories) при помощи команды Добавить (1) добавить необходимый репозиторий (2). После этого информация о репозитории отобразится в окне Список хранилищ (3). Затем необходимо выделить строку с информацией о хранилище и выполнить аутентификацию (4).
2. Привязать хранилище к пакету
Для этого необходимо выполнить SQL- запрос в базу данных приложения.
Здесь SDKPackages — название хранилища, а UsrUnboundPackage — название пользовательского пакета.
3. Выгрузить пакет в файловую систему
В разделе Конфигурация (Configuration) выполнить действие Выгрузить пакеты в файловую систему (Download packages to file system). В результате привязанный к хранилищу пакет будет выгружен в каталог ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\UsrUnboundPackage.
1. Обновить пакет из хранилища SVN
Для получения последней ревизии пакета необходимо использовать клиентское приложение для работы с SVN (например, TortoiseSvn).
Чтобы обновить пакет из хранилища SVN:
- В каталоге ...\Terrasoft.WebApp\Terrasoft.Configuration\Pkg выберите необходимый пакет. В нашем примере это sdkPackageInFileSystem.
- Обновите пакет (команда SVN Update).
После выполнения команды будут обновлены дата редактирования пакета в файле дескриптора пакета descriptor.json и исходный код схемы типа Исходный код (Source code) UsrGreetingService.
- Перейдите в дизайнер системы по кнопке .
- В блоке Конфигурирование разработчиком (Admin area) перейдите по ссылке Управление конфигурацией (Advanced settings).
- На панели инструментов в группе действий Разработка в файловой системе (File system development mode) выберите Обновить пакеты из файловой системы (Update packages from file system).
- Если были изменены схемы объектов или схемы исходного кода, то для применения изменений также необходимо выполнить шаги 3—6 статьи Установить пакет из SVN в режиме разработки в файловой системе.
2. Изменить содержимое пакета
Чтобы изменить содержимое пакета, добавьте в схему типа Исходный код (Source code) UsrGreetingServiceметод TestHelloWorld().
3. Зафиксировать пакет в хранилище
Чтобы зафиксировать пакет в хранилище:
- В каталоге ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg выберите необходимый пакет. В нашем примере это sdkPackageInFileSystem.
- Выполните фиксацию (команда SVN Commit) каталога в хранилище.
Последовательность создания пакета при переходе в режим разработки в файловой системе
В режиме разработки в файловой системе после выполнения действия Выгрузить пакеты в файловую систему (Download packages to file system) все пользовательские пакеты будут выгружены в каталог ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg. При этом выгруженное в файловую систему содержимое пользовательского пакета не будет привязано к хранилищу SVN даже в том случае, если сам пакет был привязан к хранилищу в разделе Конфигурация.
Если при создании пакета заполнить поле Хранилище системы контроля версий с помощью встроенных средств, то пакет будет привязан к хранилищу SVN. При этом в файловой системе будет создана рабочая копия пакета. Путь к каталогу, в котором создаются рабочие копии пакетов, задается настройкой defPackagesWorkingCopyPath в файле ConnectionStrings.config.
Эту особенность можно использовать для создания пакета, привязанного к SVN и предназначенного для разработки в файловой системе. Если в настройке defPackagesWorkingCopyPath указать путь к каталогу ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg, то после выгрузки пакета в файловую систему он будет автоматически привязан к нужному хранилищу SVN.
Общая последовательность действий:
- В настройке defPackagesWorkingCopyPath указать путь к каталогу ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg.
- В режиме разработки с помощью встроенных средств в разделе Конфигурация создать пакет, привязанный к хранилищу SVN.
- В разделе Конфигурация выполнить фиксацию пакета в хранилище.
- Перейти в режим разработки в файловой системе.
- Выгрузить пакет в файловую систему.
- Добавить новые элементы пакета в хранилище SVN.
Последовательность реализации примера
1. Изменить настройку defPackagesWorkingCopyPath
В файле ConnectionStrings.config в настройке defPackagesWorkingCopyPath необходимо указать полный путь к каталогу ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg.
Это изменение позволит совместить каталог, в котором будут содержаться рабочие копии пользовательских пакетов, с каталогом, в который будут выгружаться пакеты в режиме разработки в файловой системе.
2. Создать пользовательский пакет
В режиме разработки с помощью встроенных средств в разделе Конфигурация необходимо создать пользовательский пакет, привязанный к хранилищу SVN. Для создаваемого пакета указать название, репозиторий и версию.
3. Выполнить фиксацию пакета в хранилище
Чтобы зафиксировать пакет в хранилище, необходимо выполнить действие Зафиксировать пакет в хранилище (Commit package to repository). В появившемся диалоговом окне нужно указать описание изменений (1), а затем нажать кнопку OK. После завершения фиксации появится соответствующее сообщение (3).
В результате пакет будет зафиксирован в SVN, а в каталоге ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg будет создана рабочая копия пакета.
4. Перейти в режим разработки в файловой системе
Чтобы включить режим разработки конфигурации в файловой системе, необходимо в файле Web.config, который находится в корневом каталоге с установленным приложением, установить значение true для атрибута enabled элемента fileDesignMode.
После включения режима разработки в файловой системе в разделе Конфигурация на вкладке Действия появятся две кнопки:
- Выгрузить пакеты в файловую систему (Download packages to file system) — выгружает пакеты из базы данных приложения в каталог ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg.
- Обновить пакеты из файловой системы (Update packages from file system) — загружает пакеты из каталога ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg в базу данных.
5. Выгрузить пакет в файловую систему
Для выгрузки пакета в файловую систему необходимо выполнить действие Выгрузить пакеты в файловую систему. В результате все элементы пакета, измененные и созданные с помощью встроенных средств разработки в разделе Конфигурация, будут выгружены в файловую систему в каталог ..\Terrasoft.WebApp\Terrasoft.Configuration\Pkg.
6. Добавить новые элементы пакета в хранилище SVN
Чтобы в режиме разработки добавить новые элементы пакета в хранилище, необходимо в файловой системе выделить каталог рабочей копии пакета и выполнить команду Add... клиентского приложения для работы с хранилищем SVN, например, TortoiseSVN.
После этого появится диалоговое окно выбора добавляемых элементов. После выбора нужных элементов необходимо нажать на кнопку OK, после чего отобразится информационное окно о завершении команды добавления новых элементов.
Добавленные элементы будут отмечены, как связанные с хранилищем SVN, но не зафиксированные в нем.
Для фиксации всех измененных и новых элементов пакета в хранилище необходимо выполнить команду SVN Commit....