對於項目代碼質量管理,在目前的微服務/模塊化/快迭代敏捷開發中若是僅依賴IDE簡單檢查和人爲的codereview對於大量代碼很不適合,不單單依靠開發人員的編碼規範編碼及注意程序健壯性,同時須要一些工具來幫助咱們提早預防和強制檢測規範。html
Sonarqube 是一款代碼分析檢測工具,將其與devops結合,例如集成到gitlab ci/cd或jenkins中實現部署自動代碼檢查,及時發現並處理bug,最大限度的將bug和不規範扼殺在編碼階段,其內部集成不少分析工具,好比pmd-cpd、checkstyle、findbugs、Jenkins,從七個方面幫咱們來源碼質量管理。此文章安裝最新版SonarQube-7.9.1,此版本不支持自定義數據庫MySQL,jdk須要安裝高版本11。java
檢測代碼中註釋的程度:源碼註釋過多或者太少都很差,影響程序的可讀可理解性。python
開發人員把代碼push到SCM(如gitlab)->jenkins構建定義好的job,而後經過jenkins 插件(sonar scanner)分析源碼->jenkins/gitlab-ci 中的scanner客戶端把分析報告發到sonarqube servermysql
# 下載 wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.1.zip # 解壓 /opt/sonarqube/ unzip /opt/sonarqube/bin/[OS]/sonar.sh console # 登陸宿主機http://localhost:9000 (admin/admin)
# 宿主機requirementes sysctl -w vm.max_map_count=262144 sysctl -w fs.file-max=65536 ulimit -n 65536 ulimit -u 4096 cat >> /etc/sysctl.conf << EOF vm.max_map_count=262144 fs.file-max=65536 EOF # sonarqube不能用root用戶執行 useradd sonarqube echo "sonarqubepwd" | passwd --stdin sonarqube # 檢查系統 [root@devops-sonarqube ~]# grep SECCOMP /boot/config-$(uname -r) CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_SECCOMP=y cat > /etc/security/limits.d/99-sonarqube.conf <<EOF sonarqube - nofile 65536 sonarqube - nproc 4096 EOF # sonarqube es須要安裝安裝jdk11 yum -y install java-11-openjdk.x86_64 # 7.9最新版本不支持mysql,數據庫支持MSSQL/Oracle/PostgreSQL # 安裝PostgreSQL # 建立sonarqube用戶,受權用戶create, update, and delete權限 # 若是想自定義數據庫名稱,不用pulic,則須要搜索路徑修改 yum install -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm yum install -y postgresql96-server postgresql96-contrib /usr/pgsql-9.6/bin/postgresql96-setup initdb systemctl start postgresql-9.6 systemctl enable postgresql-9.6 su - postgres psql create user sonarqube with password 'sonarqube'; create database sonarqube owner sonarqube; grant all on database sonarqube to sonarqube; \q # 查看postgresql監聽 vi /var/lib/pgsql/9.6/data/postgresql.conf # 配置白名單 vi /var/lib/pgsql/9.6/data/pg_hba.conf host all all 127.0.0.1/32 md5 #重啓服務 systemctl restart postgresql-9.6 ss -tan | grep 5432 # 建立庫/用戶,並受權 psql -h 127.0.0.1 -p 5432 -U postgres # 下載軟件包 cd /opt && wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.1.zip ln -sv sonarqube-7.9.1 sonarqube chown sonarqube.sonarqube sonarqube/* -R # 切換到系統sonarqube用戶開始安裝 su - sonarqube # 設置數據庫訪問,編輯$SONARQUBE-HOME/conf/sonar.properties sonar.jdbc.username=sonarqube sonar.jdbc.password=sonarqube # 注意爲127.0.0.1 sonar.jdbc.url=jdbc:postgresql://127.0.0.1/sonarqube # 配置ES存儲路徑,編輯SONARQUBE-HOME/conf/sonar.properties sonar.path.data=/var/sonarqube/data sonar.path.temp=/var/sonarqube/temp # 配置web server,編輯SONARQUBE-HOME/conf/sonar.properties sonar.web.host=192.0.0.1 sonar.web.port=80 sonar.web.context=/sonarqube # web服務器性能調優 $SONARQUBE-HOME/conf/sonar.properties sonar.web.javaOpts=-server $SONARQUBE-HOME/conf/wrapper.conf wrapper.java.command=/path/to/my/jdk/bin/java # 執行啓動腳本 Start: $SONAR_HOME/bin/linux-x86-64/sonar.sh start Graceful shutdown: $SONAR_HOME/bin/linux-x86-64/sonar.sh stop Hard stop: $SONAR_HOME/bin/linux-x86-64/sonar.sh force-stop # 插件安裝 1.Marketplace方式安裝(Administration > Marketplace) 2.手動安裝(將下載好的插件上傳至服務器目錄:$SONARQUBE_HOME/extensions/plugins,重啓sonarqube服務)
docker pull sonarqube docker run -d --name sonarqube -p 9000:9000 sonarqube # 分析mvn項目 # On Linux: $ mvn sonar:sonar # With boot2docker: $ mvn sonar:sonar -Dsonar.host.url=http://$(boot2docker ip):9000 # docker主機系統要求 sysctl -w vm.max_map_count=262144 sysctl -w fs.file-max=65536 ulimit -n 65536 ulimit -u 4096
因爲gitlab項目較多,共用了gitlab-runner,所以在gitlab-runner安裝sonner-scanner便可,可通用對構建的項目進行掃描linux
# 下載安裝 cd /opt && wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip # 添加進PATH mv sonar-scanner-4.0.0.1744-linux sonar-scanner cat > /etc/profile.d/sonar-scanner.sh <<EOF export PATH=$PATH:/opt/sonar-scanner/bin EOF source /etc/profile.d/sonar-scanner.sh [root@common-runner ~]# sonar-scanner -h INFO: INFO: usage: sonar-scanner [options] INFO: INFO: Options: INFO: -D,--define <arg> Define property INFO: -h,--help Display help information INFO: -v,--version Display version information INFO: -X,--debug Produce execution debug output
Create new project->Provide a token->git
stages: - sonarqube_scan - deploy_src - install_dependency - restart_server - check_server variables: RUNNER_BASE_DIR: "/home/gitlab-runner/builds/QFafxxxEq/0/devops/" BASE_DIR: "/go2cloud_api/" job sonarqube_scan_job: stage: sonarqube_scan # 注意,此用戶爲gitlab-runner執行,指定/.爲此項目目錄 script: - sonar-scanner -Dsonar.projectKey=go2cloud_api_test -Dsonar.sources=/. -Dsonar.host.url=http://43.xxx.xxx.xxx:9110 -Dsonar.login=a393276xxxxxxxxxxxxxxxxxxx03004a714 tags: - 51common-runner only: - go2cloud-platform-test when: always job deploy_src_job: stage: deploy_src script: - scp -r ${RUNNER_BASE_DIR}${BASE_DIR}* root@172.16.100.5:/project${BASE_DIR} tags: - 51common-runner only: - go2cloud-platform-test when: always
提交代碼測試:web
查看運行jobsql
查看sonarqube項目docker
![image-20190810112146155](/Users/xuel/Library/Application Support/typora-user-images/image-20190810112146155.png)shell
查看詳情
能夠利用插件集成,也能夠將sonar-scanner 安裝在jenkins服務區上面,每次進行工具掃描。
sonar-scanner安裝和gitlab-runner上安裝同樣,詳見:2.2.1 sonar-scanner安裝
能夠兩種方式集成:直接在構建的時候執行掃描命令分析報告,插件形式集成。
在構建的時候利用安裝好的sonar-scanner命令集成
# 配置PATH export PATH=/data/apps/miniconda3/bin:/data/apps/miniconda3/condabin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/data/apps/miniconda3/bin:/data/apps/software/sonar-scanner/bin:/root/bin # 指定jenkins的workspace目錄 BASE_DIR=/root/.jenkins/workspace/ # 指定項目名稱,此job的名稱 PROJECT=go2cloud_api_prod_job # 指定conda中項目的虛擬環境 PROJECT_ENV=go2cloud-api-prod-env # 切換python環境 source activate ${PROJECT_ENV} $(which python) -m pip install mock nose coverage # 更新python環境 echo "++++++++++++++++++++++++++++++更新Python環境+++++++++++++++++++++++++++++++++++++++" if [ -f ${BASE_DIR}${PROJECT}/requirements.txt ];then $(which python) -m pip install -r ${BASE_DIR}${PROJECT}/requirements.txt && echo 0 || echo 0 fi # 代碼檢查/單元測試/代碼測試覆蓋率 echo "+++++++++++++++++++++++++++++++代碼檢查+++++++++++++++++++++++++++++++++++++++" cd ${BASE_DIR} # 生成pylint.xml $(which pylint) -f parseable --disable=C0103,E0401,C0302 $(find ${PROJECT}/* -name *.py) >${BASE_DIR}${PROJECT}-pylint.xml || echo 0 #echo "+++++++++++++++++++++++++++++++單元測試+++++++++++++++++++++++++++++++++++++++" # 生成nosetests.xml #$(which nosetests) --with-xunit --all-modules --traverse-namespace --with-coverage --cover-package=go2cloud-api-deploy-prod --cover-inclusive || echo 0 #$(which nosetests) --with-xunit --all-modules --traverse-namespace --with-coverage --py3where=${PROJECT} --cover-package=${PROJECT} --cover-inclusive || echo 0 #echo "+++++++++++++++++++++++++++++++代碼覆蓋率+++++++++++++++++++++++++++++++++++++++" # 生成coverage.xml # -m coverage xml --include=${PROJECT}* || echo 0 # sonarqube 代碼掃描 sonar-scanner \ -Dsonar.projectKey=go2cloud_api_prod \ -Dsonar.sources=${BASE_DIR}${PROJECT}/. \ -Dsonar.host.url=http://xxx.xxx.xxx.xxx:9100 \ -Dsonar.login=2194d90xxxxxxxxxxxxxxxxxxxxxxxxbec7f69
運行項目查看
查看sonarqube項目
# 若是在構建中未指定將掃描報告發送給server端地址,須要在客戶端中配置,在安裝好scanner的conf目錄下修改:sonar-scanner.properties 服務端的地址 sonar.host.url=http://xxx.xxx.xxx.xxx:9100
jenkins服務器安裝scanner
須要在sonarqube server配置jenkins的api token,用來jenkins將報告發送給sonarqube server
jenkins利用sonarqube的token建立憑據
根據掃描的程序語言填寫對應的analysis properties,在此填寫項目相關信息。
若是使用pipeline,能夠參考聲明式示例
pipeline { agent any stages { stage('SonarQube analysis 1') { steps { sh 'mvn clean package sonar:sonar' } } stage("Quality Gate 1") { steps { waitForQualityGate abortPipeline: true } } stage('SonarQube analysis 2') { steps { sh 'gradle sonarqube' } } stage("Quality Gate 2") { steps { waitForQualityGate abortPipeline: true } } } }
在jenkins上面配置了projectname,在sonarqube上就不用配置項目
Gitlab-runner輸出限制,gitlab界面顯示不全ob's log exceeded limit of 4194304 bytes.
https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/configuration/advanced-configuration.md#the-runners-section