Jenkins and gradle - создайте проекты с последними версиями зависимостей для CI, специальными версиями для производства - PullRequest
0 голосов
/ 05 февраля 2019

Я работаю с Jenkins, Gradle и нашим репозиторием Ivy.

Наши сценарии сборки указывают точную версию зависимостей, которые будут использоваться для сборки.Это хорошая практика для производства.

Для CI было бы интересно, если бы в сборке проекта использовались последние версии наших собственных библиотек, чтобы мы могли не только увидеть, не изменились ли изменения библиотеки для сборки библиотеки.но также, если они сломали проекты, которые их используют.Кажется, это и есть точка «интеграции»!

Я понимаю, что gradle будет брать "1.+" вместо "1.2.3", поэтому я могу взломать build.gradle для проекта на сервере CI, чтобы добиться этого.Но, возможно, есть более удобный способ сделать это (сценарий сборки распознает, что он находится в режиме CI и использует последние, а не конкретные версии, возможно, запустив сценарий sed на build.gradle, чтобы изменить его).

Могу ли япропустить что-то в Дженкинс или Gradle?Существуют ли какие-либо подключаемые модули для достижения этой цели или альтернативные подходы, которые вы использовали для достижения этой цели?

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Это мой собственный ответ, вдохновленный ответом @Martin Zeitler.

У нас есть универсальный скрипт сборки, который применяется ко всему проекту build.gradle с настройкой общих параметров, настроек и задач.Мы хотим добавить эту логику, но сделать ее необязательной и не нарушать существующие сценарии сборки.

Логика будет активироваться и управляться свойством project.ext.buildJenkinsWithLatest, равным true или false. * 1009.*

При активной логике будут использоваться зависимости от файлов проекта dependencies-production.gradle или dependencies-jenkins.gradle.Зависимости Jenkins будут использоваться только в том случае, если свойство имеет значение true и среда CI обнаруживается с помощью переменной среды BUILD_NUMBER.

Общий сценарий сборки содержит следующее:

if (project.ext.has('buildJenkinsWithLatest')) {
    println "Using conditional dependency management..."
    //BUILD_NUMBER is not null if this is a Jenkins build
    if(project.ext.buildJenkinsWithLatest == true && System.getenv("BUILD_NUMBER") != null) {
        println "--- Using alternative dependencies..."
        apply from: "dependencies-jenkins.gradle"
    }
    else {
        println "--- Using production dependencies..."
        apply from: "dependencies-production.gradle"
    }
}
else {
    println "Conditional dependency management is not active"
}

Теперь любой проект build.gradle, который уже применяет этот скрипт, будет печатать его при запуске:

Conditional dependency management is not active

Чтобы использовать эту функцию, нам нужно будет сделать следующее для нашего проекта:

  1. Создайте dependencies-jenkins.gradle, который содержит предложение dependencies {} для библиотек, которые мы хотим динамически выбирать версию.
  2. Создайте dependencies-production.gradle, который содержит предложение dependencies {} для техбиблиотеки, но с заданной версией.
  3. Удалите библиотеки из всех dependencies {}, которые остаются в проекте build.gradle.
  4. Установите для свойства project.ext.buildJenkinsWithLatest значение true или false.
  5. Применение универсального сценария сборки (после задания свойства!).

Например, в dependencies-jenkins.gradle используйте последнюю версию 2.xx:

dependencies {
    compile 'example:my-library:2+'
}

Как указать версии в динамикеmic way see the answer CantSleepNow.

А в dependencies-production.gradle используйте конкретную версию:

dependencies {
    compile 'example:my-library:2.3.4'
}

Затем в build.gradle установите свойство и примените универсальный сценарий сборки:

...

project.ext.buildJenkinsWithLatest = true;
apply from: '../bxgradle/bx-std.gradle'

...

Теперь, когда сборка выполняется на Jenkins, будут использоваться альтернативные зависимости.Если вы хотите построить его на Jenkins с производственными зависимостями, тогда установите project.ext.buildJenkinsWithLatest в false.

0 голосов
/ 05 февраля 2019

что-то похожее, это может сработать с Дженкинсом:

if(System.getenv("BUILD_EXPERIMENTAL") == null) {

    // known to be stable versions       
    apply from: "dependencies.gradle"

} else {

    // bleeding edge versions 
    apply from: "experimental.gradle"

}

для этого просто потребуется настроить один и тот же проект дважды, один раз с переменной среды и один раз BUILD_EXPERIMENTAL, которая используется для управления *Блок 1005 * применяется.

, если вы хотите, чтобы он вообще применялся, когда проект строится с помощью Jenkins, просто замените BUILD_EXPERIMENTAL на BUILD_NUMBER (который по умолчанию настраивается в этомокружающая среда).

0 голосов
/ 06 февраля 2019

Я бы рекомендовал использовать Gradle блокировку зависимостей для достижения этой цели.

  • В сборке вы будете использовать динамические версии для ваших зависимостей, заблокированных дляхорошее известное состояние.
  • Разработчики и производственная сборка получат разрешение этих заблокированных версий.
  • В CI вы можете иметь (набор) выделенных заданий, которые будут выполняться, и обновляет состояние блокировки для одного или нескольких модулей одновременно.Основываясь на этой обратной связи, вы можете даже зафиксировать это обновление зависимости или, по крайней мере, открыть для него запрос на извлечение.
0 голосов
/ 05 февраля 2019

Если вы хотите иметь самую последнюю версию, вы можете просто использовать latest, или если вам проще что-то вроде [1.0,), которое будет соответствовать всем версиям, большим или равным 1.0 (при условии, что 1.0 - ваша «самая маленькая версия за всю историю») здесь для других соответствующих шаблонов, которые вы также можете комбинировать с состояниями .

Другим способом было бы иметь локальное репозиторий ivy для файловой системы только на подчиненном устройстве jenkins, в котором были бы все последние версии ваших библиотек. Дело в том, что это репо недоступно с рабочих станций разработчиков / ноутбуков / виртуальных машин.,И затем вы просто просто используете это в настройках gradle (например, переменную окружения, определенную только для подчиненного jenkins).Это означает, что вам не нужно менять build.gradle

...