jenkins根据选项参数发布不同环境

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
View Code
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
View Code
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
View Code
  配置还是要靠自己做,例如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)的标签直到成功

 

 

 

posted @ 2022-06-13 23:10  windysai  阅读(1523)  评论(0编辑  收藏  举报