前言

前面我们介绍了Jenkins来发布项目通过nginx来展示流程,那里只是提供了一个简单的测试脚本,接下来呢介绍一下一个比较完善的发布脚本,该脚本可实现从gitlab服务器获取代码,打包,部署到WEB服务器,回滚到任意版本,一键回滚到上一版本。脚本可以当做模板来套用,屡试不爽,enjoy吧!!

详细内容

1、环境准备

首先,脚本发布一定是用普通用户www来发布。脚本放在www的用户家目录,每个WEB都创建www用户并且UID相同,web目录和权限一致,其次需要创建一些必须的文件目录。

  1. # mkdir -p /deploy/code/web-demo -p
  2. # mkdir -p /deploy/config/web-demo/base
  3. # mkdir -p /deploy/config/web-demo/other
  4. # mkdir -p /deploy/tar
  5. # mkdir -p /deploy/tmp
  6. # mkdir -p /opt/webroot
  7. # mkdir /webroot
  8. # chown -R www:www /deploy
  9. # chown -R www:www /opt/webroot
  10. # chown -R www:www /webroot

2、脚本内容

  1. #!/bin/bash
  2. # Description:本脚本主要完成的动作是部署、回滚,首先从我们私有的gitlab仓库拉下web-demo项目(http://192.168.56.11/web/web-demo.git),然后打包、压缩、scp到192.168.56.12:/webroot/、解压、然后最后通过nginx访问http://192.168.56.12/,查看结果。
  3. # Dir List 需要创建的目录
  4. # mkdir -p /deploy/code/web-demo -p
  5. # mkdir -p /deploy/config/web-demo/base
  6. # mkdir -p /deploy/config/web-demo/other
  7. # mkdir -p /deploy/tar
  8. # mkdir -p /deploy/tmp
  9. # mkdir -p /opt/webroot
  10. # mkdir /webroot
  11. # chown -R www:www /deploy
  12. # chown -R www:www /opt/webroot
  13. # chown -R www:www /webroot
  14.  
  15. #服务器节点:
  16. # Node List
  17. PRE_LIST="192.168.56.11" #gitlab地址
  18. GROUP1_LIST="192.168.56.12" #WEB服务IP地址
  19.  
  20. #回滚服务器列表
  21. ROLLBACK_LIST="192.168.56.11 192.168.56.12"
  22.  
  23. #日期和时间变量(时间不固定)
  24. # Date/Time Veriables
  25. LOG_DATE='date "+%Y-%m-%d"'
  26. LOG_TIME='date "+%H-%M-%S"'
  27.  
  28. #代码打包时间变量(固定时间)
  29. CDATE=$(date "+%Y-%m-%d")
  30. CTIME=$(date "+%H-%M-%S")
  31.  
  32. #变量
  33. # Shell Env
  34. #脚本名称
  35. SHELL_NAME="deploy_all.sh"
  36.  
  37. #脚本路径
  38. SHELL_DIR="/home/www/"
  39.  
  40. #脚本执行日志文件路径
  41. SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
  42.  
  43. #代码变量
  44. # Code Env
  45.  
  46. #项目名称,此名称是从gitlab服务器clone下来的代码目录
  47. PRO_NAME="web-demo"
  48.  
  49. #从gitlab服务器更新代码的目录
  50. CODE_DIR="/deploy/code/web-demo"
  51.  
  52. #项目配置文件
  53. CONFIG_DIR="/deploy/config/web-demo" 配置目录
  54.  
  55. #代码临时目录,从git 服务器获取到的代码放在这里打包在部署到WEB服务器
  56. TMP_DIR="/deploy/tmp"
  57.  
  58. #打包目录
  59. TAR_DIR="/deploy/tar"
  60.  
  61. #锁文件
  62. LOCK_FILE="/tmp/deploy.lock"
  63.  
  64. # 用法
  65. usage(){
  66. echo $"Usage: $0 {deploy | rollback [ list | version ]"
  67. }
  68.  
  69. #写日志
  70. writelog(){
  71. LOGINFO=$ #将参数作为日志输入
  72. echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO} " >> ${SHELL_LOG}
  73. }
  74.  
  75. #创建锁
  76. shell_lock(){
  77. touch ${LOCK_FILE}
  78. }
  79.  
  80. #判断
  81. url_test(){
  82. URL=$
  83. curl -s --head $URL | grep '200 OK'
  84. if [ $? -ne ];then
  85. shell_unlock;
  86. echo "test error" && exit;
  87. fi
  88. }
  89. #删除锁
  90. shell_unlock(){
  91. rm -f ${LOCK_FILE}
  92. }
  93. #拉取代码
  94. code_get(){
  95. writelog "code_get";
  96. cd $CODE_DIR && git pull
  97. cp -r ${CODE_DIR} ${TMP_DIR}/
  98. API_VERL=$(git show | grep commit | cut -d ' ' -f2)
  99. API_VER=$(echo ${API_VERL::})
  100. }
  101. #代码构建
  102. code_build(){
  103. echo code_guild
  104. }
  105. code_config(){
  106. writelog "code_config"
  107. /bin/cp -r ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}"
  108. PKG_NAME="${PRO_NAME}"_"$API_VER"_"${CDATE}-${CTIME}"
  109. cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
  110. }
  111. code_tar(){
  112. writelog "code_tar"
  113. cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
  114. writelog "${PKG_NAME}.tar.gz"
  115. }
  116. code_scp(){
  117. writelog "code_scp"
  118. for node in $PRE_LIST;do
  119. scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
  120. done
  121. for node in $GROUP1_LIST;do
  122. scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
  123. done
  124. }
  125. pre_deploy(){
  126. writelog "remove from cluster"
  127. ssh $PRE_LIST "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
  128. ssh $PRE_LIST "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
  129. }
  130. pre_test(){
  131. url_test "http://${PRE_LIST}/index.html"
  132. echo "d to cluster"
  133. }
  134. group1_deploy(){
  135. writelog "remove from cluster"
  136. for node in $GROUP1_LIST;do
  137. ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
  138. ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
  139. done
  140. scp ${CONFIG_DIR}/other/192.168.56.12.crontab.xml 192.168.56.12:/webroot/web-demo/crontab.xml
  141. }
  142. group1_test(){
  143. url_test "http://192.168.56.12/index.html"
  144. echo "add to cluster"
  145. }
  146. rollback_fun(){
  147. for node in $ROLLBACK_LIST;do
  148. ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/$1 /webroot/web-demo"
  149. done
  150. }
  151. rollback(){
  152. if [ -z $1 ];then
  153. shell_unlock;
  154. echo "Please input rollback version" && exit;
  155. fi
  156. case $1 in
  157. list)
  158. ls -l /opt/webroot/*.tar.gz
  159. ;;
  160. *)
  161. rollback_fun $1
  162. esac
  163. }
  164. main(){
  165. if [ -f $LOCK_FILE ];then
  166. echo "Deploy is running" && exit;
  167. fi
  168. DEPLOY_METHOD=$1
  169. ROLLBACK_VER=$2
  170. case $DEPLOY_METHOD in
  171. deploy)
  172. shell_lock;
  173. code_get;
  174. code_build;
  175. code_config;
  176. code_tar;
  177. code_scp;
  178. # pre_deploy;
  179. # pre_test;
  180. group1_deploy;
  181. group1_test;
  182. shell_unlock;
  183. ;;
  184. rollback)
  185. shell_lock;
  186. rollback $ROLLBACK_VER;
  187. shell_unlock;
  188. ;;
  189. *)
  190. usage;
  191. esac
  192. }
  193. main $1 $2

CI持续集成系列之(九)代码发布脚本模板书写的更多相关文章

  1. [ci]持续集成系列

    持续集成一直很蛋疼,感觉没底. 几个方面来写 1,搭建gitlab 配邮箱 域名等使之好用 2,搭建jenkins –yum,安装常见插件 3,搭建sonar,汉化 4,安装sonar-scanner ...

  2. CI持续集成

    CI持续集成 “我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先 ...

  3. 我的TDD实践---CI持续集成

    “我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先行,后理论专精 ...

  4. 物联网架构成长之路(47)-利用GitLab实现CI持续集成

    0.前言 前段时间,考虑到要练习部署一套CI/CD的系统.一开始考虑到Jenkins,随着这两天的了解,发现最新版的GitLab已经提供有CI/CD集成了.所以本次博客,干脆一步到位,直接用GitLa ...

  5. GitLab CI持续集成配置方案

    目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 GitLab持续集成所需环境 2.4 需要了解 ...

  6. [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接

    近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更多的人在说协同开发.敏捷开发.迭代开发.持续集成和单元测试这些拉风的术语.然而,大都是仅仅听到在说而已,国内 ...

  7. Ubuntu Docker 安装和配置 GitLab CI 持续集成

    相关文章: Ubuntu Docker 简单安装 GitLab 劈荆斩棘:Gitlab 部署 CI 持续集成 目的:在 Ubuntu 服务器上,使用 Docker 安装和配置 GitLab Runne ...

  8. CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接

    原文地址https://www.cnblogs.com/kevingrace/p/5651447.html 近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更 ...

  9. Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务

    Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...

随机推荐

  1. Tiny4412模式跳转

    ARM体系的CPU有以下7种工作模式: 1.用户模式(Usr):用于正常执行程序: 2.快速中断模式(FIQ):用于高速数据传输: 3.外部中断模式(IRQ):用于通常的中断处理: 4.管理模式(sv ...

  2. SSM-SpringMVC-11:SpringMVC中ParameterMethodNameResolver参数方法名称解析器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 或许曾经的我们也见过一种方式http://localhost:8080/项目名/后台servlet?actio ...

  3. Java 并行与并发

    Java 并行与并发 注意两个词:并行(Concurrent) 并发(Parallel) 并行:是逻辑上同时发生,指在某一个时间内同时运行多个程序 并发:是物理上同时发生,指在某一个时间点同时运行多个 ...

  4. Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921,本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...

  5. 关于Kafka配额的讨论(2)

    继续前一篇的讨论.前文中提到了两大类配额管理:基于带宽的以及基于CPU线程使用时间的.本文着重探讨基于CPU线程时间的配额管理. 定义 这类配额管理被称为请求配额(request quota),管理起 ...

  6. syncer.go

    package ) ) ) ].Key,)) )) }

  7. [CTF隐写]png中CRC检验错误的分析

    [CTF隐写]png中CRC检验错误的分析 最近接连碰到了3道关于png中CRC检验错误的隐写题,查阅了相关资料后学到了不少姿势,在这里做一个总结 题目来源: bugku-MISC-隐写2 bugku ...

  8. 【深度学习篇】---CNN和RNN结合与对比,实例讲解

    一.前述 CNN和RNN几乎占据着深度学习的半壁江山,所以本文将着重讲解CNN+RNN的各种组合方式,以及CNN和RNN的对比. 二.CNN与RNN对比 1.CNN卷积神经网络与RNN递归神经网络直观 ...

  9. 解决tomcat部署项目中碰到的几个问题

    在tomcat上部署项目并进行测试,经常会碰到各种问题.在不同的操作系统上部署,对问题的解决也会有一些差异. 1 发现问题 1.1 项目部署 先将项目达成war包,放到tomcat的webapps目录 ...

  10. python输出彩色字体

    Python终端如何输出彩色字体 实现过程:       终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.       转义序列是以ESC开头,即用\033来完成(ES ...