Kotlin 在Azure DevOps for Android中运行JaCoCo:找不到方法JacoTestReport()

Kotlin 在Azure DevOps for Android中运行JaCoCo:找不到方法JacoTestReport(),kotlin,azure-devops,jacoco,azure-pipelines-build-task,Kotlin,Azure Devops,Jacoco,Azure Pipelines Build Task,我们已经在Android Kotlin项目中实现了Jacoco,我们可以通过/gradlew clean build JacoTestReport 但是,当我们部署到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.5801607

我们已经在Android Kotlin项目中实现了Jacoco,我们可以通过/gradlew clean build JacoTestReport

但是,当我们部署到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)
2019-02-04T09:37:35.5760285Z 12秒内构建成功
2019-02-04T09:37:35.5760428Z 1可执行任务:1已执行
2019-02-04T09:37:35.5801607Z系统VSS连接是否存在
2019-02-04T09:37:35.5816653Z[命令]C:\Windows\system32\cmd.exe/D/S/C“C:\vstsagent\A1\\u work\2\S\ApolloClient\gradlew.bat clean build JacoRootReport”
2019-02-04T09:37:36.7652264Z
2019-02-04T09:37:36.76533Z失败:生成失败,出现异常。
2019-02-04T09:37:36.7653767Z
2019-02-04T09:37:36.7653947Z*其中:
2019-02-04T09:37:36.7654401Z生成文件'C:\vstsagent\A1\\u work\2\s\ApolloClient\Build.gradle'行:44
2019-02-04T09:37:36.7654582Z
2019-02-04T09:37:36.7654768Z*出了什么问题:
2019-02-04T09:37:36.7654952Z评估根项目“Apollo客户端”时出现问题。
2019-02-04T09:37:36.7655191Z>找不到参数[build\u abtyecjstjhjqmdmcxnlw2kq0$\u run\u closure4]的方法jacotestreport()$_closure8@50246031]在项目上:org.gradle.api.project类型的“应用程序”。
2019-02-04T09:37:36.7655365Z
2019-02-04T09:37:36.7655547Z*试试看:
2019-02-04T09:37:36.7655747Z使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。使用--scan运行以获得完整的洞察力。
2019-02-04T09:37:36.7655931Z
2019-02-04T09:37:36.7656098Z*获取更多帮助https://help.gradle.org
2019-02-04T09:37:36.7656242Z
2019-02-04T09:37:36.7656585Z生成在1s内失败
2019-02-04T09:37:37.1999815Z错误:C:\vstsagent\A1\\ u work\2\s\ApolloClient\gradlew.bat失败,返回代码:1
2019-02-04T09:37:37.1999996Z在ChildProcess。(C:\vstsagent\A1\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
2019-02-04T09:37:37.2000102Z第二站(events.js:106:13)
2019-02-04T09:37:37.2000154Z位于ChildProcess.emit(events.js:191:7)
2019-02-04T09:37:37.2000226Z(内部/子流程js:886:16)
2019-02-04T09:37:37.2000286Z在进程中。子进程。_handle.onexit(内部/子进程js:226:5)

我不明白的是,它是在寻找一个名为JacoRootReport还是JacoTestReport的任务?

我无法获得创建报告的实际gradle过程,所以我找到了解决办法

  • 将gradle任务设置为“build jacocoRootReport”
  • 使用“发布代码覆盖率结果”任务(设置为使用Jacoco)

    • 我也掉进了这个洞里,Burf2000的回答让我找到了一些出路。希望这能让其他人在接下来的过程中受益。我的项目是纯Java,而不是像原始问题那样的Kotlin,但我认为这一切都是适用的

      在Azure devops for android中运行Jacoco: 杰科科钻头 这假设您一开始没有工作的Jacoco任务。如果这样做,请跳到Azure Devops位

    • 在顶级
      build.gradle
      文件中添加Jacoco依赖项:
    • jacoco.gradle
      文件添加到应用程序根目录中。我的看起来像这样:
    • 这是相当严重的抄袭。他们也会对不同的产品口味进行测试,我已经把它去掉了。除此之外,上述博客与链接博客的主要区别在于
      classDirectories
      filepath

    • 在应用程序构建脚本中应用
      jacoco.gradle
      Apply from:'../jacoco.gradle'

    • testCoverageEnabled true
      添加到要运行覆盖率度量的所有
      buildType

    • 如果您运行
      /gradlew tasks
      ,您现在应该会看到报告标题下有一些代码覆盖率任务。运行它们,并确保它们按照您的预期工作,因为反馈循环在下一位会慢很多

      蔚蓝的德沃斯比特 Burf2000没有说明他是如何得到
      无法找到方法jacoTestReport()…
      错误的,但我是通过在我的
      azure pipelines.yml的gradle任务中将
      codeCoverageToolOption:
      设置为
      “jaCoCo”
      得到的。别这样,这是个陷阱。告诉您,如果您的构建已经启用了代码覆盖率,则不应该使用它

      相反,您希望将Azure Devops Gradle任务配置为调用先前创建的一个Jacoco任务,然后将PublishCodeCoverageResults任务指向生成的XML。my
      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
      

      我也有同样的问题,我也是。遗憾的是,一年多过去了,没有人能解决这个问题。
      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
                  }
              }
      }
      
        - 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