2023年7月7日发(作者:)
Jenkinspipeline部署远程tomcat项⽬说明:提⽰:这篇⽂章仅是记录⾃⼰成长路上的愚笨,不喜勿喷,同时也希望各路⼤神提出优秀的观点。谢谢!!问题描述:使⽤Jenkins⾃动化构建、部署远程服务器tomcat项⽬废话不多说,直接上代码:1. pipeline脚本def createVersion() { return new Date().format('yyyyMMddHHmmss') + "_${_ID}"}pipeline { //定义执⾏任务的代理 agent any //设置环境变量 environment { _version = createVersion() //
⼯作空间⽬录 workspace = pwd() //
需要修改此处,定义项⽬名称 project = "server-customer-api-1.0-SNAPSHOT" //
定义项⽬git地址 git_url = "192.168.0.193:9988/property/" //定义tomcat⽬录 tomcat_dir = "/home/web_programs/house_keeper/apache-tomcat-8.5.28/" //
定义项⽬的webroot⽬录 project_dir = "${tomcat_dir}webapps/" //定义项⽬的版本⽬录,⼀般不⽤更改 version_dir = "${workspace}/bak/" //resource⽂件地址,根据项⽬不同⽽更改 resource_dir = "${workspace}/server-customer-api/target/" }
options { timestamps() //禁⽤Jenkins同时执⾏多次该pipeline disableConcurrentBuilds() //pipeline运⾏超时时间 timeout(time: 20, unit: 'MINUTES') //保留最近历史构建记录的数量 buildDiscarder(logRotator(numToKeepStr: '5')) }
parameters { string(name: 'branch', defaultValue: 'master', description: '请输⼊将要构建的代码分⽀') choice(name: 'mode', choices: ['deploy', 'rollback'], description: '请选择发布或者回滚?') string(name: 'version_id', defaultValue: '0', description: '回滚时⽤,默认回滚到上⼀次构建,如需要回滚到更早构建,请输⼊对应构建ID') } stages { stage('拉取代码') { steps { echo 'Checkout' script { try { git branch: "${branch}", url: "${git_url}" } catch (err) { } catch (err) { echo "${err}" } } } } stage('定义版本管理脚本') { steps { script { try {sh '''# 《注意点⼀》cat > << 'EOF'#! /bin/bashcd ${version_dir}while true;doFILE_COUNT=$(ls *.war | wc -l)FILE_NAME=$(ls -lrt *.war | tail -n 1 | awk '{print $9}')if [[ $FILE_COUNT -gt 5 ]];then rm -rf $FILE_NAME;else break;fi;donecd -EOF''' } catch (err) { echo "${err}" } } } } stage('定义部署脚本') { steps { script { try {sh '''cat << 'EOF' > #! /bin/bash# 《注意点⼆》export JENKINS_NODE_COOKIE=dontKillMe# "创建编译主机上的版本⽬录"if [ ! -d "${version_dir}" ]; thenmkdir -p ${version_dir}fi# "将正在运⾏的代码同步到编译主机版本⽬录"jar -cvfM0 ${version_dir}${_version}.war -C ${project_dir}/ROOT .# "使版本⽬录保持五个版本历史"chmod 755 # 《注意点三》source ./# "将项⽬部署到服务器⽬录"cp ${resource_dir}${project}.war "${project_dir}"# 本地服务器重启cd ${tomcat_dir}bin# 《注意点四》source /home/admin/.bash_profile# 《注意点五》export BUILD_ID=dontKillMe# 《注意点六》./ -# 远程部署scp ${resource_dir}${project}.war admin@192.168.2.192:${project_dir}# 远程重启服务器ssh admin@192.168.2.192 << RScd /home/web_programs/house_keeper/apache-tomcat-8.5.28/bin# 《注意点七》./# 《注意点⼋》exitRSEOF''' } catch (err) { echo "${err}" } } } } } stage('部署') { //定义阶段执⾏的条件 when { environment name: 'mode', value: 'deploy' } steps { script { try { sh '''mvn clean package -=true -P test chmod 755 source ./''' } catch (err) { echo "${err}" } } } } stage('回滚') { when { environment name: 'mode', value: 'rollback' } steps { script { try { if (n_id == '0') { sh '''echo "选择回滚的版本是默认,将回滚到上次制品,回滚即将进⾏..." cd ${version_dir} file_name=`ls -lt *.war | tail -1 | awk '{print $9}'` # 拷贝⽂件到本地服务器地址 cp ${version_dir}${file_name} ${project_dir} # 本地服务器重启 cd ${tomcat_dir}/bin ./ cd - # 拷贝⽂件到远程服务器 scp ${version_dir}${file_name} admin@192.168.2.192:${project_dir} # 远程服务器重启ssh admin@192.168.2.192 << EOFcd ${tomcat_dir}/bin./EOF echo "==============" echo "项⽬已回滚完成!" echo "=============="''' } else { sh '''echo "选择回滚的版本是:${version_id},将回滚到 ${version_id} 的制品,回滚即将进⾏..." cd ${version_dir} # 拷贝⽂件到本地服务器地址 cp ${version_dir}${version_id} ${project_dir} # 本地服务器重启 cd ${tomcat_dir}/bin ./ cd - # 拷贝⽂件到远程服务器 scp ${version_dir}${version_id} admin@192.168.2.192:${project_dir} # 远程服务器重启ssh admin@192.168.2.192 << EOFcd ${tomcat_dir}/bin./EOF echo "项⽬回滚到 ${version_id} 完成!"''' } } catch (err) { echo "${err}" } } } } } }}2. tomcat重启脚本()#! /bin/bash# =======================================================# Author:yimeng# Date:2021-01-24# Description:tomcat服务器重启脚本# =======================================================#
定义项⽬⽂件名称readonly PROJECT_FILE=""PRG="$0"#
获取重启脚本路径PRGDIR=$(dirname ${PRG})#
获取tomcat服务器⽬录[ -z "${CATALINA_HOME}" ] && CATALINA_HOME=$( # shellcheck disable=SC2164 cd "${PRGDIR}"/.. >/dev/null pwd)#
执⾏前检查function check() { if [[ ! -f ${CATALINA_HOME}/bin/${PRG} ]]; then echo "not found script" exit 1 fi if [[ ! -x ${CATALINA_HOME}/bin/${PRG} ]]; then echo "the script is not executable" exit 1 fi if [[ ! -f ${CATALINA_HOME}/webapps/${PROJECT_FILE} ]]; then echo "not found web file" exit 1 fi}function restart() { rm -rf ${CATALINA_HOME}/webapps/ROOT # shellcheck disable=SC2006 PID=`ps -ef | grep -v grep | grep "${CATALINA_HOME}/bin/" | awk '{print $2}'` if [ "${PID}" = "" ]; then echo "tomcat is not active, next, to start" ${CATALINA_HOME}/bin/ echo "tomcat is started" else #${CATALINA_HOME}/bin/ sleep 3 kill -9 ${PID} ${CATALINA_HOME}/bin/ echo "tomcat is started" fi}check && restart注意点:1. 注意点⼀:带有重定向符的EOF⼀定要顶头写,否则结尾符号(暂且就这样叫吧)EOF不会起作⽤。并且 EOF带有单引号和不带有单引号的区别是:当带有单引号的EOF时,在EOF框定的脚本中的表达式不会解析,会原样输出,⽽不带单引号时,EOF框定的脚本中的表达式会被解析。2. 注意点⼆:注意点⼆和注意点五都是阻⽌Jenkins在pipeline执⾏完毕后会杀死⼦进程的情况发⽣,详细了解可以查看。如果在脚本执⾏前不加那句export BUILD_ID=dontkillme,可以在Jenkins启动的时候加上:-e=true这句话(我是使⽤war包启动的)。3. 注意点三:⼀定要使⽤source执⾏处理历史版本的shell脚本,否则执⾏会报 not found script 错误,⾄于sh、bash、./、source执⾏脚本的区别⼤家可以⾃⾏去度娘(fork、source、exec)。4. 注意点四:加载脚本的执⾏环境,以防⽌脚本执⾏的时候环境加载不全⽽导致某些命令报错(eg:not found command)5. 注意点六:此时就不可以使⽤source来执⾏了,⼀定要创建⼦进程来执⾏tomcat重启脚本(其实如果使⽤source来执⾏也不是不可以,只是tomcat重启脚本就需要改造了,⽽且会因服务器不同⽽造成脚本代码不同)。6. 注意点七:远程执⾏的命令就直接使⽤./来执⾏并且也不需要添加《注意点⼆》的代码了7. 注意点⼋:远程执⾏完⼀定要退出远程登录。因为是远程执⾏命令,所以知道为啥《注意点七》不⽤加那句话了吧。最后:好了,就先记录到这⼉吧,欢迎⼤家提出优秀的观点和意见。天天搬砖天天有,天天有砖天天搬。加油
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688704254a163868.html
评论列表(0条)