文章目录
环境准备
sonarqube的token为:d6028eee860737d6cdf746ca153e9c28e51cf322
钉钉的token为:2fb3f47786fd17fa681818d7cc63e04c6cca52a16f862f12889e5eecf66e917a
1. 钉钉通知sonar质检结果
https://gitee.com/chejiangyi/dingding-sonar
#jenkins
sonar_project_id=${JOB_NAME}
sonarreport=$(curl -s http://localhost:8082/?projectname=${sonar_project_id})
dingding_token=a097b5e1fd594a9db2b60ec49c20ee1d6c5a17ddbb2098985c628dc020461553
curl -s "https://oapi.dingtalk.com/robot/send?access_token=${dingding_token}" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"markdown\",
\"markdown\": {
\"title\":\"sonar代码质量\",
\"text\": \"## sonar代码质量报告: \n
[sonar地址](http://sonar.oldxu.com:9000/dashboard?id=${sonar_project_id}) \n
${sonarreport} \n\"
}
}"
实现:
基于Jenkins自动化构建项目->并检测代码质量–>然后 通过钉钉通知质量 检测结果。
2. pipeline流水线介绍
pipeline流水线: 指每一个生产单位只专注处理某一个片段的工作,以提高工作效率及产量。
不在是点鼠标完成,而是需要编写代码才能完成的(固定的语法格式):
(1)脚本实现一个简单的流水线:
(2)使用gitlab中指定的文件来执行
pipeline {
agent any
//流水线开始
stages{
stage('下载代码') {
steps {
echo "get code ok"
}
}
stage('检测代码') {
steps {
echo "check code ok"
}
}
stage('编译代码') {
steps {
echo "build code ok"
}
}
stage('发布代码') {
steps {
echo "deploy code ok"
}
}
}
}
(3)使用流水线功能生成代码
3. pipeline实现java发布
pipeline {
agent any
//流水线开始
stages{
stage('下载代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '60a946a8-b4a7-434c-8769-0b8b86ab1c30', url: 'git@10.0.0.200:ops/hello-world-war.git']]])
}
}
/*java项目使用mvn、如果是非java项目,请使用sonar-scanner
stage('检测代码') {
steps {
sh '/usr/local/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectName=${JOB_NAME} \
-Dsonar.projectKey=${JOB_NAME} \
-Dsonar.sources=. \
-Dsonar.host.url=http://sonar.oldxu.com:9000 \
-Dsonar.login=422b4f1a205fa9b1888d8eecf012b338be4ea3ce'
}
}*/
stage('检测代码') {
steps {
sh 'mvn sonar:sonar \
-Dsonar.host.url=http://sonar.oldxu.com:9000 \
-Dsonar.login=d6028eee860737d6cdf746ca153e9c28e51cf322'
}
}
stage('编译代码') {
steps {
sh 'mvn package -Dmaven.test.skip=true'
}
}
stage('是否发布') {
steps {
input message: '是否发布', ok: '发布'
}
}
stage('发布代码') {
steps {
sh 'sh -x /scripts/java_deploy.sh'
}
}
}
}
4. pipline实现java发布
jenkins pipeline质量检测:
当检测不通过拒绝执行后续操作:
下面代码中的质量检测功能块的代码,因为需要获取代码检测结果,是否为ok,所以必须要在sonarqube进行配置:
pipeline {
agent any
//流水线开始
stages{
stage('下载代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '60a946a8-b4a7-434c-8769-0b8b86ab1c30', url: 'git@10.0.0.200:ops/hello-world-war.git']]])
}
}
/*java项目使用mvn、如果是非java项目,请使用sonar-scanner
stage('检测代码') {
steps {
sh '/usr/local/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectName=${JOB_NAME} \
-Dsonar.projectKey=${JOB_NAME} \
-Dsonar.sources=. \
-Dsonar.host.url=http://sonar.oldxu.com:9000 \
-Dsonar.login=422b4f1a205fa9b1888d8eecf012b338be4ea3ce'
}
}*/
stage('检测代码') {
steps {
withSonarQubeEnv('sonarqube-130'){
sh 'mvn sonar:sonar \
-Dsonar.host.url=http://sonar.oldxu.com:9000 \
-Dsonar.login=d6028eee860737d6cdf746ca153e9c28e51cf322'
}
}
}
stage('质量检测') {
steps {
script {
timeout(5) {
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "Sonarqube代码检查失败,failure: ${qg.status}"
}
}
}
}
}
stage('编译代码') {
steps {
sh 'mvn package -Dmaven.test.skip=true'
}
}
stage('是否发布') {
steps {
input message: '是否发布', ok: '发布'
}
}
stage('发布代码') {
steps {
sh 'sh -x /scripts/java_deploy.sh'
}
}
}
post {
success {
dingTalk accessToken: '2fb3f47786fd17fa681818d7cc63e04c6cca52a16f862f12889e5eecf66e917a', imageUrl: '', jenkinsUrl: 'http://10.0.0.201:8080/', message: '"构建成功"', notifyPeople: ''
}
failure {
dingTalk accessToken: '2fb3f47786fd17fa681818d7cc63e04c6cca52a16f862f12889e5eecf66e917a', imageUrl: '', jenkinsUrl: 'http://10.0.0.201:8080/', message: '"构建失败"', notifyPeople: ''
}
}
}
5. Jenkins分布式构建
Master / Slave模型、在Master上分配任务、然后可以在 Slave、或 Master上完成对应 的任务。
为什么 ?
1.定期集成、集成时间较长。 多个 slave来均摊 Master的压力。
2.由于项目种类繁多、需要不同的环境。 go、nodejs、python、java、android、ios、
能够将特定的任务运行在指定的节点上。
如何实现:
1、master与slave必须免密通讯。
2、slave节点 不需要安装Jenkins。
3、slave仅需要安装对应的环境即可 节点属性
4、slave要想真的能完全替代Master
4.1、slave要与web集群免密
4.2、slave要有执行上线的 脚本
Jenkins给节点推公钥,实现免密登录
(1)master与slave必须免密通讯
master(Jenkins)节点给slave节点推送公钥
(2) slave节点 不需要安装Jenkins
(3)slave仅需要安装对应的环境即可 节点属性
主节点有什么服务配置,从节点也要有相同的配置
安装yum -y install java maven 和 sonar-scanner
(4)slave要想真的能完全替代Master
slave要与web集群免密
ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7
ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.8
slave要有执行上线的 脚本
如何只在一个节点上运行(不是pipeline的项目):
在pipeline脚本中的内容是:
pipeline {
//agent any
// 接入这个内容
agent {lable 'slave-node1'}
6. Jenkins权限RBAC
基于 角色 的访问控制
全局权限: 控制用户能够操作jenkins哪些资源。
0.开启RBAC认证
1.创建角色、设定对应的权限
2.创建用户
3.将用户与角色关联
项目权限
- 1.创建项目角色、分配权限
- 2、将 用户关联至该项目角色即可
7. Jenkins 发布模式
(额外了解) ( Kubernetes上可以应用的非常的完美 )
- 蓝绿发布
- 滚动发布
- 金丝雀发布| 灰度发布