Запуск JaCoCo в DevOps Azure для Android: не удалось найти метод jacocoTestReport()

Мы внедрили Jacoco в наш проект Android Kotlin, который мы можем вызвать локально через ./gradlew clean build jacocoTestReport

Однако при развертывании в VSTS/Azure DevOps возникает ошибка с:

2019-02-04T09:37:35.5760285Z BUILD SUCCESSFUL in 12s
2019-02-04T09:37:35.5760428Z 1 actionable task: 1 executed
2019-02-04T09:37:35.5801607Z SYSTEMVSSCONNECTION exists true
2019-02-04T09:37:35.5816653Z [command]C:\Windows\system32\cmd.exe /D /S /C "C:\vstsagent\A1\_work\2\s\ApolloClient\gradlew.bat clean build jacocoRootReport"
2019-02-04T09:37:36.7652264Z 
2019-02-04T09:37:36.7653533Z FAILURE: Build failed with an exception.
2019-02-04T09:37:36.7653767Z 
2019-02-04T09:37:36.7653947Z * Where:
2019-02-04T09:37:36.7654401Z Build file 'C:\vstsagent\A1\_work\2\s\ApolloClient\build.gradle' line: 44
2019-02-04T09:37:36.7654582Z 
2019-02-04T09:37:36.7654768Z * What went wrong:
2019-02-04T09:37:36.7654952Z A problem occurred evaluating root project 'ApolloClient'.
2019-02-04T09:37:36.7655191Z > Could not find method jacocoTestReport() for arguments [build_abtyecjstjhjqmdmcxnlw2kq0$_run_closure4$_closure8@50246031] on project ':app' of type org.gradle.api.Project.
2019-02-04T09:37:36.7655365Z 
2019-02-04T09:37:36.7655547Z * Try:
2019-02-04T09:37:36.7655747Z Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
2019-02-04T09:37:36.7655931Z 
2019-02-04T09:37:36.7656098Z * Get more help at https://help.gradle.org
2019-02-04T09:37:36.7656242Z 
2019-02-04T09:37:36.7656585Z BUILD FAILED in 1s
2019-02-04T09:37:37.1999815Z Error: C:\vstsagent\A1\_work\2\s\ApolloClient\gradlew.bat failed with return code: 1
2019-02-04T09:37:37.1999996Z     at ChildProcess.<anonymous> (C:\vstsagent\A1\_work\_tasks\Gradle_8d8eebd8-2b94-4c97-85af-839254cc6da4\2.143.2\node_modules\vsts-task-lib\toolrunner.js:639:25)
2019-02-04T09:37:37.2000102Z     at emitTwo (events.js:106:13)
2019-02-04T09:37:37.2000154Z     at ChildProcess.emit (events.js:191:7)
2019-02-04T09:37:37.2000226Z     at maybeClose (internal/child_process.js:886:16)
2019-02-04T09:37:37.2000286Z     at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)

Что я не понимаю, так это поиск задачи под названием jacocoRootReport или jacocoTestReport?

0 ответов

Я тоже попал в эту яму, и ответ Burf2000 помог мне немного выбраться. Надеюсь, это поможет остальным людям. Мой проект был простой Java, а не Kotlin, как исходный вопрос, но я думаю, что все это будет применимо.

Запуск Jacoco в Azure DevOps для Android:

Бит Жакоко

Это предполагает, что у вас для начала нет рабочего задания Джакоко. Если вы это сделаете, перейдите к разделу "Azure Devops".

  1. Добавьте зависимость Jacoco на свой верхний уровень build.gradle файл:
 dependencies {
        ...
        classpath 'org.jacoco:org.jacoco.core:0.8.5'
    }
  1. Добавить jacoco.gradleв корень вашего приложения. Мой выглядит так:
apply plugin: 'jacoco'

jacoco {
    toolVersion = "0.8.5"
}

def buildTypes = android.buildTypes.collect { type -> type.name }

buildTypes.each {
    buildTypeName ->
        def sourceName, sourcePath
        sourceName = sourcePath = "${buildTypeName}"
        def testTaskName = "test${sourceName.capitalize()}UnitTest"

        task "${testTaskName}Coverage" (type:JacocoReport, dependsOn: "$testTaskName") {
            group = "Reporting"
            description = "Generate Jacoco coverage reports on the ${sourceName.capitalize()} build."
            logger.info(description)
            classDirectories = fileTree(
                    dir: "${project.buildDir}/intermediates/javac/${sourcePath}/classes",
                    excludes: ['**/R.class', '**/R$*.class', '**/*$ViewInjector*.*', '**/BuildConfig.*', '**/Manifest*.*'] )
            def coverageSourceDirs = [
                    "src/main/java",
                    "src/$buildTypeName/java"
            ]
            additionalSourceDirs = files(coverageSourceDirs)
            sourceDirectories = files(coverageSourceDirs)
            executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")
            reports {
                xml.enabled = true
                html.enabled = true
            }
        }
}

Это довольно сильно скопировано из этого сообщения в блоге. Они также проводят тестовые прогоны для разных вкусов продуктов, которые я исключил. Помимо этого, основное различие между приведенным выше блогом и связанным блогом заключается в том, чтоclassDirectories Путь к файлу.

  1. Применять jacoco.gradle в скрипте сборки вашего приложения apply from: '../jacoco.gradle'

  2. добавлять testCoverageEnabled true все buildTypes что вы хотите использовать метрики покрытия.

Если ты бежишь ./gradlew tasksТеперь вы должны увидеть, что у вас есть задачи по покрытию кода под заголовком отчетов. Запустите их и убедитесь, что они работают так, как вы ожидаете, поскольку на следующем этапе цикл обратной связи становится намного медленнее.

Бит Azure Devops

Burf2000 не говорит, как он получил Could not find method jacocoTestReport() ... ошибка, но я получил ее, установив codeCoverageToolOption: к "jaCoCo" в моей задаче Gradle в моем azure-pipelines.yml. Не делай этого, это ловушка. В документации github для задачи gradle сказано, что вы не должны использовать ее, если в вашей сборке уже включено покрытие кода.

Вместо этого вы хотите настроить задачу Azure Devops Gradle для вызова одной из задач Jacoco, созданных ранее, а затем указывать задачу PublishCodeCoverageResults на сгенерированный XML. Соответствующие части моегоazure-pipelines.yml файл выглядит так:

  - task: Gradle@2
    inputs:
      workingDirectory: ""
      ...
      tasks: "assemble test testReleaseUnitTestCoverage"

  - task: PublishCodeCoverageResults@1
    inputs:
      codeCoverageTool: "JaCoCo"
      summaryFileLocation: $(System.DefaultWorkingDirectory)/app/build/**/testReleaseUnitTestCoverage.xml
      pathToSources: $(System.DefaultWorkingDirectory)/app/src/main/java
      failIfCoverageEmpty: true

Я не мог получить фактический процесс gradle для создания отчетов, поэтому я нашел обходной путь

  • Установите задачу gradle на "сборку jacocoRootReport"
  • Используйте задачу "Опубликовать результаты покрытия кода" (настроен для использования Jacoco)
Другие вопросы по тегам