yjjnls/Notes

View on GitHub
devops/coverity.md

Summary

Maintainability
Test Coverage
# Coverity
Coverity是一款在线的代码静态分析工具,可用于分析代码中的缺陷,适用于C++、JAVA、JS等各种语言。Coverity可以与Github相连,从而导入Github中的项目进行分析。在Coverity的检测过程中,需要我们先用Coverity提供的工具来运行我们的编译脚本,然后将编译结果上传进行分析。

![](https://github.com/yjjnls/Notes/blob/master/img/coverity1.png)

如上图所示,这里有手动和自动化两种形式,这里我们选用自动化的方式并结合travis来进行检测。

## [Travis CI Integration](https://scan.coverity.com/travis_ci)

![](https://github.com/yjjnls/Notes/blob/master/img/coverity2.png)

首先需要按照如上提示注册github、travis和coverity相关的账户,并在travis中激活github项目。然后在coverity中导入相应的github项目,导入后可以看到项目信息,在项目信息下面有一个`project token`,这个token我们后面会用到。

![](https://github.com/yjjnls/Notes/blob/master/img/coverity3.png)

之后只需要在.travis.yml中添加coverity的信息就可以在提交commit时由travis来出发coverity分析。

```yml
env:
  global:
    # COVERITY_SCAN_TOKEN
    # ** specific to your project **
    - secure: "xxxx"

addons:
  coverity_scan:

    # GitHub project metadata
    # ** specific to your project **
    project:
      name: my_github/my_project
      version: 1.0
      description: My Project

    # Where email notification of build analysis results will be sent
    notification_email: scan_notifications@example.com

    # Commands to prepare for build_command
    # ** likely specific to your build **
    build_command_prepend: ./configure

    # The command that will be added as an argument to "cov-build" to compile your project for analysis,
    # ** likely specific to your build **
    build_command: make

    # Pattern to match selecting branches that will run analysis. We recommend leaving this set to 'coverity_scan'.
    # Take care in resource usage, and consider the build frequency allowances per
    #   https://scan.coverity.com/faq#frequency
    branch_pattern: coverity_scan
```

这里coverity是以addon的形式添加到travis中的运行的,首先需要填写两个编译命令 `build_command_prepend` 和 `build_command`,将我们的编译脚本命令填写到对应指令中去就可以。  


`branch_pattern`代表触发converity的分支,这里可以写master,代表每次master提交都会触发coverity。但是由于coverity提供的检测是有[次数限制](https://scan.coverity.com/faq#frequency)的,一旦converity工具检测到此项目当前正在进行代码分析,就会停止后面的操作,也就是不会执行`build_command_prepend` 和 `build_command`中的操作。如果项目依赖于travis构建版本,那么可以考虑将`branch_pattern`填写为coverity_scan,只有在coverity_scan这个分支上面提交commit后才会触发coverity。


.travis.yml中的编译测试操作一般是写在`script`中的,如果想在master分析执行script中的操作,而在coverity_scan分支中执行coverity检测,那么可以这样写
```yml
script: if [ "${COVERITY_SCAN_BRANCH}" != 1 ]; then make ; fi
```
触发coverity是COVERITY_SCAN_BRANCH这个环境变量会被置为1。


我们一开始提到的`project token`需要用travis提供的工具加密,这样就不会再代码中暴露出来了。

```shell
gem install travis
cd my_project
travis encrypt COVERITY_SCAN_TOKEN=project_token_from_coverity_scan
```

或者可以在travis中设置该项目的环境变量COVERITY_SCAN_TOKEN,这里直接设置明文就可以了,不用设置加密后的密文。

---

代码分析成功和失败分别会有如下结果。

![](https://github.com/yjjnls/Notes/blob/master/img/coverity_success.png)

![](https://github.com/yjjnls/Notes/blob/master/img/coverity_fail.png)