Следите за последней папкой на предмет изменений в TeamCity
Я работаю над настройкой CI для своего веб-сайта с помощью TeamCity 8. Для веб-сайта это просто, поскольку я просто копирую всю папку.
Но для наших обновлений SQL мы настроили его так, чтобы с каждым выпуском у нас была отдельная папка. Например:
db
update
001
002
003
...
018
Поэтому я пытаюсь выяснить, как настроить шаг настройки контроля версий, чтобы отслеживать только последнюю папку на наличие изменений. В худшем случае я могу просто отслеживать все дерево обновлений на предмет изменений, поскольку теоретически мы должны вносить изменения только в последнюю папку.
Но понять, как указывать на последнюю папку, будет чище, потому что: а) это предотвратит случайное изменение сборки в предыдущих папках, и б) позволит использовать один локальный путь для выполнения сценариев каждый раз (без необходимости еще один кусок логики, чтобы выяснить, какой путь для запуска).
Это может быть невозможно, хотя, так что обращаясь к сообществу. Если это имеет значение, наша VCS - это Git/Github.
2 ответа
Вы могли бы сделать структуру как:
db
update
001
002
003
004
...
current
Тогда внутри текущей папки выглядит так:
004-Script-1.sql
004-Script-2.sql
004-Script-3.sql
Ваша сборка TC будет запускать любой скрипт в current
папку, а затем переместите сценарий на основе первой части имени в соответствующую папку. Вы должны были бы по порядку:
- Создайте папку, если она не существует.
- Переместите файлы в правильные папки
- Сделайте git pull, зафиксируйте все измененные файлы и нажмите
Это предполагает, что вы не будете повторно запускать сценарии несколько раз в этой среде, и что коммиттеры только фиксируют и помещают файлы в текущую папку, которые должны быть запущены в соответствии с правильным синтаксисом имени. В противном случае вы можете получить произвольные имена папок.
В качестве альтернативы вы можете использовать bash, чтобы найти самое высокое имя папки в этой папке и просто запустить все внутри нее (ниже предполагается, что вы находитесь в каталоге загрузки):
$ ls
001 002 003 004 005 026 124 204
$ LAST=`exec ls | sed 's/\([0-9]\+\).*/\1/g' | sort -n | tail -1`
$ echo $LAST
204
Это предполагает, что все в самой верхней папке должно быть запущено и перезапущено, если вы не работали с логикой.
Вы можете определить параметр сборки по имени, которое может выглядеть следующим образом: cur.release.folder.numbeer и попросить его запросить, пытается ли пользователь принудительно запустить сборку в определенной папке.
Trigger rules: +:/db/update/%cur.release.folder.number%/**
ИЛИ ЖЕ
Всякий раз, когда вы вручную создаете папку, добавьте логику в свой проект, чтобы установить свойство с именем cur.release.folder.number & на этапах сборки teamcity, обработайте его с дополнительным шагом.
Шаг сборки № 1 будет рассчитывать последний номер папки может быть с помощью простого сценария оболочки. Ты можешь использовать -Dparamname=%teamcity.build.checkoutDir%/tmpFileHoldingFolderNoInfo.txt
Шаг сборки 2: используйте то же самое в правилах триггера, что и выше - по умолчанию установлено пустое значение и используйте значение из шага №1