jenkins master和多slave环境,视图对job分类,结合jenkins实现sonarqube代码质量检测

一,部署jenkins master及多slave环境
在slave节点上安装java
root@jenkins-slave1:~# apt install openjdk-11-jdk
创建和jenkins master节点相同数据目录
root@jenkins-slave1:~# mkdir -p /var/lib/jenkins

在Jenkins—系统管理—节点管理—新建节点:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用复制现有节点,添加新的节点
在这里插入图片描述
查看添加的节点状态,已同步
在这里插入图片描述
在slave节点上生成秘钥对 执行命令:ssh-keygen
copy公钥到gitlab的 -》ssh秘钥菜单框里面
在这里插入图片描述
在这里插入图片描述
copy slave私钥到jenkins上,添加凭据
在这里插入图片描述
使用流水线生成pipline脚本
在这里插入图片描述
编写pipline脚本,任务指定到节点上运行

pipeline{
    //agent any  //全局必须带有agent,表明此pipeline执行节点
    agent { label 'jenkins-node1' } //基于label指定具体执行的步骤节点,非必须
    stages{
        stage("代码clone"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
            steps{
                sh "cd /var/lib/jenkins/workspace/pipline-test1 && rm -rf ./*"
                git branch: 'main', credentialsId: 'b199268d-59eb-444f-b924-b05ad35d9770', url: 'git@192.168.159.130:primaryedu/app1.git'
                echo "代码 clone完成"
            }
        }
        stage("代码构建"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
			    steps{
				    sh "tar czvf frontend.tar.gz --exclude=.git --exclude=.gitignore  --exclude=README.md ./"
			    }
		    }    
    }
}

在这里插入图片描述
查看执行状态,成功
在这里插入图片描述
二,基于jenkins视图对jenkins job进行分类
创建视图名称pipline-if-view
在这里插入图片描述
在编辑视图里编辑正则表达式,对任务进行匹配
在这里插入图片描述
正则表达式匹配后,会把包含关键字的任务放到新创建的pipline-if-view视图里,新创建的pipline-if-test3能匹配到正则的,会把任务自动添加到这个视图里。
在这里插入图片描述
在这里插入图片描述
三,总结jenkins pipline基本语法
流水线过程定义在pipline{}块中,在pipline块中定义了整个流水线中完成的所有操作,里面包含stage(阶段),在stage里面包含step(步骤)。
Stage:阶段,一个pipline可以划分为若干个stage,每个stage都是一个操作阶段,比如代码clone、代码编译、代码测试和代码部署,阶段是一个逻辑分组,在pipline中可以实现跨多个node执行不同的stage。
Step:步骤,step是jenkins pipline最基本的操作单元,一个stage中可以有多个step,例如在代码clone的stage中
需要定义代码clone的step、在代码编译stage需要定义代码编译的step。
Node:jenkins工作节点,可以是jenkins master也可以是jenkins slave,node是执行step的具体服务器。
pipline 语法-指定节点

pipeline{
    //agent any  //全局必须带有agent,表明此pipeline执行节点
    agent { label 'jenkins-node1' } //基于label指定具体执行的步骤节点,非必须
    stages{
        stage("代码clone"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
            steps{
                sh "cd /var/lib/jenkins/workspace/pipline-test1 && rm -rf ./*"
                git branch: 'main', credentialsId: '60177b7e-70a1-49e7-b1c7-fcd48c3accbb', url: 'git@172.31.5.101:magedu/app1.git'
                echo "代码 clone完成"
            }
        }
        stage("代码构建"){
            //#agent { label 'master' }  //基于label指定具体执行的步骤节点,非必须
			    steps{
				    sh "tar czvf frontend.tar.gz --exclude=.git --exclude=.gitignore  --exclude=README.md ./"
			    }
		    }    
    }
}

基于input实现交互式操作:
Input 指令可以在流水线中实现必要的交互式操作,比如选择要部署的环境、是否向后继续执行任务等。
message:必选,在input界面的提示信息,比如:“是否继续?”等,内容可自定义。
id:可选,input 的标识符,默认为 stage 的名称。
ok:可选,确认按钮的显示信息,比如可以是“确定”、“允许”等 自定义内容,默认继续为Proceed 、取消为 Abort。
submitter:可选,允许提交 input 操作的用户或组的名称,如果为空,任何登录用户均可提交 input。
parameters:提供一个参数列表供 input 使用。

pipeline {
  agent any
  stages {
    stage('交互测试') {
      input {
        message "是否继续部署?"
        ok "继续部署"
        submitter "jenkinsadmin"
      }
      steps {
        echo "Hello jenkins!"
      }
    }
  }
}

post指令:post一般用于pipline流水线执行后的进一步处理,比如错误通知等,post可以针对流水线不同的执行结果做出不同的处理,比如执行成功做什么处理,执行失败做什么处理等。post定义在pipline或stage中,目前支持以下条件:
always:无论pipline或stage的最后是执行成功还是失败,都执行post中定义的指令。
changed:只有当前pipline或stage的完成状态与它之前的运行不同时,比如从成功转换为失败,或从失败转换为成功,才执行post中定义的指令。
fixed:当本次Pipeline或stage成功,且上一次构建是失败或不稳定时,就执行post中定义的指令,从失败转换为成功。
regression:当本次Pipeline或stage的状态为失败、不稳定或终止,且上一次构建的状态为成功时,就执行post中定义的指令,从成功转换为失败。
failure:只有当前Pipeline或stage的完成状态为失败(failure),才允许在post部分运行该步骤,而且通常这时在Web界面中显示为红色。
success:当前执行状态为成功(success),执行post步骤,通常在Web界面中显示为蓝色或绿色。
unstable:当前状态为不稳定(unstable),执行post步骤,通常原因是由于测试失败或代码违规等造成,而且会在Web界面中显示为黄色。
aborted:当前状态为终止(aborted),执行该post步骤,通常由于流水线被手动终止触发,这时在在Web界面中显示为灰色。
unsuccessful:当前状态只要不是success时,执行该post步骤;
cleanup:无论pipeline或stage的完成状态如何,都允许运行该post中定义的指令,和always的区别在于cleanup会在post其它条件执行之后执行(最后执
行cleanup)。
下面脚本例子:pipline-post-test,执行异常后post阶段的操作,cleanup会晚于always和failure执行

pipeline {
  agent any
  stages {
    stage('post测试-代码clone阶段') {
        steps {
            sh 'echo git clone'
            sh 'cd /data/xxx'  //此步骤会执行失败,用于验证构建失败的邮件通知
      }
        post {
            cleanup {
	        	  script {
	                 mail to: '603938723@qq.com',
                     subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                     body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -cleanup 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情"
	            }
            }
	        always {
	        	  script {
	              mail to: '603938723@qq.com',
                      subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                      body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -always 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情"
	            }
            }
	        aborted {
	        		echo "post aborted"
	            }
	        success {
	        	script {
	            mail to: '603938723@qq.com',
                    subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                    body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} - 构建成功!\n 点击链接 ${env.BUILD_URL} 查看详情"
	            }
            }
        	failure {
	        	script {
	            mail to: '603938723@qq.com',
                    subject: "Pipeline Name: ${currentBuild.fullDisplayName}",
                    body: " ${env.JOB_NAME} -Build Number-${env.BUILD_NUMBER} -failure 构建失败!\n 点击链接 ${env.BUILD_URL} 查看详情"
	            }
            }
        }
    }
	}
}

pipline环境变量:
pipline参数简介,基于parameters给step传递参数:
可以基于parameters自定义参数,参数用于在执行pipline流水线的时候传递给step进行使用,比如传递选项参数、gitlab的分支、镜像仓库、镜像tag等信息。
 string: #字符串类型参数,可以传递账户名、密码等参数
 text: #文本型参数,一般用于定义多行文本内容的变量。
 booleanParam:#布尔型参数
 choice:#选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值使用
 password: #密码型变量,一般用于定义敏感型变量,在 Jenkins 控制台会输出为*隐藏密码
pipline参数示例,pipline-env-test

pipeline {
  agent any
  environment {   //全局的变量,在当前pipline所有的stage中都会生效
    NAME='user1'
    PASSWD='123456'
  }
  stages {
    stage('环境变量stage1') {
      environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效
        GIT_SERVER = 'git@192.168.159.130:magedu/app1.git'
      }
      steps {
        sh """
            echo '$NAME'
            echo '$PASSWD'
            echo '$GIT_SERVER'
        """
      }
    }
    stage('环境变量stage2') {
      steps {
        sh """
            echo '${NAME}'
            echo '$PASSWD'
        """
      }
    }
  }
}

例子二,pipline-env-test2

pipeline {
agent any
parameters {
string(name: 'BRANCH', defaultValue: 'develop', description: '分支选择') //字符串参数,会配置在jenkins的参数化构建过程中
choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择') //选项参数,会配置在jenkins的参数化构建过程中
}
stages {
stage('测试参数1') {
steps {
sh "echo $BRANCH"
}
}
stage('测试参数2') {
steps {
sh "echo $DEPLOY_ENV"
}
}
}
}

pipline if指令:
 buildDiscarder(logRotator(numToKeepStr: ‘5’)) //保留5个历史构建版本
 timeout(time: 5, unit: ‘MINUTES’) //定义任务执行超时时间1小时,如果不加unit参数默认时间单位为分钟,支持NANOSECONDS,
MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS
 timestamps() //在控制台显示命令执行的时间,格式为10:58:39
 retry(2) //流水线构建失败后重试次数为2次
例子一,pipline-if-test

pipeline {
agent any
environment { //全局的变量,在当前pipline所有的stage中都会生效
NAME='user1'
PASSWD='123456'
}
options { //定义pipline参数
buildDiscarder(logRotator(numToKeepStr: '5')) //保留5个历史构建版本
timeout(time: 5, unit: 'MINUTES') //定义任务执行超时时间1小时,如果不加unit参数默认时间单位为分钟,支持NANOSECONDS,MICROSECONDS,MILLISECONDS,
timestamps() //在控制台显示命令执行的时间,格式为10:58:39
retry(2) //流水线构建失败后重试次数为2次
}
stages {
stage('代码clone') {
environment { //定义在stage中的变量只会在当前stage生效,其他的stage不会生效
GIT_SERVER = 'git@172.31.5.101:magedu/app1.git'
}
steps {
sh """
echo '代码clone'
"""
}
}
}
}

例子二,pipline-if-test2

pipeline {
agent any
environment {
//代码仓库变量
def BRANCH_NAME = 'main'
}
stages {
stage('if指令测试') {
steps {
script {
if (env.BRANCH_NAME == 'main') {
echo '我是master'
} else if (env.BRANCH_NAME == 'develop'){
echo '我是develop'
} else {
echo '我是默认的'
}
}
}
}
}
}

四,部署代码质量检测服务sonarqube
SonarQube 是一个用于代码质量管理的开放平台,通过插件机制实现对不同语言的源代码质量扫描,如go、python、java、python等代码扫描并生成扫描报告。
不能使用root用户启动SonarQube,使用postgresql数 据库。
1.PostgreSQL安装:
root@postgresql:~#sudo apt update
root@postgresql:~#apt-cache madison postgresql
root@postgresql:~#apt install postgresql
2. PostgreSQL环境初始化:
sudo pg_createcluster --start 14 mycluster #指定版本为PostgreSQL 14
修改/etc/postgresql/14/目录下main和mycluster里的pg_hba.conf,postgresql.conf文件,并重启postgresql.
root@postgresql:~#vim /etc/postgresql/14/mycluster/pg_hba.conf
==> host all all 0.0.0.0/0 scram-sha-256
root@postgresql:~#vim /etc/postgresql/14/mycluster/postgresql.conf
==> listen_addresses = ‘’ #defaults to ‘localhost’; use '’ for all
root@postgresql:~#vim /etc/postgresql/14/main/pg_hba.conf
==> host all all 0.0.0.0/0 scram-sha-256
root@postgresql:~#vim /etc/postgresql/14/main/postgresql.conf
==> listen_addresses = ‘’ #defaults to ‘localhost’; use '’ for all
3.PostgreSQL端口验证:
root@postgresql:~# lsof -i:5432
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
postgres 3959 postgres 5u IPv4 45202 0t0 TCP localhost:postgresql (LISTEN)
4.创建数据库及账户授权:
root@postgresql:~# su - postgres #切换到postgres普通用户
root@postgresql:~# psql -U postgres #进入到postgresql命令行敞口
 psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
 Type “help” for help.
 postgres=# CREATE DATABASE sonar; #创建sonar数据库
 CREATE DATABASE
 postgres=# CREATE USER sonar WITH ENCRYPTED PASSWORD ‘123456’; #创建sonar用户密码为123456
 CREATE ROLE
 postgres=# GRANT ALL PRIVILEGES ON DATABASE sonar TO sonar; #授权用户访
 GRANT
 postgres=# ALTER DATABASE sonar OWNER TO sonar; #执行变更
 ALTER DATABASE
 postgres=# \q #退出
 ~$ exit

部署SonarQube Server 8.9.x:

  1. 安装jdk 11:
     # apt install -y openjdk-11-jdk
     内核参数:
     # vim /etc/sysctl.conf
     vm.max_map_count = 262144
     fs.file-max = 65536
  2. 执行命令sysctl -p,使修改的上面内核参数生效
    root@sonarqube:~# sysctl -p
    vm.max_map_count = 262144
    fs.file-max = 65536
  3. 部署SonarQube 8.9.x:
     # mkdir /apps && cd /apps/
     # unzip sonarqube-8.9.10.61524.zip
     # ln -sv /apps/sonarqube-8.9.10.61524 /apps/sonarqube
     # useradd -r -m -s /bin/bash sonarqube && chown sonarqube.sonarqube /apps/ -R && su - sonarqube
     ~$ vim /apps/sonarqube/conf/sonar.properties
     18 sonar.jdbc.username=sonar
     19 sonar.jdbc.password=123456
     37 sonar.jdbc.url=jdbc:postgresql://192.168.159.139/sonar
     ~$ /apps/sonarqube/bin/linux-x86-64/sonar.sh --help
     ~$ /apps/sonarqube/bin/linux-x86-64/sonar.sh start
  4. 验证SonarQube:
     ~$ tail /apps/sonarqube/logs/*.log
     2022.11.08 10:48:22 INFO app[][o.s.a.SchedulerImpl] Process[ce] is up
     2022.11.08 10:48:22 INFO app[][o.s.a.SchedulerImpl] SonarQube is up
     ~$ lsof -i:9000
     COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
     java 6159 sonarqube 14u IPv6 81413 0t0 TCP *:9000 (LISTEN)
    在这里插入图片描述
    登录成功

五,基于命令、shell脚本和pipline实现代码质量检测
部署扫描器sonar-scanner
#unzip sonar-scanner-cli-4.7.0.2747.zip
 # ln -sv /apps/sonar-scanner-4.7.0.2747 /apps/sonar-scanner
 # vim /apps/sonar-scanner/conf/sonar-scanner.properties
 #----- Default SonarQube server
 sonar.host.url=http://192.168.159.140:9000
 #----- Default source code encoding
 sonar.sourceEncoding=UTF-8

在sonar-scanne节点测试代码质量扫描:
配置参数:
 root@jenkins:/opt/python-test# ll
 drwxr-xr-x 2 root root 48 Nov 8 20:21 .scannerwork/
 -rw-r–r-- 1 root root 284 Nov 8 20:20 sonar-project.properties
 drwxr-xr-x 2 root root 21 Nov 8 20:07 src/
 # cat sonar-project.properties
 # Required metadata
 sonar.projectKey=magedu-python //#项目key,项目唯一标识、通常使用项目名称
 sonar.projectName=magedu-python-app1 #项目名称,当前的服务名称
 sonar.projectVersion=1.0 #当前的代码版本
 # Comma-separated paths to directories with sources (required)
 sonar.sources=./src #源代码路径、sonar-scanner会扫描./src 下的代码
 # Language
 sonar.language=py #编程语言类型
 # Encoding of the source files
 sonar.sourceEncoding=UTF-8 #字符集

执行扫描:
 基于配置文件执行扫描:
 root@jenkins:/opt/python-test# pwd
 /opt/python-test
 root@jenkins:/opt/python-test# /apps/sonar-scanner/bin/sonar-scanner
 基于传递扫描参数:
 root@jenkins:/opt/python-test# pwd
 /opt/python-test
 #/apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=magedu -Dsonar.projectName=magedu-python-app1 -
Dsonar.projectVersion=1.0 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8
在这里插入图片描述
验证扫描结果:
在这里插入图片描述
sonarqube实现python代码扫描:

pipeline {
agent any
parameters {
string(name: 'BRANCH', defaultValue: 'develop', description: '分支选择') //字符串参数,会配置在jenkins的参数化构建过程中
choice(name: 'DEPLOY_ENV', choices: ['develop', 'production'], description: '部署环境选择') //选项参数,会配置在jenkins的参数化构建过程中
}
stages {
stage('变量测试1') {
steps {
sh "echo $env.WORKSPACE" //JOB的工作目录,可用于后期目录切换
sh "echo $env.JOB_URL" //JOB的URL
sh "echo $env.NODE_NAME" //节点名称,master 名称显示built-in
sh "echo $env.NODE_LABELS" //节点标签
sh "echo $env.JENKINS_URL" //jenkins的URL地址
sh "echo $env.JENKINS_HOME" //jenkins的家目录路径
}
}
stage('python源代码质量扫描') {
steps {
sh "cd $env.WORKSPACE && /apps/sonar-scanner/bin/sonar-scanner -Dsonar.projectKey=magedu -Dsonar.projectName=magedu-
python-app1 -Dsonar.projectVersion=1.0 -Dsonar.sources=./src -Dsonar.language=py -Dsonar.sourceEncoding=UTF-8"
}
}
}
}

sonarqube实现python代码扫描:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值