Jenkins屏蔽windows、Linux slave差异
背景及目标
由于未能解决前端在linux上的打包问题,临时采用在slave(windows)上编译前端vue代码,再和master(linux)整合。如果使用jenkins pipeline作业,就可以在一个作业里整合全部的操作。
环境说明
- Centos7
- Jenkins 2.150.1
- windows 10
前置工作
- 配置windows slave,使用JNLP连接
pipeline脚本
node("master"){
stage("环境清理"){
sh '''
if [ ! -d "${WORKSPACE}/../${JOB_NAME}_support" ];then
mkdir -p ${WORKSPACE}/../${JOB_NAME}_support
fi;
if [ ! -f "${WORKSPACE}/../${JOB_NAME}_support/dist.tgz" ];then
echo "dist.tgz不存在!"
else
rm -rf ${WORKSPACE}/../${JOB_NAME}_support/dist*
echo "删除dist.tgz成功!"
fi
'''
}
}
node("windows-slave"){
stage('拉取代码') { // for display purposes
// Get some code from a GitHub repository
checkout([$class: 'GitSCM', branches: [[name: "*/master"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c087b96d-3c22-4701-a51b-68a38b74d1a1', url: 'http://xxx-Front.git']]])
}
stage('npm打包'){
bat '''![](https://yeyouluo.github.io/post-images/1591453418202.png)
cd %WORKSPACE%
rd /s/q dist
npm run build
'''
}
stage('传输部署包'){
bat '''
cd %WORKSPACE%
tar zcvf dist.tgz dist
scp dist.tgz hadoop@slave105:/home/hadoop/base/jenkins/data/workspace/%JOB_NAME%_support
'''
}
}
node("master"){
stage('拉取代码') { // for display purposes
// Get some code from a GitHub repository
checkout([$class: 'GitSCM', branches: [[name: "*/6s"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c087b96d-3c22-4701-a51b-68a38b74d1a1', url: 'xxx-backend.git']]])
}
stage('整合前端文件') { // for display purposes
sh '''
cd ${WORKSPACE}/../${JOB_NAME}_support
tar zxvf dist.tgz
if [ ! -d "${WORKSPACE}/web/war/src/main/webapp" ];then
mkdir -p ${WORKSPACE}/web/war/src/main/webapp
fi;
if [ -d "${WORKSPACE}/web/war/src/main/webapp/static" ];then
rm -rf ${WORKSPACE}/web/war/src/main/webapp/static
fi;
if [ -f "${WORKSPACE}/web/war/src/main/webapp/index.html" ];then
rm -f ${WORKSPACE}/web/war/src/main/webapp/index.html
fi;
mv ${WORKSPACE}/../${JOB_NAME}_support/dist/* ${WORKSPACE}/web/war/src/main/webapp
'''
}
stage('编译打包') { // for display purposes
// Run the maven build
if (isUnix()) {
sh '''
mvn clean package -DskipTests=true
'''
} else {
bat("mvn clean package -DskipTests=true")
}
}
}
node("linux-slave-tomcat"){
stage('停止tomcat') { // for display purposes
}
}
node("master"){
stage('替换war') { // for display purposes
}
}
node("master"){
stage('启动tomcat') { // for display purposes
}
}
思路
- 在windows slave上执行npm打包,将打包文件压缩成tarball(使用Cygwin环境命令),并上传到master jenkins data目录下(job平级目录创建了一个
_support
目录,tarball放到这个目录下) - 在master主机上打包后端项目,并和前端部署脚本做整合
- 重启tomcat脚本去掉了,因为含有部分敏感信息。
由于主机等敏感信息来自于公司内网,因此上述脚本说了阉割处理。