如何使用Saltslack使用Docker设置SonarQube,以及如何在CI

时间:2016-06-27 09:50:07

标签: github gradle sonarqube travis-ci salt-stack

这篇文章概述了我们如何使用Docker和Saltslack作为Docker容器配置管理将SonarQube集成到我们的工作流程中。

它还包含与Travis-CI中的Gradle一起使用的设置,以便在Github上执行代码分析和Pull请求分析。

此外,如果您发现此设置有任何改进,请发表评论!

(如果使用Docker Compose,请参阅https://github.com/SonarSource/docker-sonarqube。请随时在此处维护此答案或将其复制到SCM。)

需要Docker Engine 1.9

1 个答案:

答案 0 :(得分:0)

使用Salt设置SonarQube服务器

创建适用于SonarQube服务器的此支柱文件:

  sonar-qube:
  name: sonar-qube
  port: 9000
  version: <ENTER SOME VERSION>
  version_postgresql: <ENTER SOME VERSION>
  # Using a shared disk allows you to move the SonarQube container between different servers and still keep the data.
  host_storage_path: /some/shared/disk

将此sonarqube.sls创建为Docker State文件。

(它要求您在名为sonarnet-config的配置中配置名为sonarnet的网络)

{% set name = salt['pillar.get']('sonar-qube:name') %}
{% set port = salt['pillar.get']('sonar-qube:port') %}
{% set tag = salt['pillar.get']('sonar-qube:version') %}
{% set pg_tag = salt['pillar.get']('sonar-qube:version_postgresql') %}
{% set host_storage_path = salt['pillar.get']('sonar-qube:host_storage_path') %}

include:
  - <state file of the sonarnet-config network definition>

sonar-qube-image:
  dockerng.image_present:
    - name: sonarqube:{{tag}}

sonar-qube:
  dockerng.running:
    - name: {{name}}
    - image: sonarqube:{{tag}}
    - network_mode: sonarnet
    - port_bindings:
      - {{port}}:{{port}}
    - environment:
      - SONARQUBE_JDBC_URL: jdbc:postgresql://sonar-db:5432/sonar
    - binds:
      - {{host_storage_path}}/sonarqube/conf:/opt/sonarqube/conf
      - {{host_storage_path}}/sonarqube/data:/opt/sonarqube/data
      - {{host_storage_path}}/sonarqube/extensions:/opt/sonarqube/extensions
      - {{host_storage_path}}/sonarqube/lib/bundled-plugins:/opt/sonarqube/lib/bundled-plugins
    - require:
      - dockerng: sonarnet-config

sonar-db:
  dockerng.running:
    - image: postgres:{{pg_tag}}
    - network_mode: sonarnet
    - port_bindings:
      - 5432:5432
    - environment:
      - POSTGRES_USER: sonar
      - POSTGRES_PASSWORD: sonar
    - binds:
      - {{host_storage_path}}/postgresql:/var/lib/postgresql
      # This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52
      - {{host_storage_path}}/postgresql/data:/var/lib/postgresql/data
    - require:
      - dockerng: sonarnet-config

使用常规盐来启动容器。

启动SonarQube服务器后,您应该可以访问SonarQube的网页gui。

执行自动分析(使用Travis CI中的Gradle)

这些bullests将逐一描述

  1. 启用Gradle插件
  2. 在SonarQube和Github上创建用户
  3. 编写执行分析的bash脚本
  4. 从Travis CI调用bash脚本。
  5. 1)启用Gradle插件

    根据https://plugins.gradle.org/plugin/org.sonarqube

    上的文档启用该插件
    plugins {
        id "org.sonarqube" version "2.0.1"
    }
    

    2)在Github和Sonar中设置用户

    Github要求用户具有写访问权限(很快只能读取访问权限?)到repo。为团队创建一个sonar-ci用户,并为团队的repo提供写入权限。请参阅此帖子:https://github.com/janinko/ghprb/issues/232#issuecomment-149649126然后为该用户创建访问令牌,访问令牌必须授予“完全控制私有存储库”。

    Sonar要求拥有“全局权限”下“执行分析”和“创建项目”权限的用户。它还需要“项目权限”下的“浏览”,“查看源代码”和“执行分析”权限。为该用户生成访问令牌。

    3)编写bash脚本

    此脚本将进行完整分析,并在合并到git分支master时在SonarQube Web GUI上发布结果。这可以跟踪代码随时间的变化。它还将分析github中的拉取请求,并将其结果直接写为评论评论。

    需要设置这些env变量:

    TRAVIS_* - 由特拉维斯设定:见https://docs.travis-ci.com/user/environment-variables/

    SONAR_TOKEN是声纳服务器的访问令牌

    GITHUB_SONAR_TOKEN是Github上声纳alaysis用户的访问令牌

    sonarqube.sh:

    SONAR_URL="https://sonar.example.com"
    
    if [ -z "$SONAR_TOKEN" ] || [ -z "$GITHUB_SONAR_TOKEN" ]; then
        echo "Missing environemnt variable(s) for SonarQube. Make sure all environment variables are set."
        exit 1
    fi
    
    if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
    
        echo "Running SonarQube analysis for pull request nr $TRAVIS_PULL_REQUEST..."
    
        ./gradlew sonarqube \
            -Dsonar.host.url=$SONAR_URL \
            -Dsonar.login=$SONAR_TOKEN \
            -Dsonar.github.pullRequest=$TRAVIS_PULL_REQUEST \
            -Dsonar.github.repository=$TRAVIS_REPO_SLUG \
            -Dsonar.github.oauth=$GITHUB_SONAR_TOKEN \
            -Dsonar.analysis.mode=issues
    
    elif [ "$TRAVIS_BRANCH" == "master" ]; then
    
        echo "Starting publish SonarQube analyzis results to $SONAR_URL"
    
        ./gradlew sonarqube \
            -Dsonar.host.url=$SONAR_URL \
            -Dsonar.login=$SONAR_TOKEN \
            -Dsonar.analysis.mode=publish
    
    fi
    

    4)从Travis CI整合

    .travis.yml添加:

    after_success:
      - ./sonarqube.sh
    
    before_cache:
      - rm -rf $HOME/.gradle/caches/*/gradle-sonarqube-plugin
    
    cache:
      directories:
        - $HOME/.sonar