Компилировать и запускать разные jdk в рамках одной работы jenkins - PullRequest
2 голосов
/ 03 марта 2020

Я хотел бы получить задание jenkins, которое сначала компилирует тесты с java 8, а затем запускает их с java 11. Gradle используется в проекте, который имеет много подпроектов. Это вообще возможно?
Я пробовал с подходом (который был на самом деле лучшим из всех, что я придумал)

tasks.withType(AbstractCompile) {
    options.with {
        fork = true
        forkOptions.javaHome = [java-8-home]
    }
}

, помещенным в main build.gradle, но я не уверен, повлияет ли это на все типы компиляции задачи в подпроектах / задачи в других каталогах. Затем я вызвал задание gradle с -Dorg.gradle.java.home=[java-11-home]

Дайте мне знать, что вы думаете, спасибо!

1 Ответ

1 голос
/ 05 марта 2020

То, что вы пытаетесь достичь, вполне возможно. Давайте шаг за шагом проверим, как это можно сделать . Прежде всего, мы даем указание Gradle компилировать все Java исходники с Java 8 совместимостью с исходным и целевым объектами и выполнять компиляцию с помощью Java 8 исполняемого файла, взятого из переменной среды JAVA8_HOME:

plugins {
    id 'java'
}

java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

tasks.withType(JavaCompile) {
    options.with {
        fork = true
        forkOptions.javaHome = System.env.'JAVA8_HOME' as File
    }
}

Запуск сборки с переключателем --info показывает, что исполняемый файл Java 8 действительно взят из переменной среды JAVA8_HOME и применяется ко всем Java задачам компиляции.

> Task :compileJava
Compiling with Java command line compiler 'C:\dev\java\jdk-8\bin\javac.exe'.

> Task :compileTestJava
Compiling with Java command line compiler 'C:\dev\java\jdk-8\bin\javac.exe'.

Выполнение тестов с Java 11, взятый из переменной среды JAVA11_HOME, работает аналогичным образом.

test {
   executable = "${System.env.'JAVA11_HOME'}/bin/java"
}

Это снова приводит к следующему выводу:

> Task :test
Command: C:\dev\java\jdk-11/bin/java -Dorg.gradle.native=false ...

Подпроекты

Применение этого Конфигурация для всех подпроектов в многомодульном проекте проста. Ниже показан root проект build.gradle, который применяет все правила только к тем подпроектам, к которым применен плагин Java.

plugins {
    id 'base'
}

allprojects {
    plugins.withId('java') {
        repositories {
            mavenCentral()
        }

        java {
            sourceCompatibility = JavaVersion.VERSION_1_8
            targetCompatibility = JavaVersion.VERSION_1_8
        }

        tasks.withType(JavaCompile) {
            options.with {
                fork = true
                forkOptions.javaHome = System.env.'JAVA8_HOME' as File
            }
        }

        test {
            useJUnitPlatform()

            executable = "${System.env.'JAVA11_HOME'}/bin/java"
        }

        dependencies {
            testImplementation("org.junit.jupiter:junit-jupiter-api:5.6.0")
            testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.6.0")
        }
    }
}

Поскольку теперь вы зависите от настройки переменных среды, он имеет смысл проверить их перед началом сборки. Это можно сделать, проверив график задач, когда он будет готов:

gradle.taskGraph.whenReady { taskGraph ->
    if (taskGraph.getAllTasks().find { it instanceof JavaCompile } != null
            && (System.env.'JAVA8_HOME' == null || System.env.'JAVA11_HOME' == null)) {
        throw new GradleException("Please export 'JAVA8_HOME' and 'JAVA11_HOME'")
    }
}

Jenkins

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

pipeline {
    tools {
        jdk 'jdk-8'
        jdk 'jdk-11'
    }

    environment {
        JAVA8_HOME = "${tool 'jdk-8'}"
        JAVA11_HOME = "${tool 'jdk-11'}"
    }

    stages {
        stage('Build') {
            steps {
                checkout scm

                sh "./gradlew --no-daemon --info --stacktrace clean build"
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...