【Testops学习积累之二】Jenkins Pipeline中Git打包、Sonar扫描静态代码实践操作过程记录

步骤1:在jenkins服务器中,下载git和部署,并在jenkins中安装git插件,并在系统管理--全局工具配置中配置git路径(如下图)

 

步骤2:jenkins服务器中,安装和部署mysql(自行百度,也可以采用docker 容器部署),并启动

参考资料:https://www.cnblogs.com/yoyotl/p/5752437.html

 

步骤3:docker 安装和运行SonarQube server

(1):在docker 远程库中下载SonarQube server容器(命令:docker pull sonarqube)

(2):docker运行sonarqube容器

命令:

~: docker run -d -p 9000:9000 -p 9092:9092 --restart=always  -e SONARQUBE_JDBC_USERNAME=数据库用户名 -e SONARQUBE_JDBC_PASSWORD=数据库密码 -e SONARQUBE_JDBC_URL='jdbc:mysql://ip:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false' --name sonarqube  sonarqube

(3):将sonarqube容器对外访问端口,添加到防火墙中.

命令:

~:firewall-cmd --zone=public --add-port=9000/tcp --permanent

~:firewall-cmd --zone=public --add-port=9092/tcp --permanent

~:  firewall-cmd --reload

(4):jenkins中安装sonar相关插件(Sonar Quality Gates PluginSonarQube Scanner for Jenkins),并在系统管理--系统设置--SonarQube servers中,配置路径、SonarQube servers的访问地址、token(注:token配置,见问题1)

注:

1、sonar首次启动时,有点慢,而且有可能出现失败,如果出现无法请求,可以多次刷新浏览器试试,如还不行,可以telnet端口试试或者查看一下sonar server的日志  

 

步骤4:jenkins服务器中,SonarQube Scanner安装和配置

(1):手工下载(注意兼容SonarQube server版本问题),并解压,配置环境变量【命令1:vi /etc/profile(如下图,保存后)  命令2:source /etc/profile(重启环境变量)】:

    下载地址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/

(2):jenkins中系统管理--全局工具配置--Sonar Scanner中,配置路径

 

步骤5:jenkins Pipeline项目创建和脚本编写

  1. 创建流水线项目(自行百度,或者参考我上一篇博客)
  2. Git打包和sonar扫描代码编写,当前采用直接Pipeline script,没有采用Jenkinsfile文件方式,代码如下:
def getHost(){
    def remote = [:]
    remote.name = 'server02'
    //远程部署服务器
    remote.host = '192.168.0.67'
    remote.user = 'root'
    remote.port = 22
    remote.password = '123456'
    remote.allowAnyHosts = true
    return remote
}
pipeline {
    agent any
    environment{
        def server = ''
    } 
    stages {
            stage('gitcheckout') { 
                steps {
                    echo 'This is a gitcheckout step' 
                    checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '31cd5e49-9019-4a26-8325-9989ae9d6289', url: 'http://ip/Develop/zd_api.git']]])
                }
            }
            stage('sonar') { 
                steps {
                    echo 'This is a sonar step' 
                    withSonarQubeEnv('sonar') {
                        //sonar-scanner部署路径下shell运行配置扫描项目信息
                        sh "/usr/local/sonar/sonar-scanner3.3.0.1492/bin/sonar-scanner -X "+
                           "-Dsonar.host.url=${SONAR_HOST_URL} " +
                           "-Dsonar.language=php " + 
                           "-Dsonar.projectKey=zd " + 
                           "-Dsonar.projectName=zd " + 
                           "-Dsonar.projectVersion=$BUILD_NUMBER " + 
                           "-Dsonar.sources=. " + 
                           "-Dsonar.sourceEncoding=UTF-8 "
                    }
                }
            }
            stage("QualityGate") {
                steps {
                    echo 'QualityGate'
                   /*
                    script {
                        timeout(time: 1, unit: "HOURS") {       // 防止获取回调出现异常情况,设置超时时间
                            def qg = waitForQualityGate('jenkins') //利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail
                             //注意:这里waitForQualityGate()中的参数也要与之前SonarQube servers中Name的配置相同
                            if (qg.status != 'OK') {
                                error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
                            }
                        }
                    }
                    */
                }
            }
            stage('init-server'){
                steps {
                    script {                 
                       server = getHost()                                   
                    }
                }
            }
            stage('remote server pull image') {
                steps {
                    script {
                       //远程连接服务器
                      sshCommand remote: server, command: """ 
                       //获取镜像ID为192.168.0.68:5000/tomcat_jdk7
                      image_name='docker images|grep -i 192.168.0.68:5000/tomcat_jdk7|awk '{print \$1}'';
                      if [ \$image_name ];then
                         docker rmi \$image_name; 
                      fi;
                      //192.168.0.68:5000/tomcat_jdk7镜像ID不存在,就从私库服务器拉取
                      docker pull 192.168.0.68:5000/tomcat_jdk7:latest;
                     """
                     }
                }
            }
            stage('remote server docker run'){
                steps {
                    script {
                      sshCommand remote: server, command: """ 
                      //获取镜像name为test1
                      container_name=`docker ps -a -f name=test1 -q`;
                      if [ \$container_name ];then 
                      docker rm --force \$container_name;
                      fi;
                      //镜像name为test1不存在,就远程运行镜像
                      docker run -d -p 8081:8080 --name test1 192.168.0.68:5000/tomcat_jdk7:latest;
                      """
                    }
                }
            }
    }
}

注:1、在jenkins项目-配置-流水线中,有一个“流水线语法”,可以根据配置,自动生成Pipeline script,到时copy出来就可以直接用,无需手写。

 

问题1:jenkins系统配置中配置SonarQube servers时,遇到添加凭证中Secret和id输入什么值的问题(网上很少有资料显示)。

解决方法:凭证中Secret和id都是为sonar服务中配置的是token值,获取方法,很简单,百度搜索即可。

 

问题2:SonarQube Scanner扫描项目时,如果扫描项目内容较多时,容易出现上报失败

解决方法:

步骤1:在linux系统中,找到mysql的my.cnf配置文件(默认安装mysql的,一般在/etc路径下),将max_allowed_packet值改到事宜大小。

步骤2:重启mysql(命令:service mysqld restart)

步骤3:重启sonar sever(如果sonar是容器,执行命令:docker restart容器id/name)

 

问题3:docker容器中,出现ipv4 forwarding is disabled. networking will not work

解决方法:https://www.cnblogs.com/atuotuo/p/7092700.html

 

问题4:jenkins Pipeline 使用的centos版本、jdk版本、jenkins版本问题

1、Centos版本为7.2以上(最好是最新版本)

2、jenkins建议安装最新版本,且jdk安装jdk8

 

参考资料:

1、http://192.168.0.69:8080/jenkins/job/test/pipeline-syntax/globals(此地址,是jenkins内部地址,安装好Pipeline插件后,就可以查看了)

2、https://blog.csdn.net/weixin_40816738/article/details/90111803

3、https://blog.csdn.net/qq_36663951/article/details/82115086 

4、https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/  (此地址是官方地址,有多个方式进行sonar操作)

5、https://www.cnblogs.com/cay83/p/7537850.html

6、https://www.cnblogs.com/luolizhi/p/5697021.html  (此地址中有sonar 扫描不通语言方式配置方式借鉴)

7、https://www.58jb.com/html/184.html (pipeline实现多个代码分支打包)

8、https://my.oschina.net/keking/blog/3019389

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值