Jenkins pipeline基本概述
1.Jenkins pipeline基本概述文章目录1.Jenkins pipeline基本概述1.1 什么是Pipeline1.2 为什么要使用Pipeline1.3 Pipeline核心概念2.Jenkins Pileline语法示例3.Jenkins pipeline初次体验4.Jenkins Pipeline部署java项目5.代码质量检测流程图6.代码质量扫描未通过则停止部署7.jenk
1.Jenkins pipeline基本概述
文章目录
1.1 什么是Pipeline
简单来说,就是运行在Jenkins上的工作框架,通过”代码的方式“将多个任务连接起来。
1.Pipeline能直观展示每个阶段的任务
2.Pipeline能直观展示每个阶段的执行时间
3.Pipeline能快速的定位哪个阶段的任务出现错误
1.2 为什么要使用Pipeline
之前传统的部署流程,都需要在图形界面进行点击,使用Pipeline能够实现每一步的自动化,不需要人为干预。
1.3 Pipeline核心概念
agent:节点
stage:阶段
steps:动作
2.Jenkins Pileline语法示例
pipeline基础语法如下:
pipeline { #所有代码包裹在pipeline{}层内
agent any #agent{}定义任务在哪台主机上运行。可以是any,none等
environment { #environment{}变量名称=变量值,用于定义环境变量,比如PATH路径等
host='test.com'
}
stages { #stages{}类似一个大项目的集合,主要用来包含所有stage子任务
stage('code'){ #stage{}类似一个项目中的单个任务,主要用来包含setup{}子层
steps { #setps{}用来实现具体执行的动作
echo "code for host $host"
}
}
stage('build'){
steps {
sh "echo $host"
}
}
}
}
pipeline是一种固定格式规范,必须遵守
3.Jenkins pipeline初次体验
pipeline流水线 实现 代码部署
jenkins中创建任务------输入名称-----点击流水线-----确定
脚本可以在jenkins中运行,也可以将脚本pipelinefile放在代码中,但代码中必须要有指定名字的文件
pipeline {
agent any
stages { //部署代码总合集
stage('获取代码'){
steps {
echo "git pull code"
}
}
stage('质量扫描'){
steps {
echo "git pull code"
}
}
stage('代码编译'){
steps {
echo "git pull code"
}
}
stage('是否部署'){
steps {
echo "git pull code"
}
}
stage('钉钉通知'){
steps {
echo "git pull code"
}
}
}
}
4.Jenkins Pipeline部署java项目
怎么写pipeline脚本?
在jenkins中点击配置-----流水线基本语法----示例步骤中选择---->写pipleline脚本方式
获取代码: 选择Check out---->填入gitlab中代码的地址----->点击左下角生成语法---->复制到steps中
质量扫描: 执行命令,用绝对路径
代码编译: 执行命令mvn clean package -Dmaven.test.skip=true
代码部署: 执行代码部署脚本
钉钉通知: 在流水线基本语法中,示例步骤中搜索dingding,然后生成语法
pipeline {
agent any
stages { //部署任务总合集
stage('获取代码'){
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '646f0911-1851-4924-aa5d-1e7c2450dfb6', url: 'git@gitlab.cwq.com:dev/hello-world-war.git']]])
}
}
stage('质量扫描'){
steps {
sh '/usr/local/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectName=${JOB_NAME} \
-Dsonar.projectKey=html \
-Dsonar.sources=. \
-Dsonar.host.url=http://sonar.cwq.com:9000 \
-Dsonar.login=c3696d71e21313a7493a00d817f5b3c5894e3558'
}
}
stage('代码编译'){
steps {
withSonarQubeEnv('sonarqube-130') { //此处是jenkins全局变量中sonarqube名称
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
}
stage('是否部署'){
steps {
input '是否确认部署'
}
}
stage('代码部署'){
steps {
sh 'sh -x /scripts/deploy_java.sh'
}
}
}
post {
success {
dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.cwq.com:8080', message: 'pipeline构建成功', notifyPeople: ''
}
failure {
dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.cwq.com:8080', message: 'pipeline构建失败', notifyPeople: ''
}
}
}
5.代码质量检测流程图
6.代码质量扫描未通过则停止部署
1.配置sonarqube的web回调接口,将扫描结果通知给jenkins服务器
Name:jenkins(不是固定的)
URL:http://admin:admin@123@jenkins.cwq.com:8080/sonarqube-webhook
URL :http://jenkins的用户名:jenkins的密码@jenkins的域名/sonarqube-webhook
在sonarqube中配置:配置---->web回调接口----->在第一个方框中写 jenkins---->第二个方框中写http://admin:admin@123@jenkins.cwq.com:8080/sonarqube-webhook ---->保存
pipeline脚本,增加了质量检测判断功能
pipeline {
agent any
stages { //部署任务总合集
stage('获取代码'){
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '646f0911-1851-4924-aa5d-1e7c2450dfb6', url: 'git@gitlab.cwq.com:dev/hello-world-war.git']]])
}
}
stage('质量扫描'){
steps {
withSonarQubeEnv('sonarqube-130') {
sh '/usr/local/sonar-scanner/bin/sonar-scanner \
-Dsonar.projectName=${JOB_NAME} \
-Dsonar.projectKey=${JOB_NAME} \
-Dsonar.sources=. \
-Dsonar.host.url=http://sonar.cwq.com:9000 \
-Dsonar.login=c3696d71e21313a7493a00d817f5b3c5894e3558'
}
}
}
stage('检测结果') {
steps {
script {
timeout(5) { //sonar webhook通知pipeline代码检测结果,未通过pipeline将会fail
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "Sonarqube代码检查失败,failure: ${qg.status}"
}
}
}
}
}
stage('代码编译'){
steps {
withSonarQubeEnv('sonarqube-130') {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
}
stage('是否部署'){
steps {
input '是否确认部署'
}
}
stage('代码部署'){
steps {
sh 'sh -x /scripts/deploy_java.sh'
}
}
}
post {
success {
dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.oldxu.com:8080', message: 'pipeline构建成功', notifyPeople: ''
}
failure {
dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.cwq.com:8080', message: 'pipeline构建失败', notifyPeople: ''
}
}
}
7.jenkins的分布式构建
1.加速不同环境的构建
2.降低master压力
如何实现:系统管理----->节点管理----->增加节点
#1.在master上添加slave节点信息
#2.master会发送一个jar包给slave
#3.slave要与master完全高度一致
java
git 免密登录 hosts域名解析
sonarqube客户端
web免密登录,推送脚本
配置
新建节点----->填写节点名称(slave-node1)----->确定
名称:node1
描述:可以不填
并发构件数:2
远程工作目录:/home/jenkins
标签:node1
用法:尽可能的使用这个节点
启动方式:Launch agent agents via SSH
主机:10.0.0.130 #jenkins机器要与这台机器免密
Credentials:jenkins的私钥
Host Key :Konwn hosts file Verification Strategy
#10.0.0.130机器中执行
yum install java maven git -y
mvn --version
jenkins机器执行
scp -rp /usr/local/sonar-scanner-4.0.0.1744-linux/ root@10.0.0.130:/usr/local/
10.0.0.130执行
ln -s /usr/local/sonar-scanner-4.0.0.1744-linux/ /usr/local/sonar-scanner
jenkins机器执行
将脚本推送到10.0.0.130
scp -rp /scripts/ root@10.0.0.130:/
10.0.0.130执行
生产秘钥
ssh-keygen
将私钥推送到web主机
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.7
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.8
gitlab控制台加10.0.0.130的私钥,一定要加,切记
10.0.0.130
vi /etc/hosts
10.0.0.110 gitlab.cwq.com
10.0.0.120 jenkins.cwq.com
10.0.0.130 sonar.cwq.com
#在jenkins控制台中,创建凭据---->新建凭据----->将10.0.0.130的公钥加进来
类型:SSH Username with private key
范围:全局
ID:
描述:slave-node1-10.0.0.130
Username:root
Private Key:10.0.0.130的公钥
指定运行的节点
在job中配置----->限制项目运行的节点----->填节点名称(node1)
pipeline脚本
pipeline {
//agent any
agent { label 'node1' }
stages { //部署任务总合集
stage('获取代码'){
steps {
//需要重新生成,选择新建的凭据(加的10.0.0.130的公钥凭据)
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '646f0911-1851-4924-aa5d-1e7c2450dfb6', url: 'git@gitlab.oldxu.com:dev/hello-world-war.git']]])
}
}
stage('质量扫描'){
steps {
withSonarQubeEnv('sonarqube-130') {
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=c3696d71e21313a7493a00d817f5b3c5894e3558'
}
}
}
stage('检测结果') {
steps {
script {
timeout(5) { //sonar webhook通知pipeline代码检测结果,未通过pipeline将会fail
def qg = waitForQualityGate()
if (qg.status != 'OK') {
error "Sonarqube代码检查失败,failure: ${qg.status}"
}
}
}
}
}
stage('代码编译'){
steps {
withSonarQubeEnv('sonarqube-130') {
sh 'mvn clean package -Dmaven.test.skip=true'
}
}
}
stage('是否部署'){
steps {
input '是否确认部署'
}
}
stage('代码部署'){
steps {
sh 'sh -x /scripts/deploy_java.sh'
}
}
}
post {
success {
dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.oldxu.com:8080', message: 'pipeline构建成功', notifyPeople: ''
}
failure {
dingTalk accessToken: '742394e99636ff32f0c8969cebf3887e8e737d6b8600acd0000385923fbeef88', imageUrl: '', jenkinsUrl: 'http://jenkins.oldxu.com:8080', message: 'pipeline构建失败', notifyPeople: ''
}
}
}
更多推荐
所有评论(0)