【问题标题】:Coveralls plugin for jenkins CI?詹金斯 CI 的工作服插件?
【发布时间】:2018-12-18 13:53:24
【问题描述】:

背景

经过大量努力,我们终于得到了一个 Jenkins CI,它从 GitHub 存储库中提取代码,现在正在进行持续集成和部署。

我们得到代码,只有在所有测试都通过时才像往常一样部署它。

现在我检查了一些 Java 插件,除了运行测试之外,还进行 测试覆盖率,例如 Cobertura

但我们不使用 Java。我们使用 Elixir。

在 Elixir 世界中,我们有 excoveralls,它是工作服 API 的外观。工作服 API supports jenkins 所以我可以找到适用于 Jenkins 的工作服插件。

我错了。什么都没有。

问题

所以现在我有了一个基本上没用的测试覆盖率指标,因为我无法将它与 Jenkins 集成。

是否有任何 Erlang/Elixir 插件可以与 Jenkins 一起用于代码覆盖?

我还在项目中创建了一个Issue(似乎被放弃了...)https://github.com/parroty/excoveralls/issues/167

【问题讨论】:

    标签: jenkins continuous-integration erlang elixir coveralls


    【解决方案1】:

    我有一个阶段可以在我的 Jenkinsfile 上发布报道。我不确定这是否是您想要的指标,但是...

    stage('Publish Coverage') {
      when{
        branch 'master'
      }
    
      steps {
        publishHTML target: [
          allowMissing: true,
          alwaysLinkToLastBuild: true,
          keepAll: true,
          reportDir: 'cover',
          reportFiles: 'excoveralls.html',
          reportName: 'Coverage Report'
        ]
      }
    }
    

    【讨论】:

    • 恐怕这不是我想要的。我想要的是能够查看 Jenkins 中给定分支的覆盖率报告,例如 Cobertura 或 Jacoco:wiki.jenkins.io/display/JENKINS/JaCoCo+Plugin。您可以查看此插件如何通过新功能增强 Jenkins。这就是我想要的。
    • 感谢您澄清这一点。我来看看这些插件是如何工作的。
    【解决方案2】:

    我找到了两种方法:

    1. 使用十六进制包JUnit formatter 和junit post pipeline step
    2. covertool 与 Cobertura Jenkins pluing 一起使用

    选项 1

    此解决方案有效且非常好。它迫使我更改test_helper.exs,但总体而言这是一个小小的不便。这很好,但它只提供最基本的报告,对我来说这是失败的地方。

    选项 2

    我决定选择的选项。是的,让Jenkinsfile 为 Cobertura 工作是一场噩梦,特别是因为在以前的版本中这甚至是不可能的,而且到处都是相互矛盾的信息。

    但是,一旦你得到 Jenkinsfile 的消息,你就可以从 Cobertura 撕掉那些甜蜜的报告。 Cobertura 是在考虑 Java 的情况下制作的,没有两种方法。在报告中,您会看到诸如类覆盖率之类的内容,但您可以轻松地翻译这些模块。该界面提供了更多信息并随着时间的推移跟踪覆盖范围,这是我真正想要的。

    为了将来的通知,这里是我的Jenkinsfile

    pipeline {
      agent any
    
      environment { 
        SOME_VAR = "/home/deployer"
      }
    
      stages {
        stage("Build") {
          steps {
            sh "MIX_ENV=test mix do deps.get, deps.compile"
          }
        }
    
        stage("Test") {
          steps {
            sh "mix test --cover"
          }
        }
    
        stage("Credo"){
          steps{
            sh "mix credo --strict"
          }
        }
    
        stage("Deploy"){
          when{
            expression{
              env.BRANCH_NAME == "master"
            }
          }
          steps{
            sh '''
             echo "Deploy with AWS or GCP or whatever"                                                         
            '''
          }
        }
    
      }
    
      post{
        always{
          cobertura coberturaReportFile: "coverage.xml"
        }
      }
    }
    

    注意: 1. 我的代码非常纳粹,所以我也使用 Credo。您可以进一步将其配置为破坏整个管道,因为您错过了文件末尾的新行,但正如我所说,我的代码非常纳粹。 2. Deploy 阶段仅在推送的分支为 Master 时运行。还有其他方法可以做到这一点,但我发现对于一个小项目来说,这种方式就足够了。

    总的来说,我现在喜欢covertools,但我不知道第一个解决方案是否具有相同的潜力。至少我没看到。

    希望这篇文章对您有所帮助!

    原帖:

    【讨论】:

      【解决方案3】:

      另一种从 Jenkins 发布 Elixir 项目报道的方法是使用 ExCoveralls 选项 mix coveralls.post。这允许您发布来自任何主机的覆盖范围,包括您的 Jenkins 服务器。根据this Jenkins tutorial page上的例子,你可以在Jenkinsfile中这样写:

      pipeline {
        agent any
        stages {
            // Assuming all environment variables are set beforehand
            stage('run unit test') {
                steps {
                    sh 'echo "Run Unit Test and Post coverage"'
                    sh '''
                      MIX_ENV=test mix coveralls.post --token $COVERALLS_REPO_TOKEN --sha $GIT_COMMIT --branch $GIT_BRANCH --name "jenkins" --message $GIT_COMMIT_MSG
                    '''
                }
            }
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多