CI持续集成系列之(九)代码发布脚本模板书写
前言
前面我们介绍了Jenkins来发布项目通过nginx来展示流程,那里只是提供了一个简单的测试脚本,接下来呢介绍一下一个比较完善的发布脚本,该脚本可实现从gitlab服务器获取代码,打包,部署到WEB服务器,回滚到任意版本,一键回滚到上一版本。脚本可以当做模板来套用,屡试不爽,enjoy吧!!
详细内容
1、环境准备
首先,脚本发布一定是用普通用户www来发布。脚本放在www的用户家目录,每个WEB都创建www用户并且UID相同,web目录和权限一致,其次需要创建一些必须的文件目录。
- # mkdir -p /deploy/code/web-demo -p
- # mkdir -p /deploy/config/web-demo/base
- # mkdir -p /deploy/config/web-demo/other
- # mkdir -p /deploy/tar
- # mkdir -p /deploy/tmp
- # mkdir -p /opt/webroot
- # mkdir /webroot
- # chown -R www:www /deploy
- # chown -R www:www /opt/webroot
- # chown -R www:www /webroot
2、脚本内容
- #!/bin/bash
- # 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/,查看结果。
- # Dir List 需要创建的目录
- # mkdir -p /deploy/code/web-demo -p
- # mkdir -p /deploy/config/web-demo/base
- # mkdir -p /deploy/config/web-demo/other
- # mkdir -p /deploy/tar
- # mkdir -p /deploy/tmp
- # mkdir -p /opt/webroot
- # mkdir /webroot
- # chown -R www:www /deploy
- # chown -R www:www /opt/webroot
- # chown -R www:www /webroot
- #服务器节点:
- # Node List
- PRE_LIST="192.168.56.11" #gitlab地址
- GROUP1_LIST="192.168.56.12" #WEB服务IP地址
- #回滚服务器列表
- ROLLBACK_LIST="192.168.56.11 192.168.56.12"
- #日期和时间变量(时间不固定)
- # Date/Time Veriables
- LOG_DATE='date "+%Y-%m-%d"'
- LOG_TIME='date "+%H-%M-%S"'
- #代码打包时间变量(固定时间)
- CDATE=$(date "+%Y-%m-%d")
- CTIME=$(date "+%H-%M-%S")
- #变量
- # Shell Env
- #脚本名称
- SHELL_NAME="deploy_all.sh"
- #脚本路径
- SHELL_DIR="/home/www/"
- #脚本执行日志文件路径
- SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
- #代码变量
- # Code Env
- #项目名称,此名称是从gitlab服务器clone下来的代码目录
- PRO_NAME="web-demo"
- #从gitlab服务器更新代码的目录
- CODE_DIR="/deploy/code/web-demo"
- #项目配置文件
- CONFIG_DIR="/deploy/config/web-demo" 配置目录
- #代码临时目录,从git 服务器获取到的代码放在这里打包在部署到WEB服务器
- TMP_DIR="/deploy/tmp"
- #打包目录
- TAR_DIR="/deploy/tar"
- #锁文件
- LOCK_FILE="/tmp/deploy.lock"
- # 用法
- usage(){
- echo $"Usage: $0 {deploy | rollback [ list | version ]"
- }
- #写日志
- writelog(){
- LOGINFO=$ #将参数作为日志输入
- echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO} " >> ${SHELL_LOG}
- }
- #创建锁
- shell_lock(){
- touch ${LOCK_FILE}
- }
- #判断
- url_test(){
- URL=$
- curl -s --head $URL | grep '200 OK'
- if [ $? -ne ];then
- shell_unlock;
- echo "test error" && exit;
- fi
- }
- #删除锁
- shell_unlock(){
- rm -f ${LOCK_FILE}
- }
- #拉取代码
- code_get(){
- writelog "code_get";
- cd $CODE_DIR && git pull
- cp -r ${CODE_DIR} ${TMP_DIR}/
- API_VERL=$(git show | grep commit | cut -d ' ' -f2)
- API_VER=$(echo ${API_VERL::})
- }
- #代码构建
- code_build(){
- echo code_guild
- }
- code_config(){
- writelog "code_config"
- /bin/cp -r ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}"
- PKG_NAME="${PRO_NAME}"_"$API_VER"_"${CDATE}-${CTIME}"
- cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
- }
- code_tar(){
- writelog "code_tar"
- cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
- writelog "${PKG_NAME}.tar.gz"
- }
- code_scp(){
- writelog "code_scp"
- for node in $PRE_LIST;do
- scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
- done
- for node in $GROUP1_LIST;do
- scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
- done
- }
- pre_deploy(){
- writelog "remove from cluster"
- ssh $PRE_LIST "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
- ssh $PRE_LIST "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
- }
- pre_test(){
- url_test "http://${PRE_LIST}/index.html"
- echo "d to cluster"
- }
- group1_deploy(){
- writelog "remove from cluster"
- for node in $GROUP1_LIST;do
- ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
- ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
- done
- scp ${CONFIG_DIR}/other/192.168.56.12.crontab.xml 192.168.56.12:/webroot/web-demo/crontab.xml
- }
- group1_test(){
- url_test "http://192.168.56.12/index.html"
- echo "add to cluster"
- }
- rollback_fun(){
- for node in $ROLLBACK_LIST;do
- ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/$1 /webroot/web-demo"
- done
- }
- rollback(){
- if [ -z $1 ];then
- shell_unlock;
- echo "Please input rollback version" && exit;
- fi
- case $1 in
- list)
- ls -l /opt/webroot/*.tar.gz
- ;;
- *)
- rollback_fun $1
- esac
- }
- main(){
- if [ -f $LOCK_FILE ];then
- echo "Deploy is running" && exit;
- fi
- DEPLOY_METHOD=$1
- ROLLBACK_VER=$2
- case $DEPLOY_METHOD in
- deploy)
- shell_lock;
- code_get;
- code_build;
- code_config;
- code_tar;
- code_scp;
- # pre_deploy;
- # pre_test;
- group1_deploy;
- group1_test;
- shell_unlock;
- ;;
- rollback)
- shell_lock;
- rollback $ROLLBACK_VER;
- shell_unlock;
- ;;
- *)
- usage;
- esac
- }
- main $1 $2
CI持续集成系列之(九)代码发布脚本模板书写的更多相关文章
- [ci]持续集成系列
持续集成一直很蛋疼,感觉没底. 几个方面来写 1,搭建gitlab 配邮箱 域名等使之好用 2,搭建jenkins –yum,安装常见插件 3,搭建sonar,汉化 4,安装sonar-scanner ...
- CI持续集成
CI持续集成 “我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先 ...
- 我的TDD实践---CI持续集成
“我的TDD实践”系列之CI持续集成 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则是关注工具的使用及环境的搭建,做到简单实践先行,后理论专精 ...
- 物联网架构成长之路(47)-利用GitLab实现CI持续集成
0.前言 前段时间,考虑到要练习部署一套CI/CD的系统.一开始考虑到Jenkins,随着这两天的了解,发现最新版的GitLab已经提供有CI/CD集成了.所以本次博客,干脆一步到位,直接用GitLa ...
- GitLab CI持续集成配置方案
目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 GitLab持续集成所需环境 2.4 需要了解 ...
- [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更多的人在说协同开发.敏捷开发.迭代开发.持续集成和单元测试这些拉风的术语.然而,大都是仅仅听到在说而已,国内 ...
- Ubuntu Docker 安装和配置 GitLab CI 持续集成
相关文章: Ubuntu Docker 简单安装 GitLab 劈荆斩棘:Gitlab 部署 CI 持续集成 目的:在 Ubuntu 服务器上,使用 Docker 安装和配置 GitLab Runne ...
- CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
原文地址https://www.cnblogs.com/kevingrace/p/5651447.html 近年来,由于开源项目.社区的活跃热度大增,进而引来持续集成(CI)系统的诞生,也越发的听到更 ...
- Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务
Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...
随机推荐
- Tiny4412模式跳转
ARM体系的CPU有以下7种工作模式: 1.用户模式(Usr):用于正常执行程序: 2.快速中断模式(FIQ):用于高速数据传输: 3.外部中断模式(IRQ):用于通常的中断处理: 4.管理模式(sv ...
- SSM-SpringMVC-11:SpringMVC中ParameterMethodNameResolver参数方法名称解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 或许曾经的我们也见过一种方式http://localhost:8080/项目名/后台servlet?actio ...
- Java 并行与并发
Java 并行与并发 注意两个词:并行(Concurrent) 并发(Parallel) 并行:是逻辑上同时发生,指在某一个时间内同时运行多个程序 并发:是物理上同时发生,指在某一个时间点同时运行多个 ...
- Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921,本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...
- 关于Kafka配额的讨论(2)
继续前一篇的讨论.前文中提到了两大类配额管理:基于带宽的以及基于CPU线程使用时间的.本文着重探讨基于CPU线程时间的配额管理. 定义 这类配额管理被称为请求配额(request quota),管理起 ...
- syncer.go
package ) ) ) ].Key,)) )) }
- [CTF隐写]png中CRC检验错误的分析
[CTF隐写]png中CRC检验错误的分析 最近接连碰到了3道关于png中CRC检验错误的隐写题,查阅了相关资料后学到了不少姿势,在这里做一个总结 题目来源: bugku-MISC-隐写2 bugku ...
- 【深度学习篇】---CNN和RNN结合与对比,实例讲解
一.前述 CNN和RNN几乎占据着深度学习的半壁江山,所以本文将着重讲解CNN+RNN的各种组合方式,以及CNN和RNN的对比. 二.CNN与RNN对比 1.CNN卷积神经网络与RNN递归神经网络直观 ...
- 解决tomcat部署项目中碰到的几个问题
在tomcat上部署项目并进行测试,经常会碰到各种问题.在不同的操作系统上部署,对问题的解决也会有一些差异. 1 发现问题 1.1 项目部署 先将项目达成war包,放到tomcat的webapps目录 ...
- python输出彩色字体
Python终端如何输出彩色字体 实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以ESC开头,即用\033来完成(ES ...