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脚本去掉了,因为含有部分敏感信息。

    由于主机等敏感信息来自于公司内网,因此上述脚本说了阉割处理。