Запуск 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".
- Добавьте зависимость Jacoco на свой верхний уровень
build.gradle
файл:
dependencies {
...
classpath 'org.jacoco:org.jacoco.core:0.8.5'
}
- Добавить
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
Путь к файлу.
Применять
jacoco.gradle
в скрипте сборки вашего приложенияapply from: '../jacoco.gradle'
добавлять
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)