JenkinsActiveChoice: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 27: Строка 27:
 
[[File:Screenshot_2022-07-12_at_11.54.06.png|400px]]
 
[[File:Screenshot_2022-07-12_at_11.54.06.png|400px]]
   
  +
== Как решается задача==
==111==
 
  +
Собственно задача сводится к тому что бы определить изменение какого параметра вызвало запуск скрипта
  +
<BR>
  +
Так как значение того параметра что вызвало запуск скрипта передается в скрипт (имя переменной совпадает с именем параметра и в примере это будет app1 или app2 или ... appN)
  +
<BR>
  +
то этим можно воспользоваться - создать список сервисов с информацией о них и их именами
  +
<PRE>
  +
List reposAndKeys = [
  +
[
  +
"name": "app1",
  +
"repo": "git@github.com:app2.git",
  +
"repoKeyId": "key1",
  +
],
  +
[
  +
"name": "app2",
  +
"repo": "git@github.com:app2.git",
  +
"repoKeyId": "key2",
  +
],
  +
...
  +
</PRE>
  +
Составить список какие имена могут быть доступны?
  +
<PRE>
  +
List applications = []
  +
reposAndKeys.each { repoAndKey ->
  +
applications.add(repoAndKey["name"])
  +
}
  +
</PRE>
  +
Проверить существование переменной (и ее значение) можно вот таким способом: если скрипт вызван изменением значения параметра app1 то переменная app1 будет доступна внутри кода а переменная app2 нет (это верно для любого appN)
  +
<PRE>
  +
applications.each { it ->
  +
try {
  +
// если it указывает на несуществующее значение то тут будет исключение
  +
println("${it} = ${this[ it ]}")
  +
  +
// Если чекбокс не выбран - то в значении переменной (имя переменной это имя параметра) будет пустая строка
  +
// тут нужно добаить другие проверки если планируется использовать другиме типы параметов
  +
if ("${this[ it ]}" == "") {
  +
isDisabled = true
  +
}
  +
triggeredByParameterNames.add("${it}")
  +
} catch(Exception Ex) {
  +
println("${it}")
  +
println(Ex)
  +
}
  +
}
  +
</PRE>
  +
Некоторые дополнительные вещи вроде обработки ситуаций когда не выбран не один appN но скрипт запущен или ошибочно сконфигурировано более чем 1 appN как параметр вызывающей пересчет сиска бранчей
  +
 
= Пример кода =
 
= Пример кода =
 
{{#spoiler:show=show version|
 
{{#spoiler:show=show version|

Версия 12:36, 12 июля 2022


Jenkins Active Choice

Есть плагин который позволяет динамически формировать значения параметров, например динамически подтягивать список веток в git (НО нельзя динамически создать параметры, и у меня не вышло сделать скрытыми параметры в зависимости от того что выбрано в другом параметре)

В чем сложность ?

В целом решается задача достаточно несложно - особенно когда есть одно приложение и один репозиторий, но ситуация другая когда приложений и репозиториев (а соответственно и ключей к ним) становится много
Это тоже не кажется сложным, просто использовать для каждого приложения свой скрипт где будет "зашит" свой адрес и ключ.
НО в этом случае получаем множество скриптов которые нужно будет синхронно обновлять и правильно вызывать
Хочется использовать ОДИН скрипт который единственный модифицировать при добавлении приложения.



Постановка задачи

  • Деплоймент приложения состоящего из множества сервисов: app1, app2, app3 ... appN. Число сервисов может увеличиваться.
  • Сервисы могут деплоится в любых сочетаниях - один, два, все сразу, первый и третий, только номер N ...
  • Для сервиса который выбран для деплоймента предоставлять выбор бранчи, для сервиса который не выбран - не предоставлять


Пример интерфейса

  • Слева - выбран один сервис и бранча для него, второй сервис не выбран и соответвенно выбор бранчи для него недоступен.
  • Справа - выбрано два сервиса и бранчи для обоих сервисов

Screenshot 2022-07-12 at 11.53.46.png Screenshot 2022-07-12 at 11.54.06.png

Как решается задача

Собственно задача сводится к тому что бы определить изменение какого параметра вызвало запуск скрипта
Так как значение того параметра что вызвало запуск скрипта передается в скрипт (имя переменной совпадает с именем параметра и в примере это будет app1 или app2 или ... appN)
то этим можно воспользоваться - создать список сервисов с информацией о них и их именами

List reposAndKeys = [
        [
                "name": "app1",
                "repo": "git@github.com:app2.git",
                "repoKeyId": "key1",
        ],
        [
                "name": "app2",
                "repo": "git@github.com:app2.git",
                "repoKeyId": "key2",
        ],
...

Составить список какие имена могут быть доступны?

List applications = []
reposAndKeys.each { repoAndKey -> 
  applications.add(repoAndKey["name"])
}

Проверить существование переменной (и ее значение) можно вот таким способом: если скрипт вызван изменением значения параметра app1 то переменная app1 будет доступна внутри кода а переменная app2 нет (это верно для любого appN)

applications.each { it ->
    try {
        // если it  указывает на несуществующее значение то тут будет исключение
        println("${it} = ${this[ it ]}")

        // Если чекбокс не выбран - то в значении переменной (имя переменной это имя параметра) будет пустая строка
        // тут нужно добаить другие проверки если планируется использовать другиме типы параметов
        if ("${this[ it ]}" == "") {
            isDisabled = true
        }
        triggeredByParameterNames.add("${it}")
    } catch(Exception Ex) {
        println("${it}")
        println(Ex)
    }
}

Некоторые дополнительные вещи вроде обработки ситуаций когда не выбран не один appN но скрипт запущен или ошибочно сконфигурировано более чем 1 appN как параметр вызывающей пересчет сиска бранчей

Пример кода