1、网络架构图如下

2、采用这种方案的原因

  1. 1、现网机器都在各个省机房内网,或者堡垒机内部。无法直接从公司总部ssh到各个现网机器
  2. 2、现网机器可以访问到公网。因此可以从公网下载制作的tar
  3. 3、每次升级现网项目实际通过vpn远程或者堡垒机方式登录。然后手工把tar包传输到对应机器上,操作繁琐,浪费大量时间

  

3、方案特点描述

  1. 1、采用gitlab作为公司私有代码托管仓库,和开发约定好采用tag标签作为发布版本
  2. 2jenkins机器有2台,一个master,一台slave。这里在jenkins上配置只使用slave机器干活。jenkins机器数量和本次实验并无直接关系。一台jenkins也行
  3. 3、各个地区安装有salt-minion。用于接收salt-master的指令从公网下载对应tar包,以及执行部署等。通过salt方式绕过vpn和堡垒机
  4. 4、公司总部是20MB的电信专线。各个地区现网机器处于移动机房、联通机房等。出于各个地区minion机器下载tar包网络稳定性的考虑。采用一台带公网IP阿里云ECS作为制品库机器
  5. 5ECS配置为2C/4G内存/200GB硬盘/100MB按流量付费的类型,安装nginx并配置文件下载服务,用于minion机器下载tar
  6. 6jenkins上配置项目为参数化构建,有2个参数,一个参数是代码版本,另一个参数是是否重启Tomcat的布尔值(涉及到java项目)
  7. 7、采用pipeline方式执行整个代码拉取构建和发布
  8. 8salve机器需要做免密钥登录salt-master机器执行命令或者脚本(出于安全考虑后期可以调整ssh执行命令权限)
  9. 9slave机器做免密钥登录公网阿里云机器。把构建编译打包后的tar包传输到制品库机器
  10. 10、本方案可以发布对应tag版本代码也可以发布最新代码
  11. 11、针对每个tar包配置一个job。比如我一个机器上部署2tomcat,每个tomcat下面有3war包。那么我在jenkins中创建6job。每个job对应一个war
  12. 12、关于tag包这里约定含有打标记的时间。比如v1226.1表示1226日打第一个tag

  

单个job配置截图如下

下面没有要设置的地方,后期如果有需要可以设置自动触发构建等

下面在头部定义变量。类似shell脚本

  1. def PKG_NAME="demores" 表示项目包的名字,也就是最终软链接到tomcatwebapps下面的名字
  2. def PROJ_NAME="GZDX-DDZ-PROD" 是地区名--业务名--生产 的缩写,GZDX表示广州电信机房,DDZ是业务名,是斗地主的缩写。PROD表示现网
  3.  
  4. def CODE_URL="git@10.0.2.61:game-group/demoddz.git" 是源码仓库地址
  5. def DIFF_URL="git@10.0.2.61:game-group/demoddz-diff.git" 是源码仓库开发维护的配置(比如一些各个地区各个项目的差异配置文件)
  6. def CONF_URL="git@10.0.2.61:game-group/demoddz-config.git" 是运维维护的配置文件,比如数据库连接方式配置文件等
  7.  
  8. def CRED_ID="412f328e-8b79-44f6-b6d8-2cad518475c2" groovy语法生成器拉取git代码部分生成的信任ID
  9.  
  10. def PROD_SERVER="47.110.xxx.xxx" 就是阿里云的ECS机器IP ,作为制品库
  11.  
  12. def MINION_ID="gzdx-ddz-web-01.hzdg.cn" 对应一个minionid

  

关于上面的def CRED_ID="412f328e-8b79-44f6-b6d8-2cad518475c2"

如果设置了deploy-key拉取gitlab代码。下面这里就是固定不变的了。用到多次的话可以把它设置成变量提取到前面方便引用

整个pipeline内容如下

  1. node{
  2. def PKG_NAME="dawnres"
  3. def PROJ_NAME="GZDX-TTMQ-PROD"
  4. def CODE_URL="git@10.0.2.61:game-group/DawnEDUEPGGame.git"
  5. def DIFF_URL="git@10.0.2.61:game-group/DawnEDUEPGGame-diff.git"
  6. def CONF_URL="git@10.0.2.61:game-group/DawnEDUEPGGame-config.git"
  7. def CRED_ID="412f328e-8b79-44f6-b6d8-2cad518475c2"
  8. def PROD_SERVER="47.110.xxx.xxx"
  9. def MINION_ID="gzdx-ddz-web-01.hzdg.cn"
  10.  
  11. stage("拉取源码"){
  12. echo "git pull src code ${PKG_NAME}"
  13. git credentialsId: "${CRED_ID}", url: "${CODE_URL}"
  14. sh '[ -n "${CODE_TAG}" ] && git checkout "${CODE_TAG}" || { echo -e "切换至指定的tag的版本,tag:"${CODE_TAG}" 不存在或为空,请检查输入的tag!" && exit 111; }'
  15. }
  16. stage("代码编译"){
  17. echo "ant build ${PKG_NAME}"
  18. sh "/data/app/ant/bin/ant"
  19. }
  20. stage("确定时间戳和其它变量") {
  21. script {
  22. def now = new Date()
  23. CTIME=now.format("yyyy_MMdd_HHmmss", TimeZone.getTimeZone('GMT+8'))
  24. println "${CTIME}"
  25. CODE_TAG="${CODE_TAG}".replaceAll("/", "_")
  26. TAR_NAME="${PKG_NAME}-${CTIME}-${CODE_TAG}"
  27. }
  28. }
  29. stage("拷贝编译后的产物"){
  30. sh "mkdir -p /deploy/${PROJ_NAME}/tmp/${TAR_NAME}/"
  31. sh "/bin/cp -a WebRoot/* /deploy/${PROJ_NAME}/tmp/${TAR_NAME}/"
  32. }
  33. stage("拉取差异文件"){
  34. echo "git pull src code ${PKG_NAME}-diff"
  35. git credentialsId: "${CRED_ID}", url: "${DIFF_URL}"
  36. sh "/bin/cp -a WebRoot/* /deploy/${PROJ_NAME}/tmp/${TAR_NAME}/"
  37. }
  38. stage("拉取配置文件"){
  39. echo "git pull src code ${PKG_NAME}-conf"
  40. git credentialsId: "${CRED_ID}", url: "${CONF_URL}"
  41. sh "/bin/cp -a WebRoot/* /deploy/${PROJ_NAME}/tmp/${TAR_NAME}/"
  42. }
  43. stage("打包目录"){
  44. echo "tar pgk"
  45. sh "cd /deploy/${PROJ_NAME}/tmp/ && tar cfz ${TAR_NAME}.tgz ${TAR_NAME}"
  46. }
  47. stage("传输包到制品库"){
  48. sh "ssh root@${PROD_SERVER}" + ' "' +"mkdir -p" +" /deploy/${PROJ_NAME}/"+'"'
  49. sh "scp /deploy/${PROJ_NAME}/tmp/${TAR_NAME}.tgz" + " root@${PROD_SERVER}:/deploy/${PROJ_NAME}/"
  50. }
  51. stage("minion下载tar包"){
  52. sh "/data/scripts/salt-download-pkg.sh"+ " ${MINION_ID}"+" ${PROJ_NAME}"+" ${TAR_NAME}"
  53. sh "echo hehe"
  54. }
  55. stage('现网环境部署确认'){
  56. input("执行现网环境部署")
  57. sh "/data/scripts/salt-deploy-pkg.sh"+" ${MINION_ID}"+" ${TAR_NAME}"+" ${RestartTomcat}"
  58. }
  59. }

  

如果发布选择的是origin/master需要做一个处理

打包后的文件名需要把斜线去掉或者替换掉,因为linux斜线就分割为目录了
这里是替换为下划线了最终的TAG_NAME就是下面这种

  1. demores-2018_1226_142912-origin_master

  

如果选择的是tag,比如是v1226.2版本 那么TAG_NAME就是下面这种

  1. demoweb-2018_1226_134619-v1226.2

  

主要业务是javaweb。开发这边jar包都是单独下载的。每次发布都是仅仅是编译class文件。因此采用ant

下面2个脚本都在jenkins的slave机器上

让对应的minion下载对应的tar包脚本

pipeline中可以直接写命令 由于括号太多的问题。这里就用了脚本方式调用salt远程执行命令

  1. [root@jenkins-slave-1 /data/scripts]# cat salt-download-pkg.sh
  2. #!/bin/bash
  3. SALT_MASTER="10.0.1.61"
  4. MINION_ID="$1"
  5. PROJ_NAME="$2"
  6. TAR_NAME="$3"
  7. PROD_SERVER_PORT="47.110.xxx.xxxx:18181"
  8. ssh root@${SALT_MASTER} " salt \"${MINION_ID}\" cmd.run \"wget -O /data/pkgroot/${TAR_NAME}.tgz http://${PROD_SERVER_PORT}/deploy/${PROJ_NAME}/${TAR_NAME}.tgz\" "
  9. [root@jenkins-slave-1 /data/scripts]#

  

下载的包tar包统一存放在/data/pkgroot/目录下

让对应minion机器执行部署操作脚本

下面是让对应的minion执行自己机器上/data/scripts/deploy.sh脚本

  1. [root@jenkins-slave-1 /data/scripts]# cat salt-deploy-pkg.sh
  2. #!/bin/bash
  3. SALT_MASTER="10.0.1.61"
  4. MINION_ID="$1"
  5. TAR_NAME="$2"
  6. RESTART_FLAG="$3"
  7. ssh root@${SALT_MASTER} " salt \"${MINION_ID}\" cmd.run \"/data/scripts/deploy.sh ${TAR_NAME} ${RESTART_FLAG} \" "
  8.  
  9. [root@jenkins-slave-1 /data/scripts]#

  

其中/data/scripts/deploy.sh是在minion机器上的脚本

  1. 因为各个地区现网项目标准化程度不够。
  2. 有的机器上有一个1tomcat
  3. 有的机器有2tomcat
  4. 这个脚本要具备通过包名判断这个包属于哪个tomcat的功能

  

比如下面2个tomcat。

4、一次代码发布到现网机器的过程

  1. 1jenkins页面点击参数化构建。选择一个版本。根据是否有配置文件或者class文件变更选择是否重启Tomcat
  2. 2slave机器根据版本号从gitlab拉取代码。执行编译操作。然后拉取配置文件
  3. 3、使用groovy代码生成一个时间戳变量 比如2018_1226_134619 表示20181226133619
  4. 4、根据pipeline框中定义好的包名,以及上面的时间戳变量,和参数构建的版本号变量构成本次打包的文件包名,比如demores-2018_1226_134619-v1226.2
  5. 5、把目录打成tgz的包demores-2018_1226_134619-v1226.2.tgz
  6. 6salve机器把这个包scp方式传输到阿里云机器(制品库)
  7. 7salve机器sshsalt-master机器执行命令让对应minion下载这个tar
  8. 8、设置一个交互式input选项是否执行最终部署。也可以登录机器手动执行deploy.sh脚本进行部署

  

minion机器上,也就是web机器上有4个脚本

通过文件名可以知道大概意思

  1. [root@router /data/scripts]# ll
  2. total 20
  3. -rwxr-xr-x 1 root root 671 Dec 28 15:32 clean_old_pkg.sh
  4. -rwxr-xr-x 1 root root 6667 Jan 10 01:56 deploy.sh
  5. -rwxr-xr-x 1 root root 796 Dec 25 20:24 restart_tomcat8_18080.sh
  6. -rwxr-xr-x 1 root root 800 Dec 25 20:23 restart_tomcat8_28080.sh
  7. [root@router /data/scripts]#

  

清除历史版本脚本

对于pkgroot目录。如果频繁升级。会积累很多目录
这里通过写了一个脚本,针对每一种项目包保留最近的10个版本
deploy在部署成功新版本之后会调用执行它删除老版本

  1. [root@router /data/pkgroot]# cat /data/scripts/clean_old_pkg.sh
  2. #!/bin/bash
  3. PKG_ROOT="/data/pkgroot"
  4.  
  5. PKGS=`ls $PKG_ROOT |awk '{print $NF}' |awk -F '[-]' '{print $1}' |sort -u`
  6. for item in ${PKGS[@]}
  7. do
  8. #保留文件数
  9. ReservedNum=10
  10. date=$(date "+%Y%m%d-%H%M%S")
  11.  
  12. FileNum=$(ls -l $PKG_ROOT/ |grep $item | wc -l)
  13.  
  14. while(( $FileNum > $ReservedNum))
  15. do
  16. OldFile=$(ls -rt $PKG_ROOT/ |grep $item | head -1)
  17. echo $date "Delete File:" ${PKG_ROOT}/$OldFile
  18. rm -rf ${PKG_ROOT}/$OldFile
  19. let "FileNum--"
  20. done
  21. done
  22.  
  23. [root@router /data/pkgroot]#

  

重启tomcat的脚本

  1. [root@router /data/scripts]# cat restart_tomcat8_18080.sh
  2. #!/bin/sh
  3. TOMCAT_SERVICE=tomcat8_18080
  4. TOMCAT_PATH=/data/app/tomcat8_18080/bin
  5.  
  6. echo "TOMCAT_PATH is $TOMCAT_PATH"
  7.  
  8. PID=`ps aux | grep "${TOMCAT_PATH}" | grep java | awk '{print $2}'`
  9.  
  10. if [ -n "$PID" ]; then
  11. echo "Will kill tomcat: $PID"
  12. systemctl stop ${TOMCAT_SERVICE}
  13. sleep 6
  14. else echo "No Tomcat Process $PID"
  15. fi
  16.  
  17. PID2=`ps aux | grep "${TOMCAT_PATH}" | grep java | awk '{print $2}'`
  18.  
  19. if [ -n "$PID2" ]; then
  20. kill -9 $PID2
  21. echo "Try to kill $PID2"
  22. else echo "No Tomcat Process $PID2"
  23. fi
  24.  
  25. #startup tomcat service
  26.  
  27. systemctl start ${TOMCAT_SERVICE}
  28.  
  29. sleep 3
  30.  
  31. PID=`ps aux | grep "${TOMCAT_PATH}" | grep java | awk '{print $2}'`
  32. if [ -n "$PID" ]; then
  33. echo "Restart tomcat successfully!"
  34. else
  35. echo "Fail to startup tomcat"
  36. exit 1
  37. fi
  38. [root@router /data/scripts]#

  

deploy.sh脚本
写的不够优雅。有待优化

  1. [root@router /data/scripts]# cat deploy.sh
  2. #!/bin/bash
  3. TAR_NAME=$1
  4. RESTART_FLAG=$2
  5. PKG_ROOT="/data/pkgroot"
  6. WEB_ROOT_1=/data/app/tomcat8_18080/webapps
  7. WEB_ROOT_2=/data/app/tomcat8_28080/webapps
  8.  
  9. #定义包的数组,用于判断传过来的包名是否在这个机器上
  10. pkg_arr=("dawnweb" "dawnvideo" "dawnres")
  11.  
  12. #用于判断包在哪个tomcat中,注意2个tomcat的包不能有重名的。否则无法判断属于哪个tomcat
  13. pkg_arr_1=("dawnweb")
  14. pkg_arr_2=("dawnvideo" "dawnres")
  15.  
  16. #如果tomcat2不存在,数组2写为空即可,如下所示
  17. #pkg_arr_2=()
  18.  
  19. #重启对应的tomcat的脚本
  20. restart_tomcat_1=/data/scripts/restart_tomcat8_18080.sh
  21. restart_tomcat_2=/data/scripts/restart_tomcat8_28080.sh
  22.  
  23. #清除过期历史版本脚本
  24.  
  25. clean_old_pkg="/data/scripts/clean_old_pkg.sh"
  26.  
  27. #定义是否重启数组,用于判断是否重启
  28. restart_arr=("true" "false")
  29.  
  30. #Shell Env
  31. SHELL_NAME="deploy.sh"
  32. SHELL_DIR="/data/scripts/"
  33.  
  34. #如果第一个参数传递的是list,那么列出这个目录所有文件
  35. #pre check
  36. if [ "${TAR_NAME}" == "list" ];then
  37. echo "hehe"
  38. echo "${TAR_NAME}"
  39. ls -alh ${PKG_ROOT}/
  40. exit
  41. fi
  42.  
  43. #获取包名,比如dawnweb-2018-1226-v3.tgz经过下面处理得到dawnweb
  44. PKG_NAME=`echo ${TAR_NAME} | awk -F '[-]' '{print $1 }'`
  45.  
  46. #定义锁,shell lock,一种项目包一个锁,方便多个不同项目包并行执行
  47. LOCK_FILE="/tmp/deploy_${PKG_NAME}.lock"
  48. #定义日志,shell log,一种项目包一个执行日志
  49. SHELL_LOG="/var/log/deploy_${PKG_NAME}.log"
  50.  
  51. #调用清除脚本,清除老版本项目包
  52. clean_old_pkg_version(){
  53. /bin/bash "${clean_old_pkg}"
  54. }
  55.  
  56. #脚本使用方式,这里没用到,预留着
  57. usage(){
  58. echo $"Usage: $0 { tar_version restart_flag }"
  59. }
  60.  
  61. #写日志
  62. writelog(){
  63. LOGINFO=$1
  64. echo `date "+%Y-%m-%d"` `date "+%H-%M-%S"` " : ${SHELL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
  65. }
  66.  
  67. #加锁,这里用不到
  68. shell_lock(){
  69. touch ${LOCK_FILE}
  70. }
  71.  
  72. #解锁,这里用不到
  73. shell_unlock(){
  74. rm -f ${LOCK_FILE}
  75. }
  76.  
  77. #定义重启对应tomcat的方法
  78. restart_script_1(){
  79. echo "running restart_tomcat_script_1"
  80. writelog "running restart_tomcat_script_1"
  81. /bin/bash ${restart_tomcat_1}
  82. echo "restart_tomcat_script_1 done ok"
  83. writelog "restart_tomcat_script_1 done ok"
  84. }
  85.  
  86. restart_script_2(){
  87. echo "running restart_tomcat_script_2"
  88. writelog "running restart_tomcat_script_2"
  89. /bin/bash ${restart_tomcat_2}
  90. echo "restart_tomcat_script_2 done ok"
  91. writelog "restart_tomcat_script_2 done ok"
  92. }
  93.  
  94. #判断重启标志位是否为空以及是否在数组中,如果不在就退出
  95. restart_flag_check(){
  96. #判断变量是否为空,如果为空就退出
  97. if [ -z "${RESTART_FLAG}" -o -z "${TAR_NAME}" ]; then
  98. echo "restart_flag is empty"
  99. writelog "restart_flag is empty"
  100. exit 110
  101. fi
  102.  
  103. exist_flag=true
  104. for i in ${restart_arr[@]}
  105. do
  106. [ "$i" == "${RESTART_FLAG}" ] && exist_flag=false
  107. done
  108.  
  109. if ${exist_flag} ;then
  110. echo "restart_flag not right"
  111. writelog "restart_flag not right"
  112. exit 111
  113. fi
  114. }
  115.  
  116. #判断项目包的变量是否在数组中,如果不在就退出
  117. pkg_flag_check(){
  118. exist_flag=true
  119. for i in ${pkg_arr[@]}
  120. do
  121. [ "$i" == "${PKG_NAME}" ] && exist_flag=false
  122. done
  123.  
  124. if ${exist_flag} ;then
  125. echo "pkg not in array"
  126. writelog "pkg not in array"
  127. exit 112
  128. fi
  129. }
  130.  
  131. #判断TAR包文件是否存在,如果不存在就退出
  132. tar_check(){
  133. echo "running tar check"
  134. if [ ! -f "${PKG_ROOT}"/${TAR_NAME}.tgz -a ! -d "${PKG_ROOT}"/${TAR_NAME} ];then
  135. echo "${PKG_ROOT}/${TAR_NAME}.tgz and ${PKG_ROOT}/${TAR_NAME} not exist!"
  136. writelog "${PKG_ROOT}/${TAR_NAME}.tgz and ${PKG_ROOT}/${TAR_NAME} not exist!"
  137. exit 113
  138. fi
  139. }
  140.  
  141. #判断项目包是在哪个webroot下面方法
  142. #如果数组2长度大于等于1,说明数组2存在,也就是第二个tomcat存在,需要判断项目包是否在数组2中,这里就不考虑是否有数组3了
  143.  
  144. pkg_owner_check(){
  145. pkg_arr_2_length=${#pkg_arr_2[@]}
  146. pkg_owner="tomcat_1"
  147. if [ "${pkg_arr_2_length}" -ge 1 ];then
  148. #获取数组长度
  149. #判断是否在组2里
  150. for i in ${pkg_arr_2[@]}
  151. do
  152. [ "$i" == "${PKG_NAME}" ] && pkg_owner="tomcat_2"
  153. done
  154. fi
  155. echo "pkg owner is:"$pkg_owner
  156. writelog "pkg owner is:"$pkg_owner
  157. }
  158.  
  159. #执行部署tar包,先解压,然后删除对应路径下软链接,创建新的软链接以及授权
  160. deploy_tar(){
  161. WEB_ROOT=$1
  162. echo "running deploy_tar"
  163. writelog "running deploy_tar"
  164. cd ${PKG_ROOT}/
  165. echo "cd success"
  166. pwd
  167. if [ ! -d "${TAR_NAME}" ]; then
  168. cd ${PKG_ROOT}/ && tar xfz ${TAR_NAME}.tgz && chown -R www.www * && rm -f ${TAR_NAME}.tgz
  169. cd ${WEB_ROOT}/ && rm -rf ${PKG_NAME} && ln -s ${PKG_ROOT}/${TAR_NAME} ${WEB_ROOT}/${PKG_NAME} && chown -R www.www *
  170. writelog "finished deploy_tar"
  171. else
  172. cd ${WEB_ROOT}/ && rm -rf ${PKG_NAME} && ln -s ${PKG_ROOT}/${TAR_NAME} ${WEB_ROOT}/${PKG_NAME} && chown -R www.www *
  173. writelog "finished deploy_tar"
  174. fi
  175. }
  176.  
  177. #部署完毕测试,这里没用到
  178. url_test(){
  179. URL=$1
  180. curl -s --head $URL | grep "200 OK"
  181. if [ $? -ne 0 ];then
  182. shell_unlock;
  183. echo "test error" && exit;
  184. fi
  185. }
  186.  
  187. #定义main函数开始---------------------#
  188.  
  189. main(){
  190. #运行监测
  191. clean_old_pkg_version
  192. restart_flag_check
  193. pkg_flag_check
  194. tar_check
  195. pkg_owner_check
  196.  
  197. #判断包在哪个tomcat,以及重启的flag是否是true,执行对应的动作
  198. if [ "${pkg_owner}" = "tomcat_1" -a "${RESTART_FLAG}" = true ];then
  199. shell_lock;
  200. writelog "deploy tomcat_1 and restart tomcat_1"
  201. echo "deploy tomcat_1 and restart tomcat_1"
  202. deploy_tar ${WEB_ROOT_1}
  203. restart_script_1
  204. shell_unlock;
  205. elif [ "${pkg_owner}" = "tomcat_1" -a "${RESTART_FLAG}" = false ];then
  206. shell_lock;
  207. echo "deploy tomcat_1 and not restart tomcat_1"
  208. writelog "deploy tomcat_1 and not restart tomcat_1"
  209. deploy_tar ${WEB_ROOT_1}
  210. shell_unlock;
  211. elif [ "${pkg_owner}" = "tomcat_2" -a "${RESTART_FLAG}" = true ];then
  212. shell_lock;
  213. echo "deploy tomcat_2 and restart tomcat_2"
  214. writelog "deploy tomcat_2 and restart tomcat_2"
  215. deploy_tar ${WEB_ROOT_2}
  216. restart_script_2
  217. shell_unlock;
  218. elif [ "${pkg_owner}" = "tomcat_2" -a "${RESTART_FLAG}" = false ];then
  219. shell_lock;
  220. echo "deploy tomcat_2 and not restart tomcat_2"
  221. writelog "deploy tomcat_2 and not restart tomcat_2"
  222. deploy_tar ${WEB_ROOT_2}
  223. shell_unlock;
  224. else
  225. usage
  226. echo "unknown error"
  227. writelog "unknown error"
  228. exit 1000
  229. fi
  230.  
  231. }
  232.  
  233. #定义main函数结束---------------------#
  234.  
  235. #执行main函数
  236. main
  237.  
  238. [root@router /data/scripts]#

  

脚本单独执行测试

传递list参数列出所有包
传递2个参数执行部署,第一个参数是包的名,第二个参数是是否重启的true或者false

  1. [root@router /data/scripts]# /data/scripts/deploy.sh list
  2. hehe
  3. list
  4. total 4.0K
  5. drwxr-xr-x 15 root root 4.0K Jan 10 02:02 .
  6. drwxr-xr-x 8 root root 86 Jan 10 02:01 ..
  7. drwxr-xr-x 7 www www 212 Dec 26 14:23 dawnres-2018_1226_142344-v1226.2
  8. drwxr-xr-x 7 www www 212 Dec 26 14:25 dawnres-2018_1226_142516-origin_master
  9. drwxr-xr-x 7 www www 212 Dec 26 14:26 dawnres-2018_1226_142629-v1226.2
  10. drwxr-xr-x 7 www www 212 Dec 26 14:28 dawnres-2018_1226_142827-v1226.2
  11. drwxr-xr-x 7 www www 212 Dec 26 14:29 dawnres-2018_1226_142912-origin_master
  12. drwxr-xr-x 7 www www 212 Dec 28 15:33 dawnres-2018_1228_153309-origin_master
  13. drwxr-xr-x 7 www www 212 Dec 28 15:35 dawnres-2018_1228_153517-origin_master
  14. drwxr-xr-x 7 www www 212 Dec 26 13:46 dawnweb-2018_1226_134619-v1226.2
  15. drwxr-xr-x 7 www www 212 Dec 26 13:50 dawnweb-2018_1226_134953-v1226.2
  16. drwxr-xr-x 7 www www 212 Dec 26 13:51 dawnweb-2018_1226_135114-origin_master
  17. drwxr-xr-x 7 www www 212 Dec 26 13:59 dawnweb-2018_1226_135939-origin_master
  18. drwxr-xr-x 7 www www 212 Dec 26 14:15 dawnweb-2018_1226_141510-v1226.2
  19. drwxr-xr-x 8 www www 227 Dec 26 14:15 dawnweb-2018_1226_141549-origin_master
  20. [root@router /data/scripts]# ll /data/app/tomcat8_18080/webapps/
  21. total 0
  22. lrwxrwxrwx 1 www www 52 Jan 10 01:57 dawnweb -> /data/pkgroot/dawnweb-2018_1226_141549-origin_master
  23. drwxr-xr-x 2 www www 42 Dec 24 16:24 ROOT
  24.  
  25. 执行部署,不重启tomcat
  26. [root@router /data/scripts]# /data/scripts/deploy.sh dawnweb-2018_1226_141510-v1226.2 false
  27. running tar check
  28. pkg owner is:tomcat_1
  29. deploy tomcat_1 and not restart tomcat_1
  30. running deploy_tar
  31. cd success
  32. /data/pkgroot
  33. [root@router /data/scripts]# ll /data/app/tomcat8_18080/webapps/
  34. total 0
  35. lrwxrwxrwx 1 www www 46 Jan 10 02:16 dawnweb -> /data/pkgroot/dawnweb-2018_1226_141510-v1226.2
  36. drwxr-xr-x 2 www www 42 Dec 24 16:24 ROOT
  37. [root@router /data/scripts]#

  

jenkins页面执行

一些执行日志输出

补充部分

创建好job有时候会遇到配置完毕项目。但是看不到tag
没关系。点击开始构建之后它会默认拉取最新的origin/master代码并执行
可以在最后的是否执行最终部署点击放弃。后期再执行参数化构建就可以看到tag了

下面的红色箭头标错位置了。应该指向上面

salt+jenkins+gitlab+ecs构建公司部署平台的更多相关文章

  1. 解放双手 | Jenkins + gitlab + maven 自动打包部署项目

    前言 记录 Jenkins + gitlab + maven 自动打包部署后端项目详细过程! 需求背景 不会偷懒的程序员不是好码农,传统的项目部署,有时候采用本地手动打包,再通过ssh传到服务器部署运 ...

  2. Jenkins+Git+Maven构建并部署war包到tomcat

    主要思路:1.jenkins从git中拉取项目源码:jenkins使用maven构建并将生成的war部署到tomcat容器下. 环境:Centos7.Maven3.5.3.git(单机) 安装Git ...

  3. 利用jenkins实现自动构建、部署,提升团队开发效率

    一大早就被群里的同学刷银川下雪的消息,看着我都发冷,突觉一阵凉风裹身,是不是该考虑秋裤了. 偏离主题,正文走起...... 使用jenkins目标:利用其结合maven完成自动构建,并部署到tomca ...

  4. Jenkins+Git+Maven构建并部署springboot(构建多模块中的单个模块)

    主要思路:1.jenkins从git中拉取项目源码:jenkins使用maven构建并将生成的jar包通过shell脚本启动. 环境:环境:Centos7.Maven3.5.3.git(单机) 准备工 ...

  5. 【Gitlab+Jenkins+Ansible】构建自动化部署

    说明: Gitlab.Jenkins.生产服务器.测试服务器上都需要安装Git. 一.安装Gitlab 1.主机配置 IP: 10.10.10.105 OS: CentOs7. Gitlab版本:gi ...

  6. 使用Jenkins+gitlab自动化构建时排除分支

    我们的目的是gitlab上的代码有变动时会自动向Jenkins发送web钩子请求,触发指定的动作: 但默认情况下,所有分支(如测试环境和预生产)的代码有变动时都会触发,此时可以在Jenkins的项目设 ...

  7. 搭建Jenkins自动化持续构建和部署系统

    什么是Jenkins? Jenkins是一个持续集成和持续交付的java应用程序,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测试和部署技术.简单得说就是一款自动化构建测试和部署的 ...

  8. 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知

    一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...

  9. 【Devops】【docker】【CI/CD】3.Jenkins+GitLab+docker+springboot 实现自动化部署

    ==================================================================================================== ...

随机推荐

  1. .net webService保存全局变量中

    遇到坑,然后找到解决方案,我就习惯做个记录. 情景:通过webservice调用一个第三方的库,在初始化第三方库的时候需要花费较长时间 目的:希望通过初始化一次,缓存下来,下次直接调用,而不必每次初始 ...

  2. 用几句话说一说CMake add_dependencies & target_link_libraries的使用区别

    简单说一说前两天学习使用CMake解决链接问题时遇到的一个问题. 对于编译时遇到的依赖问题,很多时候我们只需要一句target_link_libraries就可以搞定. 但是CMake还有另外一个co ...

  3. shell练习题1

    需求如下: 写一个shell脚本,把10.0.1.0/24网段在线的ip列出来. 参考解答如下 方法1 #!/bin/bash ip="10.0.1." for i in $(se ...

  4. 区间dp之四边形不等式优化详解及证明

    看了那么久的四边形不等式优化的原理,今天终于要写一篇关于它的证明了. 在平时的做题中,我们会遇到这样的区间dp问题 它的状态转移方程形式一般为dp[i][j]=min(dp[i][k]+dp[k+1] ...

  5. Shiro-Spring 授权操作

    Subject进行Shiro的授权操作,首先委托给Security Manager,在由Security Manager 委托给Authenticator,由Authenticator授权器进行真正的 ...

  6. 剑指offer用位运算实现两个数相加,及python相关的位操作

    题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 代码: # -*- coding:utf-8 -*-class Solution:    def Add(self ...

  7. pytorch预训练

    Pytorch预训练模型以及修改 pytorch中自带几种常用的深度学习网络预训练模型,torchvision.models包中包含alexnet.densenet.inception.resnet. ...

  8. Oil Deposit

    题目描述: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. ...

  9. wpf 命令

    上图为命令的 示例

  10. 消息 xxx,级别 16,状态 x,过程 sp_executesql,第 x 行 过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'。

    消息 xxx,级别 16,状态 x,过程 sp_executesql,第 x 行 过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'. 原来的语句: ) s ...