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... ].