• 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)的标签直到成功

  • 相关阅读:
    libmysql.lib 和 mysqlclient.lib的区别
    输入框禁止输入法
    html加后退按钮
    spry
    migration
    Ruby char <=> ASCII
    Javascript innerhtml
    My SQL 索引
    datepicker
    ruby 常用正则表达式
  • 原文地址:https://www.cnblogs.com/windysai/p/16372611.html
Copyright © 2020-2023  润新知