基于jenkins的CICD使用

基于jenkins的CICD使用前言:这篇文章主要讲一讲基于jenkins的CICD使用基于jenkins的CICD使用一、简介二、CICD流程图三、CICD效果四、jenkins编译方式五、新创建job六、pipeline脚本说明七、疑问解答与加群交流学习一、简介为了提升线下测试效率,缩短测试时间,提升提测代码质量,规范流程,缩短测试准备和执行时间,缩短问题定位时间,提供预测性指标,规范CICD流程,以提升整体团队效率。二、CICD流程图三、CICD效果大致可查看到的job如下:点击其中可查看具体编译情况:四、

大家好,又见面了,我是你们的朋友全栈君。

前言:这篇文章主要讲一讲基于jenkins的CICD使用

一、简介

为了提升线下测试效率,缩短测试时间,提升提测代码质量,规范流程,缩短测试准备和执行时间,缩短问题定位时间,提供预测性指标,规范CICD流程,以提升整体团队效率。

二、CICD流程图

在这里插入图片描述

三、CICD效果

大致可查看到的job如下:
在这里插入图片描述
点击其中可查看具体编译情况:
在这里插入图片描述

四、jenkins 编译方式

在这里插入图片描述

五、新创建job

1、进入视图页面,找到对应的视图列表,点击左侧new item 新建job
在这里插入图片描述
2、填写对应的job名称,选择流水线模式,并勾选添加到当前视图中,点击ok
在这里插入图片描述
3、填写对应的job描述信息,配置对应的项目构建历史保留数
在这里插入图片描述
4、配置对应的pipeline 脚本
在这里插入图片描述

六、pipeline 脚本说明

1、开发环境

  1. pipeline 脚本参考
pipeline { 

agent any
environment { 

PATH = "/usr/local/git/bin:/opt/maven/apache-maven-3.6.3/bin:/opt/java/jdk1.8.0_221/bin:/usr/local/python/bin:$PATH"
GIT_URL = "https://xxxx.git"
BRANCH = "dev"
API_DIR = "xxx"
PROVIDER_DIR = "xxx"
WEB_DIR = ”xxx" DEPLOY_SCRIPTS_PID = "xxxx" DEPLOY_SCRIPTS_PORT = "xxxx" DEPLOY_SCRIPTS_OMO = "xxxx" PKG_NAME = "xxx" PORT = "xxx" } ## 拉取代码 stages { stage('Check out') { steps { echo 'git clone code and checkout' echo '拉取代码到jenkins服务器' checkout([$class: 'GitSCM', branches: [[name: "*/${ 
BRANCH}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'scrm_gituser', url: "${ 
GIT_URL}"]]]) echo '拉取代码完成' echo '获取commit id' script { commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() } sh """ 
echo "获取到的commit id为: ${commit_id}"
""" } } ## 编译 stage('Build') { steps { echo 'package core' echo '打包core jar包' sh """
mvn -Dmaven.test.skip=true clean package
""" echo '打包core jar包完成' sh """
echo "打成的jar如下"
ls -al target/*.jar
""" } } ## 修改编译后的产物名称 stage('Change package name') { steps { echo 'change package name' echo '修改jar名字' withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_ssh_key', keyFileVariable: 'deploy_ssh_key', passphraseVariable: '', usernameVariable: 'deploy_ssh_user')]) { sh "sh  /opt/deploy/push_pkg.sh ${ 
env.JOB_NAME} ${ 
commit_id}" } } } ## 创建程序运行目录 stage('Create package dist dir') { steps { echo 'Create package dist dir' echo '创建部署jar包的路径' withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_ssh_key', keyFileVariable: 'deploy_ssh_key', passphraseVariable: '', usernameVariable: 'deploy_ssh_user')]) { sh """
ssh -i ${ 
deploy_ssh_key} ${ 
deploy_ssh_user}@xxxxx 'if [ ! -d "/opt/deploy/${env.JOB_NAME}" ];then mkdir -pv /opt/deploy/${env.JOB_NAME};fi'
""" } echo '创建部署jar包路径完成' echo '部署jar包的路径如下' withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_ssh_key', keyFileVariable: 'deploy_ssh_key', passphraseVariable: '', usernameVariable: 'deploy_ssh_user')]) { sh """
ssh -i ${ 
deploy_ssh_key} ${ 
deploy_ssh_user}@xxxxxx 'ls -al /opt/deploy/${env.JOB_NAME}'
""" } } } ## 推动包到目标服务器 stage('Push package') { steps { echo 'push package to servers' echo '推送jar包到目标服务器' withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_ssh_key', keyFileVariable: 'deploy_ssh_key', passphraseVariable: '', usernameVariable: 'deploy_ssh_user')]) { sh """
scp -i ${ 
deploy_ssh_key} target/*-${ 
commit_id}.jar ${ 
deploy_ssh_user}@xxxx:/opt/deploy/${ 
env.JOB_NAME}
""" } } } ## 推动运行脚本到目标服务器 stage('Push deploy scripts') { steps { echo 'push deploy scripts to servers' echo '推动运行jar包的脚本到目标服务器' withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_ssh_key', keyFileVariable: 'deploy_ssh_key', passphraseVariable: '', usernameVariable: 'deploy_ssh_user')]) { sh """
scp -i ${ 
deploy_ssh_key} /opt/deploy/${ 
DEPLOY_SCRIPTS}.sh ${ 
deploy_ssh_user}@xxxxx:/opt/deploy/${ 
env.JOB_NAME}
""" } } } ## 部署程序 stage('Deploy') { steps { echo 'deploy package to servers' echo '目标服务器上运行jar包' withCredentials([sshUserPrivateKey(credentialsId: 'jenkins_ssh_key', keyFileVariable: 'deploy_ssh_key', passphraseVariable: '', usernameVariable: 'deploy_ssh_user')]) { sh """
ssh -i ${ 
deploy_ssh_key} ${ 
deploy_ssh_user}@xxxxx sh  /opt/deploy/${ 
env.JOB_NAME}/${ 
DEPLOY_SCRIPTS}.sh ${ 
commit_id} ${ 
PROVIDER_PKG_NAME} ${ 
env.JOB_NAME} ${ 
PORT}
""" } echo '部署jar包完成' } } } ## 编译状态通知 post { always { withCredentials([usernamePassword(credentialsId: 'jenkins_api_user', passwordVariable: 'jenkins_pwd', usernameVariable: 'jenkins_user')]) { sh """python3 /opt/deploy/notification_jenkins.py ${ 
jenkins_user} ${ 
jenkins_pwd} ${ 
env.JOB_NAME}
"""
}
}
}
}
  1. 项目编译步骤
  • 配置环境变量
  • 拉取代码
  • 编译(打包和推送到私服)
  • 编译产物修改名称(用作部署指定版本)
  • 创建程序运行目录
  • 推送包到目标服务器
  • 推送脚本到目标服务器
  • 运行程序
  • 反馈编译状态结果
  1. 环境变量说明
  • GIT_URL  拉取项目仓库地址
  • BRANCH 分支名称
  • API_DIR 对应多模块中api模块目录名
  • PROVIDER_DIR 对应多模块中provider模块目录名
  • WEB_DIR 对应多模块中web模块目录名
  • DEPLOY_SCRIPT_PORT 对应运行程序中有开启端口服务脚本
  • DEPLOY_SCRIPT_PID 对应运行程序中没有开启端口服务脚本
  • DEPLOY_SCRIPT_OMO 对应OMO系统中运行脚本
  • PROVIDER_PKG_NAME 对应provider模块编译生成的jar包名称
  • WEB_PKG_NAME 对应web模块编译生成的jar包名称
  • OMO_PKG_NAME 对应omo项目core模块编译生成的jar包名称
  • FRONT_DIR 对应前端项目目录
  • FRONT_PKG_NAME 对应前端包名
  • FRONT_CONF 对应前端配置文件
  • DEPLOY_SCIPTS_FRONT 对应前端部署脚本

2、测试环境

  1. pipeline 脚本参考
pipeline { 

agent any
## 注入参数
parameters { 

choice(
description: '发布指定的分支\n说明:\ntest对应0.2.2版本\ntest1对应0.2.3版本\n默认值test',
name: 'BRANCH', 
choices: ['test', 'test1']
)
choice(
description: '发布到指定的节点\n说明:\ntest对应0.2.2版本\ntest1对应0.2.3版本\n默认值test-0.2.2',
name: 'DEPLOY_TO', 
choices: ['test-0.2.2', 'test-0.2.3']
)
}
## 注入环境变量
environment { 

PATH = "/usr/local/git/bin:/usr/local/src/apache-maven-3.6.3/bin:/usr/local/src/jdk1.8.0_221/bin:/usr/local/python/bin:$PATH"
GIT_URL = ""
BRANCH = "${params.BRANCH}"
NODE = "${params.DEPLOY_TO}"
PROVIDER_DIR = ""
DEPLOY_SCRIPTS = ""
PROVIDER_PKG_NAME = ""
PORT = ""
ENV = ""
}   
stages { 

## 拉取代码
stage('Check out') { 

steps { 

echo 'git clone code and checkout' 
echo '拉取代码到jenkins服务器'
checkout([$class: 'GitSCM', branches: [[name: "*/${BRANCH}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'scrm_gituser', url: "${GIT_URL}"]]])
echo '拉取代码完成'
echo '获取commit id'
script { 

commit_id = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
}
sh """ echo "获取到的commit id为: ${ 
commit_id}" """
}
}
## 编译
stage('Build') { 

steps { 

echo 'deply api to nexus'
echo '将api包打包并上传到nexus'
echo 'package core'
sh """ mvn -Dmaven.test.skip=true clean deploy """
echo '上传api包到私服完成'
echo '打包core jar包完成'
sh """ echo "打成的jar如下" ls -al ${PROVIDER_DIR}/target/*.jar """
}
}
## 修改名称
stage('Change package name') { 

steps { 

echo 'change package name'
echo '修改jar名字'
echo "${commit_id}"
ansiblePlaybook(
become: true, 
credentialsId: 'jenkins_ssh_key', 
disableHostKeyChecking: true, 
forks: 10, 
inventory: "/opt/deploy/test_scrm/inventory/${NODE}.yml", 
playbook: '/opt/deploy/test_scrm/playbook/deploy.yml', 
sudoUser: null, 
tags: 'backend_change_pkg',
extraVars: 
[ 
PROVIDER_DIR: "${PROVIDER_DIR}",
job_name: "${env.JOB_NAME}",
commit_id: "${commit_id}",
]
) 
} 
}
## 创建部署目录
stage('Create package dist dir') { 

steps { 

echo 'Create package dist dir'
echo '创建部署jar包的路径'
ansiblePlaybook(
become: true, 
credentialsId: 'jenkins_ssh_key', 
disableHostKeyChecking: true, 
forks: 10, 
inventory: "/opt/deploy/test_scrm/inventory/${NODE}.yml", 
playbook: '/opt/deploy/test_scrm/playbook/deploy.yml', 
sudoUser: null, 
tags: 'backend_create_pkg_dir',
extraVars: [ PROVIDER_DIR: "${env.JOB_NAME}"]
)
echo '创建部署jar包路径完成'
echo '部署jar包的路径如下'
ansiblePlaybook(
become: true, 
credentialsId: 'jenkins_ssh_key', 
disableHostKeyChecking: true, 
forks: 10, 
inventory: "/opt/deploy/test_scrm/inventory/${NODE}.yml", 
playbook: '/opt/deploy/test_scrm/playbook/deploy.yml', 
sudoUser: null, 
tags: 'backend_list_pkg_dir',
extraVars: [ PROVIDER_DIR: "${env.JOB_NAME}"]
)
}
}
## 推动jar包
stage('Push package') { 

steps { 

echo 'push package to servers'
echo '推送jar包到目标服务器'
ansiblePlaybook(
become: true, 
credentialsId: 'jenkins_ssh_key', 
disableHostKeyChecking: true, 
forks: 10, 
inventory: "/opt/deploy/test_scrm/inventory/${NODE}.yml", 
playbook: '/opt/deploy/test_scrm/playbook/deploy.yml', 
sudoUser: null, 
tags: 'backend_push_pkg',
extraVars: 
[ 
PROVIDER_DIR: "${PROVIDER_DIR}",
job_name: "${env.JOB_NAME}",
commit_id: "${commit_id}",
]
)   
}
}
## 推送运行脚本
stage('Push deploy scripts') { 

steps { 

echo 'push deploy scripts to servers'
echo '推动运行jar包的脚本到目标服务器'
ansiblePlaybook(
become: true, 
credentialsId: 'jenkins_ssh_key', 
disableHostKeyChecking: true, 
forks: 10, 
inventory: "/opt/deploy/test_scrm/inventory/${NODE}.yml", 
playbook: '/opt/deploy/test_scrm/playbook/deploy.yml', 
sudoUser: null, 
tags: 'backend_push_scripts',
extraVars: 
[ 
DEPLOY_SCRIPTS: "${DEPLOY_SCRIPTS}",
job_name: "${env.JOB_NAME}"
]
) 
}
}
## 部署
stage('Deploy') { 

steps { 

echo 'deploy package to servers'
echo '目标服务器上运行jar包'
ansiblePlaybook(
become: true, 
credentialsId: 'jenkins_ssh_key', 
disableHostKeyChecking: true, 
forks: 10, 
inventory: "/opt/deploy/test_scrm/inventory/${NODE}.yml", 
playbook: '/opt/deploy/test_scrm/playbook/deploy.yml', 
sudoUser: null, 
tags: 'backend_deploy_omo',
extraVars: 
[ 
DEPLOY_SCRIPTS: "${DEPLOY_SCRIPTS}",
job_name: "${env.JOB_NAME}",
commit_id: "${commit_id}",
PROVIDER_PKG_NAME: "${PROVIDER_PKG_NAME}",
ENV: "${ENV}",
PORT: "${PORT}"
]
)
echo '部署jar包完成'
}
}
}
 ## 发送通知
// post { 

//     always { 

//         withCredentials([usernamePassword(credentialsId: 'jenkins_api_user', passwordVariable: 'jenkins_pwd', usernameVariable: 'jenkins_user')]) { 

//             sh """python3 /opt/deploy/notification_jenkins.py ${jenkins_user} ${jenkins_pwd} ${env.JOB_NAME} // """
//         }
//     }
// }
}
  1. 项目编译步骤
  • 配置构建参数
  • 配置环境变量
  • 拉取代码
  • 编译(打包和推送到私服)
  • 编译产物修改名称(用作部署指定版本)
  • 创建程序运行目录
  • 推送包到目标服务器
  • 推送脚本到目标服务器
  • 运行程序
  • 反馈编译状态结果
  1. 环境变量说明
  • GIT_URL  拉取项目仓库地址
  • BRANCH 分支名称
  • API_DIR 对应多模块中api模块目录名
  • PROVIDER_DIR 对应多模块中provider模块目录名
  • WEB_DIR 对应多模块中web模块目录名
  • DEPLOY_SCRIPT_PORT 对应运行程序中有开启端口服务脚本
  • DEPLOY_SCRIPT_PID 对应运行程序中没有开启端口服务脚本
  • DEPLOY_SCRIPT_OMO 对应OMO系统中运行脚本
  • PROVIDER_PKG_NAME 对应provider模块编译生成的jar包名称
  • WEB_PKG_NAME 对应web模块编译生成的jar包名称
  • OMO_PKG_NAME 对应omo项目core模块编译生成的jar包名称
  • FRONT_DIR 对应前端项目目录
  • FRONT_PKG_NAME 对应前端包名
  • FRONT_CONF 对应前端配置文件
  • DEPLOY_SCIPTS_FRONT 对应前端部署脚本

3、新建项目需要修改的地方

  1. 拉取代码
    需要将git地址改成对应仓库的地址,对应分支改为正确的,修改的变量为GIT_URL,BRANCH
  2. 编译阶段
    如果是多模块需要将对应代码区块中的模块名改为对应的模块名称,需要改动三个环境变量, API_DIR | PROVIDER_DIR | WEB_DIR,有web服务添加WEB_DIR环境变量
  3. 部署阶段
# 如果是新scrm项目(无端口绑定),部署命令如下
ssh -i ${ 
deploy_ssh_key} ${ 
deploy_ssh_user}@192.168.0.245 sh  /opt/deploy/${ 
env.JOB_NAME}/${ 
DEPLOY_SCRIPTS_PID}.sh ${ 
commit_id} ${ 
PROVIDER_PKG_NAME} ${ 
env.JOB_NAME}
# 如果是新scrm项目(有端口绑定),部署命令如下
ssh -i ${ 
deploy_ssh_key} ${ 
deploy_ssh_user}@192.168.0.245 sh /opt/deploy/${ 
DEPLOY_SCRIPTS_PORT}.sh ${ 
commit_id} ${ 
PROVIDER_PKG_NAME}  ${ 
env.JOB_NAME} ${ 
PORT}
# 如果是omo项目,部署命令如下
ssh -i ${ 
deploy_ssh_key} ${ 
deploy_ssh_user}@192.168.0.245 sh /opt/deploy/${ 
DEPLOY_SCRIPTS_OMO}.sh ${ 
commit_id} ${ 
OMO_PKG_NAME}  ${ 
env.JOB_NAME} ${ 
PORT}

七、疑问解答与加群交流学习

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130530.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号