自动化发布-7.Gradle脚本编写

原文日期:2017-01-27


在前面我们使用Jenkins插件执行远程shell,其实我们可以通过不需要ssh插件,所有事情可以放在Gradle脚本中执行。这里我举个典型的案例。

通过Jenkins Gitlab插件可以实现获取代码仓库的项目源代码,并且编译项目源代码。可以在Gradle中引入ssh插件,让Gradle去执行应用重启发布。如下脚本。

buildscript {
  repositories {
    maven {
      url "http://192.168.1.88/nexus/content/groups/public/"
    }
  }
  dependencies {
    classpath 'com.oracle:ojdbc6:11.2.0.3'
    classpath 'mysql:mysql-connector-java:5.1.40'
    classpath "org.flywaydb:flyway-gradle-plugin:4.0.3"
    classpath 'org.hidetake:gradle-ssh-plugin:2.7.0'
  }
}

apply plugin: "org.flywaydb.flyway"
apply plugin: "org.hidetake.ssh"

ext {
	projectName="test"
	tomcatHome = "/app/tomcat/apache-tomcat.8.0.59"
	appHome = "/app/application"
	env = System.getProperty("env")
}
//项目打包
task process (type:Exec) {
	workingDir '.'
	commandLine 'tar','-zcf','test.tar.gz','test'
}

//加载properties属性文件
def loadProperties(){
	def configPath = "../deploy-project-config/sale-support/config/${env}/config.properties"
    def props = new Properties()
	def configFile = file(configPath)
    configFile.withInputStream{stream -> props.load(stream)}
    props
}
//设置flyway插件连接属性
flyway {
	Properties props = loadProperties()
    user = props.'conn1.jdbc.username'
    password = props.'conn1.jdbc.password'
    url = 'jdbc:oracle:thin:@(DESCRIPTION= (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(LOAD_BALANCE = no)(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = xszcsrv)(FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5))))'
	locations = ['filesystem:sql']
}

//设置远程服务器地址信息
remotes {
  webServer31 {
    host = '192.168.1.31'
    user = 'test'
    password = 'password'
	//identity = file('/root/.ssh/id_rsa') 
  }
  webServer32 {
    host = '192.168.1.32'
    user = 'test'
    password = 'password'
	//identity = file('/root/.ssh/id_rsa') 
  }
  webServer33 {
    host = '192.168.1.33'
    user = 'test'
    password = 'password'
	//identity = file('/root/.ssh/id_rsa') 
  }
}
//ssh插件设置,并定义方法
ssh.settings {  
  knownHosts = allowAnyHosts
  extensions.add transfer: { 
	//传输war文件
	println "transfer war file to /tmp"
	execute "rm -rf /tmp/${projectName}"
	put from: "deploy/${projectName}.tar.gz", into: '/tmp'
	//解压war文件
	println "unzip war file"
	execute ("tar -zxf /tmp/${projectName}.tar.gz -C /tmp",ignoreError: true)
	
	Properties props = loadProperties()
	//替换properties属性
	props.each{
		execute "sed -i 's#^${it.key}=.*#${it.key}=${it.value}#g'  /tmp/${projectName}/WEB-INF/classes/config.properties"
	}
	execute "sed -i 's#uatsales.evergrandelife.com.cn:8090/hd_server/#sales.evergrandelife.com.cn/#g'  /tmp/${projectName}/hd_client_pc/app/base/main.js"
	execute "sed -i 's#/hd_server/##' /tmp/${projectName}/src-js/XConfig.js"
	execute "sed -i 's#/hd_server##' /tmp/${projectName}/src-js/XConfig.js"
	execute "sed -i 's#/hd_server/##' /tmp/${projectName}/WEB-INF/classes/client/config-runtime.xml"
	execute "sed -i 's#/hd_server##' /tmp/${projectName}/WEB-INF/classes/client/config-runtime.xml"
	execute ("mv /tmp/${projectName}/app/${env}/* /share/resource/clientSync/app/",ignoreError: true)
  }
  extensions.add backup: {
	//备份模版工程
	println "begin to backup ${projectName}"
	def date = new Date().format('yyyyMMddHHmmss')  	
	execute ("cd ${appHome} && tar -zcf backup/${projectName}${date}.tar.gz ${projectName}",ignoreError: true)
	println "backup ${projectName} completed"
  }
  extensions.add shutdown: { 			
	//关闭tomcat服务
	println "shutdown tomcat server"
	def result = execute ("source ~/.bash_profile;sh ${tomcatHome}/bin/shutdown.sh")
	
	for(i in 1..24){
		execute ("sleep 5")
		result = execute ("ps -ef |grep tomcat |grep java|grep -v grep",ignoreError: true)
		if(result.size()==0){
		  break;
		}
	}
	assert result.size()==0
  }
  extensions.add startup: {
	//移动项目文件
	println "startup ${projectName}"
	execute "rm -rf ${appHome}/${projectName}"
	execute "mv /tmp/${projectName} ${appHome}/${projectName}"
	//添加软连接
	execute "ln -s /share/resource/webRoot ${appHome}/${projectName}/webRoot"
	//启动服务
	execute "source ~/.bash_profile;sh ${tomcatHome}/bin/startup.sh"
  }
  
  extensions.add check: {
	//检查启动状态
	def result
	for(i in 1..24){
		execute ("sleep 5")
		result = execute("curl -o /dev/null -s -w %{http_code}  'http://localhost:8090' ",ignoreError: true)
		if(result=='200'||result=='302'){
		  break;
		}
	}
	assert (result=='200'||result=='302')
	
	//删除临时目录项目文件
	execute("rm -rf /tmp/${projectName} && rm -f /tmp/${projectName}.tar.gz",ignoreError: true)
	//只保留30天备份发布文件
	execute("find /app/application/backup -mtime +30 -name '*' -exec rm -rf {} \\;",ignoreError: true)
  }
}

//定义发布任务
task deployServer << {
  ssh.run {
	session(remotes.webServer31) {
		execute "curl --insecure 'https://192.168.1.31/dynamic?upstream=backend&server=${remote.host}:8090&down='"
		execute "curl --insecure 'https://192.168.1.32/dynamic?upstream=backend&server=${remote.host}:8090&down='"
		transfer()
		shutdown()
		backup()
		startup()
		check()
		execute "curl --insecure 'https://192.168.1.31/dynamic?upstream=backend&server=${remote.host}:8090&up='"
		execute "curl --insecure 'https://192.168.1.32/dynamic?upstream=backend&server=${remote.host}:8090&up='"
	}
  }
  ssh.run {
	session(remotes.webServer32,remotes.webServer33) {
		execute "curl --insecure 'https://192.168.1.31/dynamic?upstream=backend&server=${remote.host}:8090&down='"
		execute "curl --insecure 'https://192.168.1.32/dynamic?upstream=backend&server=${remote.host}:8090&down='"
		transfer()
		//针对其他机器单独关闭定时器
		execute "sed -i 's#^ePolicyBatchSendSimpleTrigger=.*#ePolicyBatchSendSimpleTrigger=0 */1 * * * ? 2025#g'  /tmp/${projectName}/WEB-INF/classes/config.properties"
		execute "sed -i 's#^simpleTriggerqili=.*#simpleTriggerqili=0 */1 * * * ? 2025#g'  /tmp/${projectName}/WEB-INF/classes/config.properties"
		execute "sed -i 's#^policyPayConvertSimpleTrigger=.*#policyPayConvertSimpleTrigger=0 */1 * * * ? 2025#g'  /tmp/${projectName}/WEB-INF/classes/config.properties"
		execute "sed -i 's#^upPortraitPdfSimpleTrigger=.*#upPortraitPdfSimpleTrigger=0 */1 * * * ? 2025#g'  /tmp/${projectName}/WEB-INF/classes/config.properties"
		//execute "sed -i '/<list>/,/<\\/list>/c <list><\\/list>' /tmp/${projectName}/WEB-INF/classes/spring/spring-config-timmer.xml"
		shutdown()
		backup()
		startup()
		check()
		execute "curl --insecure 'https://192.168.1.31/dynamic?upstream=backend&server=${remote.host}:8090&up='"
		execute "curl --insecure 'https://192.168.1.32/dynamic?upstream=backend&server=${remote.host}:8090&up='"
	}
  }
}
复制代码

deploy.txt

猜你喜欢

转载自juejin.im/post/7032094780393947167