git+jenkins学习之路(十四)之自动化脚本部署实践(代码片段)

linuxk linuxk     2023-01-14     476

关键词:

一、环境说明和准备

1、环境说明

主机名 IP地址 角色 系统
deploy-server 192.168.56.12 发布 Centos 7.4
web 192.168.56.13 web服务器,nfs服务器 Centos 7.4

2、服务器准备工作

(1)发布机前期准备

a.增加普通用户并配置密码
[[email protected] ~]# useradd www
[[email protected] ~]# id www
uid=1000(www) gid=1000(www) groups=1000(www)
[[email protected] ~]# passwd www
[[email protected] ~]# yum install -y git tree
b.创建部署需要的目录并初始化git目录
[[email protected] ~]# mkdir -pv /deploy/code/www,jxs,wap,gys,glzx,yyzx,config,tar,tmp
[[email protected] ~]# chown -R www.www /deploy
[[email protected] ~]$ tree /deploy
/deploy
├── code
│?? ├── glzx
│?? ├── gys
│?? ├── jxs
│?? ├── wap
│?? ├── www
│?? └── yyzx
├── config
├── tar
└── tmp
[[email protected] ~]$ cd /deploy/code/www && git init
c.创建配置文件config.php
[[email protected] ~]$ vim /deploy/config/config.php 
this is config.php
[[email protected] ~]$ tree /deploy
/deploy
├── code
│?? ├── glzx
│?? ├── gys
│?? ├── jxs
│?? ├── wap
│?? ├── www
│?? └── yyzx
├── config
│?? └── config.php
├── tar
└── tmp
d.配置发布机和目标机的ssh通信
[[email protected] deploy]$ cat /home/www/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDzM3AW6/X+djvKJTsdFbY3ik+mlradxpD3COoTP5h6x509unksuCdduV7awPjEGHvK2GVjJmvckxdvLkMc23p7bsctHlturPN2VozJTrYwXMAbmxf97cKE/fpKhjPXG8HlWBLpEaTM8PITgvdcyaeAUaIN+/h5VrA8TZKFAgbxDLxtgwqPzYIG9nqCO7MMCgzhJxI6PDQ6KVU9rHal/p4XKTIy4Rq4FzZTav2tS4zNJ7kX9+e6EO0JTooPanJXBTltLOJJsKxnlA7tc20rq6+0XVqbUBKYahL/8ZzkxZozNrNq7wtIuuJo0WTDFzDdPcJyAGlRWLuwct7y4p4UApVz [email protected]

[[email protected] ~]$ ssh-copy-id [email protected]
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/www/.ssh/id_rsa.pub"
The authenticity of host '192.168.56.13 (192.168.56.13)' can't be established.
ECDSA key fingerprint is SHA256:ahG6dBy/Z1nUIUWhQQrylsiwBlnDKC/jz8rnaPU2eF0.
ECDSA key fingerprint is MD5:6e:58:0b:02:1c:a4:41:51:e8:7d:33:4d:46:bb:a0:68.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

[[email protected] ~]$ ssh 192.168.56.13
Last login: Fri Nov  2 18:01:02 2018
[[email protected] ~]$ 
e.将ssh公钥复制到github或gitlab

技术分享图片

(2)web服务器准备

a.部署NFS服务器
[[email protected] ~]# yum install -y nfs-utils rpcbind
[[email protected] ~]# vim /etc/exports
/nas/www 192.168.56.0/24(rw,sync,no_root_squash)
/nas/jxs 192.168.56.0/24(rw,sync,no_root_squash)
/nas/wap 192.168.56.0/24(rw,sync,no_root_squash)
/nas/glzx 192.168.56.0/24(rw,sync,no_root_squash)
/nas/yyzx 192.168.56.0/24(rw,sync,no_root_squash)
/nas/gys 192.168.56.0/24(rw,sync,no_root_squash)
[[email protected] ~]# systemctl start rpcbind
[[email protected] ~]# systemctl start nfs
[[email protected] ~]# showmount -e
Export list for web:
/nas/gys  192.168.56.0/24
/nas/yyzx 192.168.56.0/24
/nas/glzx 192.168.56.0/24
/nas/wap  192.168.56.0/24
/nas/jxs  192.168.56.0/24
/nas/www  192.168.56.0/24
b.挂载共享目录
[[email protected] ~]# mkdir /webroot/www,jxs,wap,gys,glzx,yyzx
[[email protected] ~]# chown -R www.www /webroot
[[email protected] ~]# mount -f nfs 192.168.56.13:/nas/www /webroot/www
[[email protected] ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G  1.7G   16G  10% /
devtmpfs                 482M     0  482M   0% /dev
tmpfs                    493M     0  493M   0% /dev/shm
tmpfs                    493M  6.8M  486M   2% /run
tmpfs                    493M     0  493M   0% /sys/fs/cgroup
/dev/sda1                497M  171M  326M  35% /boot
tmpfs                     99M     0   99M   0% /run/user/0
192.168.56.13:/nas/www    18G  1.7G   16G  10% /webroot/www
c.部署nginx+php
[[email protected] ~]# useradd www
[[email protected] ~]# passwd www
[[email protected] ~]# yum install -y nginx php php-fpm
[[email protected] ~]# vim /etc/nginx/nginx.conf
user www;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events 
    worker_connections 1024;


http 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;



[roo[email protected] ~]# mkdir /data/web -pv && chown -R www.www /data
[[email protected] ~]# vim /etc/nginx/nginx.conf
server 
        listen 80;
        server_name  localhost;

        root /data/web/www;
        index index.php index.htm index.html;
        client_max_body_size 20m;
        location / 
                proxy_read_timeout 150;
                try_files $uri $uri/ /index.php;
        

        location ~* .*.php$ 
                #try_files     $uri =404;
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_split_path_info       ^(.+.php)(/.+)$;
                fastcgi_param PATH_INFO       $fastcgi_path_info;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        

[[email protected] ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[[email protected] ~]# systemctl start nginx
[[email protected] ~]# vim /etc/php-fpm.d/www.conf 
user www
group www
....
[[email protected] ~]# php-fpm -t
[03-Nov-2018 10:16:18] NOTICE: configuration file /etc/php-fpm.conf test is successful
[[email protected] ~]# systemctl start php-fpm
[[email protected] ~]# curl localhost -I
HTTP/1.1 200 OK
Server: nginx/1.12.2
Date: Sat, 03 Nov 2018 02:16:36 GMT
Content-Type: text/html
Content-Length: 35
Last-Modified: Sat, 03 Nov 2018 02:07:00 GMT
Connection: keep-alive
ETag: "5bdd02c4-23"
Accept-Ranges: bytes

二、发布脚本编写

1、自动化部署流程设计

  1. 发布机获取代码(直接拉取),从svn或git仓库进行拉取
  2. 发布机编译代码(可选,java语言需要编译,PHP无需编译)
  3. 将配置文件拷贝到代码文件(由于配置文件有数据库等机密信息,需要独立处理)
  4. 代码打包(将代码进行压缩打包)
  5. SCP到目标服务器目录
  6. 将目标服务器移除集群
  7. 在目标服务器上进行解压传过来的代码
  8. 解压后,对代码根目录进行软链接到刚才的目录文件,实现版本链接
  9. 重启(可选,tomcat需要重启)
  10. 测试
  11. 加入集群

2、自动化部署脚本编写

#!/bin/bash

#deploy-server create dir as root
#[ -d /deploy ] && mkdir -pv /deploy/code/web-demo,config,tar,tmp && chown -R www.www /deploy

#node-server create dir as root
#[ -d /data ] && mkdir -pv /data/web && chown -R www.www /data
#nfs dir /nas/www mount to /webroot

#Node List
NODE="192.168.56.13"

#Shell ENV
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www"
SHELL_LOG="$SHELL_DIR/$SHELL_NAME.log"

#Code ENV
PRO_NAME="www"
CODE_DIR="/deploy/code/www"
CONFIG_DIR="/deploy/config"
TMP_DIR="/deploy/tmp"
TAR_DIR="deploy/tar"
LOCK_FILE="/tmp/deploy.lock"

#Date/Time ENV
LOG_DATE='date "+%Y-%m-%d"'
LOG_TIME='date "+%H-%M-%S"'

CDATE=$(date "+%Y-%m-%d")
CTIME=$(date "+%H-%M-%S")

useage()
    echo $"Useage: $0  deploy |rollback [ list | version ] "


url_test()
    URL=$1
    curl -s --head $URL |grep '200 OK'
    if [ $? -ne 0 ];then
        shell_unlock;
        writelog "test error" && exit;
    fi


writelog()
    LOGINFO=$1
    echo "$CDATE $CTIME: $SHELL_NAME : $LOGINFO " >> $SHELL_LOG


code_get()
    writelog "code_get";
    cd $CODE_DIR && git pull [email protected]:kin08200/learngit.git
    cp -r $CODE_DIR $TMP_DIR
    API_VERL=$(git show |grep commit |cut -d ' ' -f2 )
        API_VER=$(echo $API_VERL:0:6)
    echo $API_VER


code_config()
    writelog "code_config"
    /bin/cp -r $CONFIG_DIR/* $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"
    scp $TMP_DIR/$PKG_NAME.tar.gz $NODE:/webroot/www


code_deploy()
    writelog "code_deploy"
    ssh $NODE "cd /webroot/www && tar -zxf $PKG_NAME.tar.gz"
    ssh $NODE "rm -rf /data/web/www && ln -s /webroot/www/$PKG_NAME /data/web/www"


code_test()
    url_test "http://192.168.56.13"


rollback_fun()
    ssh $NODE "rm -rf /data/web/www && ln -s /webroot/www/$1 /data/web/www"   


rollback()
    if [ -z $1 ];then
        shell_unlock;
        echo "Please input rollback version." && exit;
        fi
        case $1 in 
            list)
            ls -l /deploy/tmp/*.tar.gz
            ;;
            *)
            rollback_fun $1
            ;;
        esac



shell_lock()
    touch $LOCK_FILE


shell_unlock()
    rm -f $LOCK_FILE


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_config;
        code_tar;
            code_scp;
        code_deploy;
        code_test;
        shell_unlock;
        ;;
    rollback)
        shell_lock;
        rollback $ROLLBACK_VER;
        shell_unlock;
        ;;
    *)
        useage;
        ;;
    esac


main $1 $2

三、发布测试

1、开发机和github添加ssh信任

[[email protected] ~]$ cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+ta7tkljnIgqvgEugQvIfVxH/a+geX250ZhOpe+14Q8EBQSI+qGyXCeihln+0aQpzIERvNBZ7JjWCg5XeQlgPBgCmqoQKNTWl/NUBT+uY/NY9fIGdRCVBvVcDC554Be48zB57mtapKQEkqm/8kmq7sPRQDv98l5wvFvYOPxocmjnioDZr3GeYmgdFPNJ5WGg6yY29IHXgh2v3eCXLwX2Z2eUdKCpV1LS42wdAN8TqHFCEmthREIq2r86ZKPOovD6Micq7wa2yJqtA/hkv+DvEhRzOIVznfW5EptOyKYcittGu63JGMSbCr1uCdW7PLUQ8aIWDDlip+/EcIt0KkuJJ [email protected]

2、克隆项目到开发机进行开发测试

[[email protected] ~]$ mkdir dev && cd dev
[[email protected] dev]$ git clone [email protected]:kin08200/learngit.git
[[email protected] dev]$ ll
total 4
drwxrwxr-x 3 www www 4096 Nov  2 22:02 learngit
[[email protected] dev]$ cd learngit

3、修改index.html文件

[[email protected] learngit]$ ll
total 8
-rw-rw-r-- 1 www www  0 Nov  2 04:31 123
-rw-rw-r-- 1 www www 35 Nov  2 22:02 index.html
-rw-rw-r-- 1 www www 80 Nov  2 04:31 readme.txt
[[email protected] learngit]$ echo "<h1> welcome to Beijing </h1>" > index.html

4、提交代码

[[email protected] learngit]$ git add .
[[email protected] learngit]$ git commit -m "modify index.html"
[[email protected] learngit]$ git push origin master

5、发布代码

[[email protected] ~]$ ./deploy.sh deploy
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:kin08200/learngit
 * branch            HEAD       -> FETCH_HEAD
Updating 9a781b2..683a440
Fast-forward
 index.html | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
683a44
www_683a44_2018-11-03-10-06-56.tar.gz                                                                                                                      100%   22KB   9.3MB/s   00:00    
HTTP/1.1 200 OK

6、测试访问

[[email protected] ~]$ curl 192.168.56.13
<h1>
    welcome to Beijing!!!!
</h1>

7、回滚测试

[[email protected] ~]# ll /data/web/
total 0
lrwxrwxrwx 1 www www 43 Nov  3 10:46 www -> /webroot/www/www_683a44_2018-11-03-10-06-56

测试访问如下,下面进行查看版本列表,并选择回滚到www_9a781b_2018-11-03-09-59-44版本

技术分享图片

[[email protected] ~]$ ./deploy.sh rollback list
-rw-rw-r-- 1 www www 22686 Nov  3 10:07 /deploy/tmp/www_683a44_2018-11-03-10-06-56.tar.gz
-rw-rw-r-- 1 www www 22685 Nov  3 10:44 /deploy/tmp/www_683a44_2018-11-03-10-43-55.tar.gz
-rw-rw-r-- 1 www www 22222 Nov  3 09:48 /deploy/tmp/www_9a781b_2018-11-03-09-48-36.tar.gz
-rw-rw-r-- 1 www www 22231 Nov  3 09:52 /deploy/tmp/www_9a781b_2018-11-03-09-52-32.tar.gz
-rw-rw-r-- 1 www www 22228 Nov  3 09:58 /deploy/tmp/www_9a781b_2018-11-03-09-58-15.tar.gz
-rw-rw-r-- 1 www www 22234 Nov  3 09:59 /deploy/tmp/www_9a781b_2018-11-03-09-59-44.tar.gz

[[email protected] ~]$ ./deploy.sh rollback www_9a781b_2018-11-03-09-59-44
[[email protected] ~]# ll /data/web/
total 0
lrwxrwxrwx 1 www www 43 Nov  3 10:48 www -> /webroot/www/www_9a781b_2018-11-03-09-59-44

再进行访问测试:

技术分享图片

(转)bootstrap之metronic模板的学习之路-源码分析之脚本部分

https://segmentfault.com/a/1190000006709967上篇我们将body标签主体部分进行了简单总览,下面看看最后的脚本部门。页面结尾部分(Javascripts脚本文件)我们来看看代码最后的代码,摘取如下:<!--[ifltIE9]><scriptsrc="../assets/global/plugins... 查看详情

spark学习之路(十四)sparkcore的调优之资源调优jvm的gc垃圾收集器

讨论QQ:1586558083目录一、概述二、垃圾收集器(garbagecollector(GC))是什么?三、为什么需要GC?四、为什么需要多种GC?五、对象存活的判断六、垃圾回收算法6.1 标记-清除算法6.2 复制算法6.3 标记-整理算法6.4 分代收集算法七... 查看详情

photoshop脚本学习之路-链接集合

...ps对象的能力,比如图层、画布等。脚本的编写使得自动化工作成为可能,提供一种节省重复劳动耗费人力的可能性。虽然ps提供了动作录制的功能,但是由于可以录制动作的功能有限,并且录制的动作不可复制。... 查看详情

自动化发布项目之jenkins+git+maven自动化部署一个web项目

1.环境准备.1.1需要在liunx环境上安装,部署相应的liunx环境(jdk,防火墙,等等),自己百度解决哈.1.2软件准备工作这里是我用到的相关软件maventomcat和jenkins的war包及jenkins的扩展插件百度云地址:链接:http://pan.baidu.com/s/1mhWmnSs密码ÿ... 查看详情

spark学习之路(十四)sparkcore的调优之资源调优jvm的gc垃圾收集器[转](代码片段)

概述垃圾收集GarbageCollection通常被称为“GC”,它诞生于1960年MIT的Lisp语言,经过半个多世纪,目前已经十分成熟了。jvm中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出... 查看详情

jenkins+ant+jmeter自动化性能测试平台之填坑篇(代码片段)

一、前言  搭建Jenkins+Ant+Jmeter自动化性能测试平台过程中,坦白说遇到了很多坑。。。写这篇博文的目的,除了总结经验方便自己以后查阅之外,也为了方便他人遇到相同的坑时,可以快速找到原因并解决。下面开始我漫长的... 查看详情

jmeter4.0之jenkins+jmeter实现接口自动化测试(代码片段)

 Jenkins+jmeter实现接口自动化测试工具:  Jenkins+Jmeter 思路:  1.准备好已经调试好的jmeter脚本  2.本地已搭建好jenkins环境    3.在Jenkins中新建job,添加构建参数    以命令行的方式运行jmeter脚本===... 查看详情

我的学习之路_第十四章_反射

类的反射【获取class文件对象的三种方式】:●使用Object类中的方法getClass() Class<?>getClass()返回此Object的运行时类.●使用类名.class属性 每一个数据类型,基本数据类型和引用数据类型,Java都会为其设置一个class属性 例如:Classclas... 查看详情

jenkins自动化cicd流水线之5--pipeline(代码片段)

 一、概览二、安装在对jenkins进行初始化安装时,默认已经安装了jenkins的相关插件,如下图所示:三、实操新建任务:编写pipeline脚本:我们可以借助流水线语法去做。test流水线脚本:nodedefmvnHomestage(‘gitcheckout‘)//fordisplaypu... 查看详情

我刚刚学会用jenkins自动执行python脚本输出测试报告....你呢?(代码片段)

前言在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过Jenkins来进一步完成自动化工作。借助Jenkins,我们可以结合Git/SVN自动拉取代码,可以设置定时构建,接着... 查看详情

jenkins学习

...视频原来以前弄过。我还配置了jenkins。 jenkins是一个自动化的打包集成工具。大白话解释:jenkins就是一个war包。我们部署后可以在上面实现项目的自动打包发布。jenkins可以配置svn和git  查看详情

jenkins持续集成案例之-自动化部署

Jenkins是一个开源软件项目,目的就是提供了一个开放的软件平台,让我们实现软件集成变成可能,我们经常听到企业中讲CI、CD两个名词,这些都可以跟jenkins联系在一起,实现持续集成,持续部署及持续交付;在企业中,Jenkins... 查看详情

自动化运维脚本语言之expect实践学习

...,一个可实现自动交互功能的软件套件,其功能就是进行自动化的人机交互;也能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序,根据脚本内容expect可以知道程序会提示或反馈什么内容以及什么是正确的应答... 查看详情

java学习之路之javase基础1

<h2>java学习之路之javaSE基础1</h2><div>###01.01_计算机基础知识(计算机概述)(了解)*A:什么是计算机?计算机在生活中的应用举例 *计算机(Computer)全称:电子计算机,俗称电脑。是一种能够按照程序运行,自动、高速处... 查看详情

性能测试四十八:jenkins+ant+jmeter系统部署

...war包3、上传war包到服务器4、重启web服务器5、开始测试/自动化测试6、发测试结果 Jenkins工作:1、开发提交代码Git2、Jenkins拉取代码,自动化编译,打包-- 插件3、Jenkins自动上传war包 -- 插件/sh、bat脚本4、Jenkins自动... 查看详情

性能测试四十八:jenkins+ant+jmeter系统部署

...war包3、上传war包到服务器4、重启web服务器5、开始测试/自动化测试6、发测试结果 Jenkins工作:1、开发提交代码Git2、Jenkins拉取代码,自动化编译,打包-- 插件3、Jenkins自动上传war包 -- 插件/sh、bat脚本4、Jenkins自动... 查看详情

selenium学习之路3

自己用Python写了一个自动登陆qq邮箱的脚本,打开qq邮箱后总是报错:找不到元素。selenium.common.exceptions.NoSuchElementException:Message:Unabletolocateelement:[id="switcher_plogin"]试了各种方式,都找不到元素,什么元素都找不到。然后有seleniumide... 查看详情

ios使用jenkins自动打包发布测试

...k,请点击这里:jdk地址jdk好了之后就可以用homebrew来安装jenkins了顺利安装好jenkins的话,执行以下命令启动jenkins通过浏览器访问Jenkins安装相应的插件(可使用建议的推荐的插件进行安装)使用git管理项目可安装GitPlugin和Xcodeintegr... 查看详情