1

背景

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

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

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

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

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

我错了。空无一物。

问题

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

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

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

4

3 回答 3

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'
    ]
  }
}
于 2018-12-18T14:41:47.760 回答
1

我找到了两种方法:

  1. 将 Hex 包JUnit 格式化程序与 junit post 管道步骤一起使用
  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,但我不知道第一个解决方案是否具有相同的潜力。至少我没看到。

希望这篇文章有帮助!

原帖:

于 2018-12-19T13:25:00.887 回答
0

另一种从 Jenkins 发布 Elixir 项目报道的方法是使用 ExCoveralls 选项组合coveralls.post 。这允许您发布来自任何主机的覆盖范围,包括您的 Jenkins 服务器。根据这个 Jenkins 教程页面上的例子,你可以像这样在 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
              '''
          }
      }
   }
}
于 2021-02-08T03:49:06.640 回答