jenkins根据选项参数发布不同环境
这篇文章是篇水文,哈哈哈,又来凑博客数 ^___^
话说我们有个系统已经完成验收阶段,准备进入软硬件选购环节,所以接下来就轮到我这个运维开始忙了~~~这个需求是我提早做的,因为肯定会用到!(无理由部署12个jenkins任务的:xx管理平台前、后端、xx窗口,又多又累赘)
前几天老板示意在不久的将来,要在线上部署4个环境:生产、生产beta、内测环境、客户体验。上周他叫我提早做下准备好批量、快速的建设脚本,后来我才发觉他可能误解了一些东西,就是系统上的流程审批等工作流他以为是我熟悉的,因为那个很复杂,其实是开发自己配的,我对这个是完全懵逼的。
老实说,当时收到这个需求,我第一反应是快照克隆部署好的机器不是挺快的么,准备建设脚本有点多余,我们不是部署上百台机器。哪怕测试(内测+客户体验)用了天翼云,生产(生产+beta)用阿里云,最多只需要部署两遍。如果用同一个公有云,那部署一次,其他都能复用了。
想想还是要交差的,顺便练下手,就写吧~~
就我看来,系统由入口服务器(nginx)、java应用服务器(jar包)、中间件服务器(mongo)。直接贴代码,因为不是本文重点:
一、快速部署服务脚本
1、nginx --- 用普通用户启动服务
1 #!/bin/bash 2 3 ## written by ljy 4 5 ####################################################### 6 # $Name: front_install.sh 7 # $Version: v1.0 8 # $Function: nginx、system前端部署 9 10 ####################################################### 11 12 ####### Begin ######## 13 # 检查是否成功 14 check_ok() { 15 if [ $? != 0 ] 16 then 17 echo "Error, Check the error log." 18 exit 1 19 fi 20 } 21 22 ## 1、检查安装包是否装过 23 ##if the packge installed ,then omit. 24 myum() { 25 if ! rpm -qa | grep -q "^$1" 26 then 27 yum install -y $1 28 check_ok 29 else 30 echo $1 already installed. 31 fi 32 } 33 34 35 ##get the archive of the system,i686 or x86_64. 36 ar=`arch` 37 38 ## 2、关闭防火墙 39 ## (1)close selinux,firewalld 40 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 41 selinux_s=`getenforce` 42 if [ $selinux_s == "Enforcing" -o $selinux_s == "enforcing" ] 43 then 44 setenforce 0 45 fi 46 47 # 安装 iptables,关闭firewalld 48 yum install iptables-services -y 49 systemctl status firewalld 50 51 # 禁用/停止自带的firewalld服务 52 #停止firewalld服务 53 systemctl stop firewalld 54 #禁用firewalld服务 55 systemctl mask firewalld 56 57 58 ## 3、部署nginx 59 ## 3.1 install some packges. 60 for p in gcc wget perl perl-devel libaio libaio-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel openssl-de 61 vel 62 do 63 myum $p 64 done 65 66 #### 一、前端服务器:nginx、系统xxx窗口静态页、系统管理后台xx静态页 67 ## 3.2 install nginx 68 ## function of install nginx 1.16 (xtw600) 69 70 install_nginx() { 71 cd /usr/local/src 72 [ ! -f nginx-1.16.0.tar.gz ] || wget http://nginx.org/download/nginx-1.16.0.tar.gz 73 74 [ ! -d nginx-1.16.0 ] || tar -zxvf nginx-1.16.0.tar.gz 75 76 # 通过检测安装目录和文件是否存在来检测是否安装nginx 77 if [ -f /home/{系统用户名}/app/nginx/conf/nginx.conf ] && [ -d /home/{系统用户名}/app/nginx/logs ];then 78 echo " 经过检测,该系统已经安装 nginx" 79 /home/{系统用户名}/app/nginx/sbin/nginx -v 80 else 81 echo "经过检测,该系统未安装nginx" 82 83 #编译安装 84 cd nginx-1.16.0 85 ./configure --user={系统用户名} --group={系统用户名} --prefix=/home/{系统用户名}/app/nginx --with-stream --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module --with-http_fl 86 v_module --with-pcre 87 check_ok 88 89 make && make install 90 check_ok 91 chown -R {系统用户名}.{系统用户名} /home/{系统用户名}/app/ 92 chown root.{系统用户名} /home/{系统用户名}/app/nginx/sbin/nginx 93 chmod u+s /home/{系统用户名}/app/nginx/sbin/nginx 94 fi 95 96 configure_nginx 97 98 ## 3.3 start nginx 99 su - {系统用户名} -c '/home/{系统用户名}/app/nginx/sbin/nginx' 100 check_ok 101 echo "启动nginx成功 ..." 102 103 } 104 105 #配置nginx 106 configure_nginx() { 107 # 创建虚拟主机配置文件目录 108 [ -d /home/{系统用户名}/app/nginx/conf/extra ] || mkdir -p /home/{系统用户名}/app/nginx/conf/extra 109 110 # 创建前端发布目录 111 [ -d /home/{系统用户名}/app/nginx/html/{项目关键字1} ] || mkdir -p /home/{系统用户名}/app/nginx/html/{项目关键字1} 112 [ -d /home/{系统用户名}/app/nginx/html/{项目关键字2} ] || mkdir -p /home/{系统用户名}/app/nginx/html/{项目关键字2} 113 114 ## ssl证书目录-手动上传 115 [ -d /home/{系统用户名}/app/nginx/conf/cert/{项目名字} ] || mkdir -p /home/{系统用户名}/app/nginx/conf/cert/{项目名字} 116 117 } 118 119 120 install_nginx 121 configure_nginx
2、java环境
这里特别说下,写入JAVA环境变量到/etc/profile需要运行两次source,这个大家可以测试下为啥要这样
1 [root@back scripts]# more back_install.sh 2 #!/bin/bash 3 4 ## written by ljy 5 6 ####################################################### 7 # $Name: back_install.sh 8 # $Version: v1.0 9 # $Function: java、jar包目录 10 11 ####################################################### 12 13 ####### Begin ######## 14 # 检查是否成功 15 check_ok() { 16 if [ $? != 0 ] 17 then 18 echo "Error, Check the error log." 19 exit 1 20 fi 21 } 22 23 ## 1、检查安装包是否装过 24 ##if the packge installed ,then omit. 25 myum() { 26 if ! rpm -qa | grep -q "^$1" 27 then 28 yum install -y $1 29 check_ok 30 else 31 echo $1 already installed. 32 fi 33 } 34 35 36 ## 2 install some packges. 37 for p in gcc wget lrzsz 38 do 39 myum $p 40 done 41 42 ## 3、关闭防火墙 43 ## (1)close selinux,firewalld 44 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 45 selinux_s=`getenforce` 46 if [ $selinux_s == "Enforcing" -o $selinux_s == "enforcing" ] 47 then 48 setenforce 0 49 fi 50 51 # 安装 iptables,关闭firewalld 52 yum install iptables-services -y 53 systemctl status firewalld 54 55 # 禁用/停止自带的firewalld服务 56 #停止firewalld服务 57 systemctl stop firewalld 58 #禁用firewalld服务 59 systemctl mask firewalld 60 61 ## 4、部署java 62 ## function of install jdk 63 install_jdk() { 64 65 # 通过检测安装目录和文件是否存在来检测是否安装nginx 66 if [ -f /usr/local/java/jdk1.8/bin/java ] && [ -d /usr/local/java/jdk1.8 ];then 67 echo " 经过检测,该系统已经安装 jdk 1.8" 68 /usr/local/java/jdk1.8/bin/java -version 69 echo "" 70 else 71 echo "经过检测,该系统未安装 jdk 1.8" 72 echo "开始安装 jdk 1.8。。。" 73 cd /usr/local/src 74 [ -f jdk-8u202-linux-x64.tar.gz ] || wget https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz 75 mkdir /usr/local/java 76 tar -zxf jdk-8u202-linux-x64.tar.gz -C /usr/local/java/ 77 #改名,解压完名字为:jdk1.8.0_202 78 mv /usr/local/java/jdk1.8.0_202 /usr/local/java/jdk1.8 79 fi 80 81 #write java environment variables to /etc/profile if not exist 82 grep -q "export JAVA_HOME" /etc/profile 83 if [ $? -ne 0 ]; then 84 echo "java environment variables not exist, starting define it" 85 #环境变量 86 echo -e "#环境变量\nexport JAVA_HOME=/usr/local/java/jdk1.8" >> /etc/profile 87 echo "export CLASSPATH=/usr/local/java/jdk1.8" >> /etc/profile 88 source /etc/profile 89 #echo "export PATH=$PATH:/usr/local/java/jdk1.8/bin" >> /etc/profile 90 echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile 91 source /etc/profile 92 echo "加载JAVA环境变量..." 93 echo "验证jdk是否成功加入环境变量。。。" 94 java -version 95 96 fi 97 98 echo "Config Java Environment Variables Success" 99 100 sleep 2 101 102 } 103 104 ## 5、部署mysql客户端 105 install_mysqlclient() { 106 yum install -y mysql 107 } 108 109 ## 7、jar包运行环境-手动? 110 prepare_jarenv() { 111 112 ## 1、选择操作哪个环境 113 #生产、体验、B、内测 四个系统版本 114 cat << EOF 115 1.生产-正式 116 2.客户体验 117 3.生产-Beta 118 4.公司内测 119 EOF 120 read -p "请输入当前部署jar环境的编号:" choice_env 121 case ${choice_env} in 122 1) 123 dirmk={项目名关键字}-pro 124 ;; 125 2) 126 dirmk={项目名关键字}-tiyan 127 ;; 128 3) 129 dirmk={项目名关键字}-beta 130 ;; 131 132 4) 133 dirmk={项目名关键字}-test 134 ;; 135 esac 136 137 mkdir -p /home/{系统用户名}/app/${dirmk}/{jar_bak,jar_data,jar_tmp,logs} 138 chown {系统用户名}.{系统用户名} /home/{系统用户名}/ -R 139 } 140 141 install_jdk 142 install_mysqlclient 143 prepare_jarenv
3、mongo -- 用root用户启动服务
1 #!/bin/bash 2 3 ## written by ljy 4 5 ####################################################### 6 # $Name: middleware_install.sh 7 # $Version: v1.0 8 # $Function: mongo目录 9 10 ####################################################### 11 12 ####### Begin ######## 13 # 检查是否成功 14 check_ok() { 15 if [ $? != 0 ] 16 then 17 echo "Error, Check the error log." 18 exit 1 19 fi 20 } 21 22 ## 1、检查安装包是否装过 23 ##if the packge installed ,then omit. 24 myum() { 25 if ! rpm -qa | grep -q "^$1" 26 then 27 yum install -y $1 28 check_ok 29 else 30 echo $1 already installed. 31 fi 32 } 33 34 35 ## 2 install some packges. 36 for p in gcc wget lrzsz 37 do 38 myum $p 39 done 40 41 ## 3、关闭防火墙 42 ## (1)close selinux,firewalld 43 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 44 selinux_s=`getenforce` 45 if [ $selinux_s == "Enforcing" -o $selinux_s == "enforcing" ] 46 then 47 setenforce 0 48 fi 49 50 # 安装 iptables,关闭firewalld 51 yum install iptables-services -y 52 systemctl status firewalld 53 54 # 禁用/停止自带的firewalld服务 55 #停止firewalld服务 56 systemctl stop firewalld 57 #禁用firewalld服务 58 systemctl mask firewalld 59 60 ###### 中间件服务器 61 ## 6、部署mongo 62 install_mongo() { 63 64 # 通过检测安装目录和文件是否存在来检测是否安装nginx 65 if [ -f /home/{系统用户名}/app/mongodb-3.4.7/bin/mongod ] && [ -d /home/{系统用户名}/app/mongodb-3.4.7 ];then 66 echo "经过检测,该系统已经安装 mongo 3.4.7" 67 /home/{系统用户名}/app/mongodb-3.4.7/bin/mongo --version 68 echo "" 69 else 70 echo "经过检测,该系统未安装 mongo 3.4.7" 71 echo "开始安装 mongo 3.4.7 。。。" 72 73 cd /usr/local/src 74 ## 不存在就下载 75 [ -f mongodb-linux-x86_64-rhel70-3.4.7.tgz ] || wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.7.tgz 76 77 [ -d /home/{系统用户名}/app ] && mkdir -p /home/{系统用户名}/app 78 [ -d mongodb-linux-x86_64-rhel70-3.4.7 ] || tar -zxvf mongodb-linux-x86_64-rhel70-3.4.7.tgz 79 # [ -d /home/{系统用户名}/app/mongodb-3.4.7 || mv mongodb-linux-x86_64-rhel70-3.4.7 /home/{系统用户名}/app/mongodb-3.4.7 ] 80 if [ ! -d /home/{系统用户名}/app/mongodb-3.4.7 ]; then 81 mv /usr/local/src/mongodb-linux-x86_64-rhel70-3.4.7 /home/{系统用户名}/app/mongodb-3.4.7 82 fi 83 84 # 6.1 mongo 配置文件, 放安装目录: 85 mkdir -p /home/{系统用户名}/app/mongodb-3.4.7/conf 86 87 #6.2 创建mongo日志和数据目录: 88 mkdir -p /home/{系统用户名}/mongo/{db,logs} 89 90 cat > /home/{系统用户名}/app/mongodb-3.4.7/conf/mongodb.conf << EOF 91 dbpath=/home/{系统用户名}/mongo/db 92 logpath=/home/{系统用户名}/mongo/logs/mongodb.log 93 pidfilepath=/home/{系统用户名}/mongo/mongodb.pid 94 port=27017 95 #在后台运行 96 fork=true 97 #开启权限认证 98 auth=true 99 nohttpinterface=true 100 EOF 101 fi 102 #启动mongo 103 /home/{系统用户名}/app/mongodb-3.4.7/bin/mongod -f /home/{系统用户名}/app/mongodb-3.4.7/conf/mongodb.conf --logappend 104 } 105 106 107 install_mongo
配置还是要靠自己做,例如mongo的用户新建和授权、nginx的ssl证书上传和虚拟主机配置。。
二、jenkins根据选项参数发布
查这个需求实现方法的时候,很多都是用pipeline去做的,直到发现这篇文章:https://blog.csdn.net/JineD/article/details/109896623,比较巧妙,关键不用写那么多代码(运维人员的福音,哈哈哈)
直接贴我的测试配置:
以下内容均在jenkins的自由任务里配置,且建立在npm编译后得到一个dist目录,最后被我打包成 dist.tar.gz
1、General
选项参数,代表4个不同的环境
2、构建后操作
我这里准备了3台机,分别表示生产、beta、测试环境,变量 ${DIST_DIR} 是目标机器的临时war包放置目录
192.168.2.5:生产环境
192.168.2.6:生产-beta
192.168.2.7:test内测环境
jenkins控制台的日志有点多,我截取主要部分,假设发布beta环境:
(192.168.2.5-nginx后来被我改名叫做:192.168.2.5-pro,192.168.2.5-nginx等价于192.168.2.5-pro)
很明显是个顺序比较下来的过程,如果beta匹配到,后面的test直接忽略了。所以这里引申出一个问题,SSH Server的 label 标签要保证唯一性,否则很容易出错,想像下配了两个一模一样的 label,jenkins发布了最先匹配到的机器,后面那台就完美被过滤掉了。。。
如果发布测试环境,则一直比较到第3台机器(test)的标签直到成功