是时候换种更优雅的艺术安插你的php代码了,自动化安顿深度推行

让大家来回想下上次你是怎么公布你的代码的:

1.一 早期手动安顿代码

方式

  • 纯手动scp上传代码。
  • 纯手动登入,git pull 大概svn update。
  • 纯手动xftp上传代码。
  • 支付发送压缩包,rz上传,解压布署代码。

缺点:

  • 全程运转插足,占用大量时间。
  • 假设节点多,上线速度慢。
  • 人为失误多,目录管理混乱。
  • 回滚不登时,恐怕难以回退。

 

思想布局格局
1、纯手工scp
二、纯手工业登入git pull 、svn update
3、纯手工xftp往上拉
肆、开采给打3个压缩包,rz上去。解压

 

历史观布局缺点:
一、全程运转参与,占用大批量时间
二、上线速度慢。
三、以为失误多。管理混乱
4、回滚慢,不及时

 

新类型上线,规划排在第三人
一般银行都不提供测试接口。例如一些电商公司测试的话,平常把货色调养成一分,只好特定账号能来看。

条件的宏图
一、开辟条件-开辟者本地有投机的条件,然后运转需求安装的开销碰着,放的是豪门共用的劳务。如开垦数据库mysql,其余:redis、Memcached。
二、测试碰到:功效测试碰着和质量测试情状
叁、预生产景况:一般能够用生产条件中的某些节点担负
4、生产景况:直接对用户提供劳动的条件

预生产景况产生的案由:
一、数据库不均等:测试情况和生育情况数据库断定分化样的。
二、使用生产条件的联调接口。比如,支付接口

 

预生产景况–生产条件–灰度发表

 

灰度发表:

阿里云产品上线,都以3个区2个区上的。料定不是一念之差都上的

qq弹窗:恭喜你收获某某版本资格,请下载新本子享用,你正是小白鼠,这些也是一种灰度公布

 

规划

业已有四个方可上线的代码在代码货仓。大家什么设计壹套生产自动化安排系统。

1、规划

2、实现

3、总计和扩充。PDCA

四、在生养条件应用

 

自动化安排系统的统一准备

 

需求: 

3个集群有拾1个节点。一键陈设那十三个节点。

2、一键回滚到自由版本

三、一键回滚到上个版本

 

部署:

1、代码放在何地:svn,git
二、获取什么版本代码?
svn+git直接拉去某些分支
svn:钦定版本号
git:指定tag
三、差距化解:
(一)、各类节点直接差别:
(二)、代码饭馆和实在的出入。配置文件是不是在代码饭店中
(三)、配置文件未必同样:crontab.xml预生产节点
肆、怎样翻新。java tomcat。须求重启。
5、测试。
6、串行和相互 分组铺排
七怎么施行。(一)shell实行。(贰)web分界面

 

关于配置文件存放:

计划文件放代码货仓里,岂不是全部支付都能连数据库了。

由此配置文件无法放git里。

壹部分人把布置文件放有个别分支里。让部分人无奈看到

本身感到能够独自有个放配置文件的git

 

Tencent蓝鲸:我帮你做个平台,你写个本子,笔者帮您发表到有些机器上,你通过平台帮您施行

局地小卖部以后的运转,不管任何公布,都以做好分界面,让项目主任去通过分界面管理

 

有关差异文件:

可能有点节点有越发的差距性文件

 

 

自动化布署流程设计

澳门葡京备用网址 1

 

 

自动化陈设实战-shell函数

 情状妄想

系统版本

1
2
3
4
5
[root@linux-node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
[root@linux-node1 ~]# uname -rm
3.10.0-229.el7.x86_64 x86_64
[root@linux-node1 ~]#

主机名和IP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
node1
[root@linux-node1 ~]# hostname
linux-node1.nmap.com
[root@linux-node1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.11 linux-node1 linux-node1.nmap.com
192.168.56.12 linux-node2 linux-node2.nmap.com
[root@linux-node1 ~]#
 
node2
[root@linux-node2 ~]# hostname
linux-node2.nmap.com
[root@linux-node2 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.11 linux-node1 linux-node1.nmap.com
192.168.56.12 linux-node2 linux-node2.nmap.com
[root@linux-node2 ~]#

    

两台web服务器,node一和node二作为八个web服务器,同时node一也作为安排分发服务器,去管理三个node节点上的web包

 

七个节点增添普通用户www,作为web服务器管理用户。

1
2
3
4
5
6
7
8
9
[root@linux-node1 scripts]# useradd -u 1001 www
[root@linux-node1 scripts]# id www
uid=1001(www) gid=1001(www) groups=1001(www)
[root@linux-node1 scripts]#
 
[root@linux-node2 ~]# useradd -u 1001 www
[root@linux-node2 ~]# id www
uid=1001(www) gid=1001(www) groups=1001(www)
[root@linux-node2 ~]#

 

布局www用户登6别的机器不用密码。密钥认证。今后www用户作为管理其余机器的用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@linux-node1 .ssh]# su - www
[www@linux-node1 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www/.ssh/id_rsa):
Created directory '/home/www/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www/.ssh/id_rsa.
Your public key has been saved in /home/www/.ssh/id_rsa.pub.
The key fingerprint is:
70:37:ff:d0:17:e0:74:1d:c9:04:28:bb:de:ec:1f:7f www@linux-node1.nmap.com
The key's randomart image is:
+--[ RSA 2048]----+
|            .++++|
|         . .o oo.|
|      . . =  . . |
|       o o o .  .|
|        S . o . .|
|         .   o . |
|        . o  ..  |
|         . o  o E|
|          .... ..|
+-----------------+
[www@linux-node1 ~]$

 

翻看公钥

1
2
3
4
5
6
7
8
9
10
11
[www@linux-node1 ~]$ cd .ssh/
[www@linux-node1 .ssh]$ ll
total 8
-rw------- 1 www www 1679 Apr  5 03:41 id_rsa
-rw-r--r-- 1 www www  406 Apr  5 03:41 id_rsa.pub
[www@linux-node1 .ssh]$ cat id_rsa.pub
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDcZh8EEk2/rS6B/tLHnRpZGrGIJYFHg7zRFvuT3N9jvOFhYJdWv+8WSQuT0pvxNM4eR0N5Ma9wVvKPo/lVjCaFK+M0dENJVhi6m9OKMtoo2u
jvvuyinNPP4pyoK6ggG5jOlEkHoLcbWCRG/j3pN1rZYV+1twET9xi2IA4UQkgPvKKYWjq7NUR0v5BWsgEQt7VvjcLWTlltTVeGb3FDVKIjDnioIBmLmVwJS64N+GGgAj5YQ+bKHTwY
anEMD39JGKxo0RXTZB5sa734yfNjc3hTZXB4RCcGdzgcMJs/Rt5VeZ277zF86xr4Hd5cioAbV6Y1RvELjmpvrqUUz3tcaKId www@linux-node1.nmap.com
[www@linux-node1 .ssh]$

  

node2也添加node1的公钥

改成600权力才能健康登陆

1
2
3
4
5
6
7
8
9
[www@linux-node2 ~]$ cd .ssh/
[www@linux-node2 .ssh]$ vim authorized_keys
[www@linux-node2 .ssh]$ cat authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDcZh8EEk2/rS6B/tLHnRpZGrGIJYFHg7zRFvuT3N9jvOFhYJdWv+8WSQuT0pvxNM4eR0N5Ma9wVvKPo/lVjCaFK+M0dENJVhi6m9OKMtoo2u
jvvuyinNPP4pyoK6ggG5jOlEkHoLcbWCRG/j3pN1rZYV+1twET9xi2IA4UQkgPvKKYWjq7NUR0v5BWsgEQt7VvjcLWTlltTVeGb3FDVKIjDnioIBmLmVwJS64N+GGgAj5YQ+bKHTwY
anEMD39JGKxo0RXTZB5sa734yfNjc3hTZXB4RCcGdzgcMJs/Rt5VeZ277zF86xr4Hd5cioAbV6Y1RvELjmpvrqUUz3tcaKId www@linux-node1.nmap.com
[www@linux-node2 .ssh]$ chmod 600 authorized_keys
[www@linux-node2 .ssh]$

 

登入测试–成功

1
2
3
[www@linux-node1 .ssh]$ ssh 192.168.58.12
Last login: Mon Apr 10 00:31:23 2017 from 192.168.58.11
[www@linux-node2 ~]$

 

是时候换种更优雅的艺术安插你的php代码了,自动化安顿深度推行。让node壹的www用户ssh本人也不必要输入密码。

node壹增加公钥

本地也放本人的密钥,那样能够伪装模拟成三台机械。三个ssh免密钥的机械

node壹同时作为安顿机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[www@linux-node1 .ssh]$ ll
total 12
-rw------- 1 www www 1679 Apr  5 03:41 id_rsa
-rw-r--r-- 1 www www  406 Apr  5 03:41 id_rsa.pub
-rw-r--r-- 1 www www  175 Apr  5 03:43 known_hosts
[www@linux-node1 .ssh]$ vim authorized_keys
[www@linux-node1 .ssh]$ chmod 600 authorized_keys
[www@linux-node1 .ssh]$ ssh 192.168.58.11
The authenticity of host '192.168.58.11 (192.168.58.11)' can't be established.
ECDSA key fingerprint is 8b:4e:2f:cd:37:89:02:60:3c:99:9f:c6:7a:5a:29:14.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.58.11' (ECDSA) to the list of known hosts.
Last login: Wed Apr  5 03:40:47 2017
[www@linux-node1 ~]$ exit
logout
Connection to 192.168.58.11 closed.
[www@linux-node1 .ssh]$ ssh 192.168.58.11
Last login: Wed Apr  5 03:46:21 2017 from 192.168.58.11
[www@linux-node1 ~]$

  

发端写自动化安顿脚本

依赖地点的流程图,先把差不多框架写出来

先把框架写出来,然后各个函数里写echo

探访剧本试行流程是或不是万分

 

code_diff 拷贝差距安排文件

那是面向进程的一种开垦格局

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
[root@linux-node1 ~]# mkdir /scripts -p
[root@linux-node1 ~]# cd /scripts/
[root@linux-node1 scripts]# vim deploy.sh
[root@linux-node1 scripts]# chmod +x deploy.sh
[root@linux-node1 scripts]# ./deploy.sh
Usage: ./deploy.sh [ deploy | rollback ]
[root@linux-node1 scripts]# cat deploy.sh
#!/bin/bash
 
#Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
 
#Code Env
CODE_DIR="/deploy/code/deploy"
CONFIG_DIR="/deploy/config"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
 
usage(){
    echo  $"Usage: $0 [ deploy | rollback ]"
}
 
code_get(){
    echo code_get
}
 
code_build(){
    echo code_build
}
 
code_config(){
    echo code_config
}
 
code_tar(){
    echo code_tar
}
 
code_scp(){
    echo code_scp
}
 
cluster_node_remove(){
    echo cluster_node_remove
}
 
code_deploy(){
    echo code_deploy
}
 
config_diff(){
    echo config_diff
}
 
code_test(){
    echo code_test
}
 
cluster_node_in(){
    echo cluster_node_in
}
 
rollback(){
    echo rollback
}
 
main(){
    case $1 in
    deploy)
            code_get;
            code_build;
            code_config;
            code_tar;
            code_scp;
            cluster_node_remove;
            code_deploy;
            config_diff;
            code_test;
            cluster_node_in;
            ;;
    rollback)
            rollback;
            ;;
    *)
            usage;
    esac
 
}
main $1
[root@linux-node1 scripts]#

最末尾还要加个main,不然无法试行

 

本子再优化下

尽量不要让$一来回传,不然恐怕会乱

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
main(){
    DEPLOY_METHOD=$1
    case $DEPLOY_METHOD in
    deploy)
            code_get;
            code_build;
            code_config;
            code_tar;
            code_scp;
            cluster_node_remove;
            code_deploy;
            config_diff;
            code_test;
            cluster_node_in;
            ;;

  

 

此伏彼起周详剧本–加多日志和锁
一、凡是不记录日志的本子正是刷流氓,实践到哪一步战败的哟?
二、脚本是或不是足以四人共同实践?(最棒不用多人协同施行)不允许几人实施的话能够上锁

 

相似锁文件放下边目录下

1
2
3
4
[root@linux-node1 ~]# cd /var/run/lock/
[root@linux-node1 lock]# ls
iscsi lockdev lvm ppp subsys
[root@linux-node1 lock]#

咱俩得以独自增多个目录,给它用,因为权限难题,要求授权改动属组,大家采用tmp目录

主函数推行在此之前,应该先剖断锁文件是还是不是留存,执行的时候也相应改动那一个lock文件
既然3个地点用到了它,是不是足以把它构建成变量

新的本子如下,主要加多了锁的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
[root@linux-node1 scripts]# cat deploy.sh
#!/bin/bash
 
#Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
 
#Code Env
CODE_DIR="/deploy/code/deploy"
CONFIG_DIR="/deploy/config"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock"
 
usage(){
    echo  $"Usage: $0 [ deploy | rollback ]"
}
 
shell_lock(){
    touch ${LOCK_FILE}
}
shell_unlock(){
    rm -f ${LOCK_FILE}
}
 
code_get(){
    echo code_get
    sleep 60;
}
 
code_build(){
    echo code_build
}
 
code_config(){
    echo code_config
}
 
code_tar(){
    echo code_tar
}
 
code_scp(){
    echo code_scp
}
 
cluster_node_remove(){
    echo cluster_node_remove
}
 
code_deploy(){
    echo code_deploy
}
 
config_diff(){
    echo config_diff
}
 
code_test(){
    echo code_test
}
 
cluster_node_in(){
    echo cluster_node_in
}
 
rollback(){
    echo rollback
}
 
main(){
    if [ -f ${LOCK_FILE} ];then
    echo "Deploy is running"  && exit;
    fi
    DEPLOY_METHOD=$1
    case $DEPLOY_METHOD in
    deploy)
            shell_lock;
            code_get;
            code_build;
            code_config;
            code_tar;
            code_scp;
            cluster_node_remove;
            code_deploy;
            config_diff;
            code_test;
            cluster_node_in;
        shell_unlock;
            ;;
    rollback)
        shell_lock;
            rollback;
        shell_unlock;
            ;;
    *)
            usage;
    esac
 
}
main $1
[root@linux-node1 scripts]#

  

先试行下检查语法错误

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linux-node1 scripts]# ./deploy.sh deploy
code_get
code_build
code_config
code_tar
code_scp
cluster_node_remove
code_deploy
config_diff
code_test
cluster_node_in
[root@linux-node1 scripts]# ./deploy.sh rollback
rollback

  

加个sleep测试下锁的职能
给三个函数加下sleep 测试下实践中,此外的人是不是足以实施这几个本子

1
2
3
4
code_get(){
    echo code_get
    sleep 60;
}

  

运转脚本

1
2
[root@linux-node1 scripts]# ./deploy.sh deploy
code_get

新开荒三个窗口进行测试

例市场价格形下三个窗口进行安插,再开多个窗口确定实施不断

1
2
3
4
5
6
7
[root@linux-node1 scripts]# ./deploy.sh deploy
Deploy is running
[root@linux-node1 scripts]# ./deploy.sh deploy
Deploy is running
[root@linux-node1 scripts]# ./deploy.sh rollback
Deploy is running
[root@linux-node1 scripts]#

  

 

扩张日志成效

实际就是echo壹行到日志文件中,每一种函数写加echo 写到日志里,那样相比较low
能还是不可能写个日志函数,加时间戳。在此之前些天志函数能够复制到别的脚本里

1
2
3
4
5
[www@linux-node1 scripts]$ date "+%Y-%m-%d"
2017-04-23
[www@linux-node1 scripts]$ date "+%H-%M-%S"
22-10-34
[www@linux-node1 scripts]$

  

剧本默许从上到下施行,境遇函数先加载,但是不实行

持续优化下。如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
 
# Date/Time Veriables
CDATE=$(date "+%Y-%m-%d")
CTIME=$(date "+%H-%M-%S")
 
#Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
 
#Code Env
CODE_DIR="/deploy/code/deploy"
CONFIG_DIR="/deploy/config"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock"

 

还无法如此写,不然事后的时刻都以同样的
能够改成那样,它不会实行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
 
# Date/Time Veriables
CDATE='date "+%Y-%m-%d"'
CTIME='date "+%H-%M-%S"'
 
#Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
 
#Code Env
CODE_DIR="/deploy/code/deploy"
CONFIG_DIR="/deploy/config"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock"

打包的时候,也用到时刻戳命名了。还得用贰个定点不改变的小运用于打包
因为解压的时候,scp的时候用必须精通分明的包名字。
此处运用了1个时刻,log-date是让它不实践的,cdate是让它施行的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
 
# 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.sh"
SHELL_DIR="/home/www"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
 
#Code Env
CODE_DIR="/deploy/code/deploy"
CONFIG_DIR="/deploy/config"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"

 

温馨先测试下

1
2
3
4
5
6
7
[root@linux-node1 ~]# LOG_DATE='date "+%Y-%m-%d"'
[root@linux-node1 ~]# LOG_TIME='date "+%H-%M-%S"'
[root@linux-node1 ~]# echo $LOG_DATE
date "+%Y-%m-%d"
[root@linux-node1 ~]# echo $LOG_TIME
date "+%H-%M-%S"
[root@linux-node1 ~]#

  

eval的用法

1
2
3
4
5
[root@linux-node1 ~]# eval $LOG_TIME
22-21-05
[root@linux-node1 ~]# eval $LOG_DATE
2017-04-23
[root@linux-node1 ~]#

 

怎么能够让它在1行呢。目前没找到办法(倒是能够独立定义一个时日变量)

1
2
3
4
[root@linux-node1 ~]# eval $LOG_DATE && eval $LOG_TIME
2017-04-23
22-22-48
[root@linux-node1 ~]#   

独立定义两个时光变量(这里用不到,但是足以达成)

1
2
3
4
5
6
[root@linux-node1 ~]# D_T='date "+%Y-%m-%d-%H-%M-%S"'
[root@linux-node1 ~]# echo $D_T
date "+%Y-%m-%d-%H-%M-%S"
[root@linux-node1 ~]# eval $D_T
2017-04-26-19-33-01
[root@linux-node1 ~]#

澳门葡京备用网址 ,  

编写记录日志函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
usage(){
    echo  $"Usage: $0 [ deploy | rollback ]"
}
 
writelog(){
        LOGINFO=$1
        echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
}
 
shell_lock(){
        touch ${LOCK_FILE}
}
 
shell_unlock(){
        rm -f ${LOCK_FILE}
}

  

这样code_get函数就记下日志了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
shell_lock(){
        touch ${LOCK_FILE}
}
 
shell_unlock(){
        rm -f ${LOCK_FILE}
}
 
code_get(){
    writelog code_get;
}
 
code_build(){
    echo code_build
}

  

标准点,加上双引号,分号可要可不用,写上不会报错

1
2
3
4
5
6
7
8
9
10
11
shell_unlock(){
        rm -f ${LOCK_FILE}
}
 
code_get(){
   writelog "code_get";
}
 
code_build(){
    echo code_build
}

  

获得代码

把代码放哪儿?

缘何创制这么些目录,写着写着你就驾驭了

1
2
3
4
5
6
7
8
9
10
11
12
[root@linux-node1 scripts]# mkdir /deploy/config -p
[root@linux-node1 scripts]# mkdir /deploy/tmp -p
[root@linux-node1 scripts]# mkdir /deploy/tar -p
[root@linux-node1 scripts]# mkdir /deploy/code -p
[root@linux-node1 scripts]# cd /deploy/
[root@linux-node1 deploy]# ll
total 0
drwxr-xr-x 2 root root 6 Apr 23 22:37 code
drwxr-xr-x 2 root root 6 Apr 23 22:37 config
drwxr-xr-x 2 root root 6 Apr 23 22:37 tar
drwxr-xr-x 2 root root 6 Apr 23 22:37 tmp
[root@linux-node1 deploy]#

  

 

末段目录创设成那种

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linux-node1 deploy]# cd code/
[root@linux-node1 code]# mkdir web-demo -p
[root@linux-node1 code]# cd ..
[root@linux-node1 deploy]# tree
.
├── code
│   └── web-demo
├── config
├── tar
└── tmp
 
5 directories, 0 files
[root@linux-node1 deploy]#

  

修改剧本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/www"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
 
#Code Env
CODE_DIR="/deploy/code/web-demo"
CONFIG_DIR="/deploy/config"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock"
 
usage(){
    echo  $"Usage: $0 [ deploy | rollback ]"
}

  

局地无需编写翻译,拉下代码之后,能够先把铺排文件放进去

1
2
3
4
code_get(){
    writelog "code_get";
    cd $CODE_DIR  && git pull
}

  

配备文件不要放这么些目录下,那几个目录只用来更新—git
pull.你不佳剖断配置文件是仓库里面包车型客车,照旧你特别下载下来的(最好实行)
陈设的时候,只让此处目录实行git pull

下边那个目录用于整合配置文件。

1
TMP_DIR="/deploy/tmp"

  

一而再优化获替代码的函数

1
2
3
4
5
code_get(){
    writelog "code_get";
    cd $CODE_DIR  && git pull
    cp -r ${CODE_DIR} ${TMP_DIR}/
}

  

铺排操作的函数时候,感到不适当,应该分别体系,规范化。比如web-demo能够知道为二个品种包名字

1
2
3
4
5
6
#Code Env
CODE_DIR="/deploy/code/web-demo"
CONFIG_DIR="/deploy/config/web-demo"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock"

  

目录新建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@linux-node1 scripts]# cd /deploy/
[root@linux-node1 deploy]# cd config/
[root@linux-node1 config]# mkdir web-demo
[root@linux-node1 config]# cd ..
[root@linux-node1 deploy]# tree
.
├── code
│   └── web-demo
├── config
│   └── web-demo
├── tar
└── tmp
 
6 directories, 0 files
[root@linux-node1 deploy]#

  

模仿下,在内部写上hehe

1
2
3
4
5
6
[root@linux-node1 deploy]# cd config/
[root@linux-node1 config]# cd web-demo/
[root@linux-node1 web-demo]# vim config.ini
[root@linux-node1 web-demo]# cat config.ini
hehe
[root@linux-node1 web-demo]#

  

因为web-demo项目出现反复,把它弄成变量

1
2
3
4
5
6
7
#Code Env
PRO_NAME="web-demo"
CODE_DIR="/deploy/code/web-demo"
CONFIG_DIR="/deploy/config/web-demo"
TMP_DIR="/deploy/tmp"
TAR_DIR="/deploy/tar"
LOCK_FILE="/tmp/deploy.lock"

  

调度下脚本,优化code_config函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
code_get(){
    writelog "code_get";
    cd $CODE_DIR  && git pull
    cp -r ${CODE_DIR} ${TMP_DIR}/
}
 
code_build(){
    echo code_build
}
 
code_config(){
    echo code_config
    /bin/cp -r $CONFIG_DIR/* $TMP_DIR/$PRO_NAME
}

  

正式下,给变量加大括号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
code_get(){
    writelog "code_get";
    cd $CODE_DIR  && git pull
    cp -r ${CODE_DIR} ${TMP_DIR}/
}
 
code_build(){
    echo code_build
}
 
code_config(){
    echo code_config
    /bin/cp -r ${CONFIG_DIR}/* ${TMP_DIR}/"${PRO_NAME}"
}

小心是/bin/cp ,那样原本有陈设文件,这里可以向来交换了
设若开拓把安插文件打包进去了。连接的是测试的库,要是你安插生产景况了,连接测试的库。出了难题,哪个人背黑锅
运行是终极一道防线。开垦和测试没遇到。你背黑锅

 

该给包重命名了

1
2
3
4
5
code_config(){
    echo code_config
    /bin/cp -r ${CONFIG_DIR}/* ${TMP_DIR}/"${PRO_NAME}"
    PKG_NAME="${PRO_NAME}"_"${API_VER}"-"${CDATE}-${CTIME}"
}

  

三番五次优化

1
2
3
4
5
6
code_config(){
    echo 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}
}

  

增添版本号,先随意定义个版本

1
2
3
4
5
6
code_get(){
    writelog "code_get";
    cd $CODE_DIR  && git pull
    cp -r ${CODE_DIR} ${TMP_DIR}/
    API_VER="123"
}

  

方今尚未git pull 假装以echo 替代git pull

1
2
3
4
5
6
code_get(){
    writelog "code_get";
    cd $CODE_DIR  && echo "git pull"
    cp -r ${CODE_DIR} ${TMP_DIR}/
    API_VER="123"
}

  

属组授权

1
2
[root@linux-node1 scripts]# chown -R www:www /deploy/
[root@linux-node1 scripts]#

  

内容为hehe,生成代码(页面)

1
2
3
4
5
[root@linux-node1 scripts]# cd /deploy/code/web-demo/
[root@linux-node1 web-demo]# echo hehe>>index.html
[root@linux-node1 web-demo]# cat index.html
hehe
[root@linux-node1 web-demo]#

  

文件和目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@linux-node1 deploy]# tree
.
├── code
│   └── web-demo
│       └── index.html
├── config
│   └── web-demo
│       └── config.ini
├── tar
└── tmp
 
6 directories, 2 files
[root@linux-node1 deploy]#

  

以www用户测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@linux-node1 deploy]# cd /scripts/
[root@linux-node1 scripts]# chown -R www:www /scripts/deploy.sh
[root@linux-node1 scripts]# ll
total 12
-rw-r--r-- 1 root root  234 Apr  3 23:51 cobbler_list.py
-rw-r--r-- 1 root root 1533 Apr  4 00:01 cobbler_system_api.py
-rwxr-xr-x 1 www  www  1929 Apr 23 23:04 deploy.sh
[root@linux-node1 scripts]# su - www
Last login: Sun Apr 23 22:06:44 CST 2017 on pts/0
[www@linux-node1 scripts]$ ./deploy.sh  deploy
git pull
code_build
code_config
code_tar
code_scp
cluster_node_remove
code_deploy
config_diff
code_test
cluster_node_in
[www@linux-node1 scripts]$

  

测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[www@linux-node1 scripts]$ tree /deploy/
/deploy/
├── code
│   └── web-demo
│       └── index.html
├── config
│   └── web-demo
│       └── config.ini
├── tar
└── tmp
    ├── web-demo_123-2017-04-23-23-12-15
    │   ├── config.ini
    │   └── index.html
    └── web-demo_123-2017-04-23-23-13-20
        ├── config.ini
        └── index.html
 
8 directories, 6 files
[www@linux-node1 scripts]$

  

本子和岁月之间改成下划线

1
2
3
4
5
6
code_config(){
    echo 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}
}

  

再也施行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[www@linux-node1 scripts]$ ./deploy.sh deploy
git pull
code_build
code_config
code_tar
code_scp
cluster_node_remove
code_deploy
config_diff
code_test
cluster_node_in
[www@linux-node1 scripts]$ tree /deploy/
/deploy/
├── code
│   └── web-demo
│       └── index.html
├── config
│   └── web-demo
│       └── config.ini
├── tar
└── tmp
    ├── web-demo_123-2017-04-23-23-12-15
    │   ├── config.ini
    │   └── index.html
    ├── web-demo_123-2017-04-23-23-13-20
    │   ├── config.ini
    │   └── index.html
    └── web-demo_123_2017-04-23-23-17-20
        ├── config.ini
        └── index.html
 
9 directories, 8 files
[www@linux-node1 scripts]$

  

 

能够观望tmp目录需求按时清理

给下边一个函数加写日志成效

1
2
3
4
5
6
7
8
9
10
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"
}

  

包裹,记录日志

1
2
3
4
5
code_tar(){
    writelog "code_tar"
    cd ${TMP_DIR} && tar cfz ${PKG_NAME}.tar.gz ${PKG_NAME}
    writelog "${PKG_NAME}.tar.gz"
}

  

再度测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[www@linux-node1 scripts]$ ./deploy.sh deploy
git pull
code_build
code_scp
cluster_node_remove
code_deploy
config_diff
code_test
cluster_node_in
[www@linux-node1 scripts]$ tree /deploy/
/deploy/
├── code
│   └── web-demo
│       └── index.html
├── config
│   └── web-demo
│       └── config.ini
├── tar
└── tmp
    ├── web-demo_123-2017-04-23-23-12-15
    │   ├── config.ini
    │   └── index.html
    ├── web-demo_123-2017-04-23-23-13-20
    │   ├── config.ini
    │   └── index.html
    ├── web-demo_123_2017-04-23-23-17-20
    │   ├── config.ini
    │   └── index.html
    ├── web-demo_123_2017-04-23-23-22-09
    │   ├── config.ini
    │   └── index.html
    └── web-demo_123_2017-04-23-23-22-09.tar.gz
 
10 directories, 11 files
[www@linux-node1 scripts]$

  

 

 

希图拷贝到目的服务器

前四步都得了,开头第四步–拷贝到对象服务器

澳门葡京备用网址 2

 

 遍历节点

1
2
3
4
5
[www@linux-node1 scripts]$ node_list="192.168.58.11 192.168.58.12"
[www@linux-node1 scripts]$ for node in $node_list;do echo $node;done
192.168.58.11
192.168.58.12
[www@linux-node1 scripts]$

  

本子里充足node_list

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
 
#Node List
NODE_LIST="192.168.58.11 192.168.58.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")

  

 分发到目的节点

1
2
3
4
5
6
code_scp(){
    echo code_scp
    for node in $NODE_LIST;do
      scp ${TMP_DIR}/${PKG_NAME}.tar.gz   $node:/opt/webroot/
      done
}

  

二台机器建构webroot

1
2
3
4
5
6
[root@linux-node1 scripts]# mkdir /opt/webroot -p
[root@linux-node1 scripts]# chown -R www:www /opt/webroot
[root@linux-node1 scripts]#
[root@linux-node2 ~]# mkdir /opt/webroot -p
[root@linux-node2 ~]# chown -R www:www /opt/webroot
[root@linux-node2 ~]#

  

 完善拷贝函数

1
2
3
4
5
6
code_scp(){
    echo code_scp
    for node in $NODE_LIST;do
      scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
      done
}

  

 

双重布署测试下

1
2
3
4
5
6
7
8
9
10
11
12
[www@linux-node1 scripts]$ ./deploy.sh deploy
git pull
code_build
code_scp
web-demo_123_2017-04-23-23-33-50.tar.gz                100%  204     0.2KB/s   00:00   
web-demo_123_2017-04-23-23-33-50.tar.gz                100%  204     0.2KB/s   00:00   
cluster_node_remove
code_deploy
config_diff
code_test
cluster_node_in
[www@linux-node1 scripts]$

  

检查

1
2
3
4
5
6
7
8
9
10
11
12
[www@linux-node1 scripts]$ tree /opt/webroot/
/opt/webroot/
└── web-demo_123_2017-04-23-23-33-50.tar.gz
 
0 directories, 1 file
[www@linux-node1 scripts]$
[root@linux-node2 ~]# tree /opt/webroot/
/opt/webroot/
└── web-demo_123_2017-04-23-23-33-50.tar.gz
 
0 directories, 1 file
[root@linux-node2 ~]#

  

 该第6步了,写个日志代替

澳门葡京备用网址 3

1
2
3
cluster_node_remove(){
writelog "cluster_node_remove"
}

 

解压完成,拷贝差别文件。你要把差距文件单独放一个目录下。不要和配备文件放1块

修改上边,上边是平等配置目录文件

1
2
3
4
5
6
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}
}

改成如下

1
2
3
4
5
6
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}
}

  

始建布局文件目录,base存放一样的安顿,other存放差别配置

1
2
3
4
5
6
7
8
9
[www@linux-node1 scripts]$ cd /deploy/config/web-demo/
[www@linux-node1 web-demo]$ mkdir base
[www@linux-node1 web-demo]$ mkdir other
[www@linux-node1 web-demo]$ ll
total 4
drwxrwxr-x 2 www www 6 Apr 23 23:38 base
-rw-r--r-- 1 www www 5 Apr 23 22:46 config.ini
drwxrwxr-x 2 www www 6 Apr 23 23:38 other
[www@linux-node1 web-demo]$

 

调动下安插文件所在目录

1
2
3
4
5
6
7
[www@linux-node1 web-demo]$ mv config.ini base/
[www@linux-node1 web-demo]$ cd other/
[www@linux-node1 other]$ echo 192.168.58.12-config >>192.168.58.12.crontab.xml
[www@linux-node1 other]$ ll
total 4
-rw-rw-r-- 1 www www 21 Apr 23 23:39 192.168.58.12.crontab.xml
[www@linux-node1 other]$

  

拷贝差距文件到对象服务器的目的目录

1
2
3
4
5
6
7
8
9
code_deploy(){
    echo code_deploy
    cd /opt/webroot/ && tar xfz ${PKG_NAME}.tar.gz
}
 
config_diff(){
    echo config_diff
    scp ${CONFIG_DIR}/other/192.168.58.12.crontab.xml 192.168.58.12:/opt/webroot/${PKG_NAME}
}

  

再次测试

1
2
3
4
5
6
7
8
9
10
11
12
[www@linux-node1 scripts]$ ./deploy.sh deploy
git pull
code_build
code_scp
web-demo_123_2017-04-23-23-43-48.tar.gz                       100%  204     0.2KB/s   00:00   
web-demo_123_2017-04-23-23-43-48.tar.gz                       100%  204     0.2KB/s   00:00   
code_deploy
config_diff
192.168.58.12.crontab.xml                                     100%   21     0.0KB/s   00:00   
code_test
cluster_node_in
[www@linux-node1 scripts]$

  

上边还有不足的地方,scp到目的服务器并解压,应该运用ssh远程试行、。上边脚本远程node二上解压是没戏的
本子再度改换下,把安插的函数和距离配置合并到联合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster_node_remove(){
    writelog "cluster_node_remove"
}
 
code_deploy(){
    echo code_deploy
    for node in $NODE_LIST;do
      ssh $node "cd /opt/webroot/ && tar xfz ${PKG_NAME}.tar.gz"
    done
    scp ${CONFIG_DIR}/other/192.168.58.12.crontab.xml 192.168.58.12:/opt/webroot/${PKG_NAME}/crontab.xml
}
 
code_test(){
    echo code_test
}

  

创建webroot

1
2
3
4
5
6
7
8
[root@linux-node1 ~]# mkdir /webroot
[root@linux-node1 ~]# chown -R www:www /webroot
[root@linux-node1 ~]#
 
 
[root@linux-node2 ~]# mkdir /webroot
[root@linux-node2 ~]# chown -R www:www /webroot
[root@linux-node2 ~]#

  

再也对配置函数优化,增添应用软链接参数(这一个是秒级回滚的重要)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cluster_node_remove(){
    writelog "cluster_node_remove"
}
 
code_deploy(){
    echo code_deploy
    for node in $NODE_LIST;do
      ssh $node "cd /opt/webroot/ && tar xfz ${PKG_NAME}.tar.gz"
    done
    scp ${CONFIG_DIR}/other/192.168.58.12.crontab.xml 192.168.58.12:/opt/webroot/${PKG_NAME}/crontab.xml
    ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo
}
 
code_test(){
    echo code_test
}

  

重新对剧本优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cluster_node_remove(){
    writelog "cluster_node_remove"
}
 
code_deploy(){
    echo code_deploy
    for node in $NODE_LIST;do
      ssh $node "cd /opt/webroot/ && tar xfz ${PKG_NAME}.tar.gz"
    done
    scp ${CONFIG_DIR}/other/192.168.58.12.crontab.xml 192.168.58.12:/opt/webroot/${PKG_NAME}/crontab.xml
    rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo
}
 
code_test(){
    echo code_test
}

  

自动化布署的精髓,创设软链接

对台本优化,各个服务器要实践同一的操作,因而放在循环里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cluster_node_remove(){
    writelog "cluster_node_remove"
}
 
code_deploy(){
    echo code_deploy
    for node in $NODE_LIST;do
      ssh $node "cd /opt/webroot/ && tar xfz ${PKG_NAME}.tar.gz"
      rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo
    done
    scp ${CONFIG_DIR}/other/192.168.58.12.crontab.xml 192.168.58.12:/opt/webroot/${PKG_NAME}/crontab.xml
}
 
code_test(){
    echo code_test
}

  

拷贝差别文件应当创设软链接之后拷贝,其实正是门路写的少点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cluster_node_remove(){
    writelog "cluster_node_remove"
}
 
code_deploy(){
    echo code_deploy
    for node in $NODE_LIST;do
      ssh $node "cd /opt/webroot/ && tar xfz ${PKG_NAME}.tar.gz"
      rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo
    done
    scp ${CONFIG_DIR}/other/192.168.58.12.crontab.xml 192.168.58.12:/webroot/web-demo/crontab.xml
}
 
code_test(){
    echo code_test
}

 

首先次没软链接,会报错。须求先手动创制个软连接,或然先创制web-demo目录

实际上自个儿觉的完全可以在上头脚本里进入mkdir /webroot/web-demo -p
那样恒久不会错

1
2
3
4
5
[www@linux-node1 scripts]$ cd /webroot/
[www@linux-node1 webroot]$ mkdir web-demo -p
[www@linux-node1 webroot]$
[root@linux-node2 webroot]# mkdir web-demo -p
[root@linux-node2 webroot]#

  

重复实施安排脚本。node一落成了

接二连三优化脚本,rm -rf 这里要写为-rf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cluster_node_remove(){
    writelog "cluster_node_remove"
}
 
code_deploy(){
    echo code_deploy
    for node in $NODE_LIST;do
      ssh $node "cd /opt/webroot/ && tar xfz ${PKG_NAME}.tar.gz"
      ssh $node "rm -rf /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
    done
    scp ${CONFIG_DIR}/other/192.168.58.12.crontab.xml 192.168.58.12:/webroot/web-demo/crontab.xml
}
 
code_test(){
    echo code_test
}

  

测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
[www@linux-node1 scripts]$ ./deploy.sh deploy
git pull
code_build
code_scp
web-demo_123_2017-04-24-00-01-24.tar.gz                       100%  204     0.2KB/s   00:00   
web-demo_123_2017-04-24-00-01-24.tar.gz                       100%  204     0.2KB/s   00:00   
code_deploy
192.168.58.12.crontab.xml                                     100%   21     0.0KB/s   00:00   
./deploy.sh: line 113: config_diff: command not found
code_test
cluster_node_in
[www@linux-node1 scripts]$

主函数里,删除那些 config_diff

 

接轨测试和检讨

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
测试
[www@linux-node1 scripts]$ ./deploy.sh deploy
git pull
code_build
code_scp
web-demo_123_2017-04-24-00-02-44.tar.gz                       100%  205     0.2KB/s   00:00   
web-demo_123_2017-04-24-00-02-44.tar.gz                       100%  205     0.2KB/s   00:00   
code_deploy
192.168.58.12.crontab.xml                                     100%   21     0.0KB/s   00:00   
code_test
cluster_node_in
[www@linux-node1 scripts]$
检查
[www@linux-node1 scripts]$ ll /webroot/
total 0
lrwxrwxrwx 1 www www 45 Apr 24 00:02 web-demo -> /opt/webroot/web-demo_123_2017-04-24-00-02-44
[www@linux-node1 scripts]$
 
[root@linux-node2 webroot]# ll /webroot/
total 0
lrwxrwxrwx 1 www www 45 Apr 24 00:02 web-demo -> /opt/webroot/web-demo_123_2017-04-24-00-02-44
[root@linux-node2 webroot]#

  

效仿版本更新,把版本写成45陆

1
2
3
4
5
6
code_get(){
    writelog "code_get";
    cd $CODE_DIR  && echo "git pull"
    cp -r ${CODE_DIR} ${TMP_DIR}/
    API_VER="456"
}

  

此伏彼起测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[www@linux-node1 scripts]$ ./deploy.sh deploy
git pull
code_build
code_scp
web-demo_456_2017-04-24-00-04-05.tar.gz                       100%  204     0.2KB/s   00:00   
web-demo_456_2017-04-24-00-04-05.tar.gz                       100%  204     0.2KB/s   00:00   
code_deploy
192.168.58.12.crontab.xml                                     100%   21     0.0KB/s   00:00   
code_test
cluster_node_in
[www@linux-node1 scripts]$ ll /webroot/
total 0
lrwxrwxrwx 1 www www 45 Apr 24 00:04 web-demo -> /opt/webroot/web-demo_456_2017-04-24-00-04-05
[www@linux-node1 scripts]$

检查

链接 到了新的本子

  1. 先把线上的代码用ftp备份下来

  2. 上传修改了的文书

  3. 测试一下效果是或不是日常

  4. 网址500了,赶紧用备份替换回去

  5. 轮换错了/替换漏了

  6. 一台服务器公布成功

  7. 报到每1台施行二回宣布操作

  8. 突击搞定

  9. COO娘发飙

一.贰 设计活动铺排代码

流程设计,分明目的

壹.二.一 自动布署遭遇

壹.支付条件

开辟者本地有自身的意况,运转配置公共开销遭受,大家可共用的劳务。举例:开垦数据库MySQL,redis,Memcached等

2.测试处境

职能测试以及品质测试。

叁.预生产条件

生产意况集群中的某二个节点,并且总是生产库。(不对外,不做破坏性操作。)

四.灰度条件

凭仗分裂的区域开始展览分割。(生产情形)

伍.生育情形

对用户提供劳动的意况。

预生产情状原因:

1.数据库不同,测试意况和生育情形数据库是不壹致的。
2.应用生产条件的联调接口;比方:支付接口。(电商职业)

尤为今后的互连网行业,讲究飞快迭代,小步快跑。像bug修复只怕小功能的改换大约每日都发版本,大职能的版本迭代每一周也大多会有3次。相信广周口行们像自家下边说的这么公布自身的代码吧。也许恐怕升高一点,直接去服务器上实行一条看似git
pull的吩咐拖下宾馆中的代码,不过如若你的代码运营在集群中呢?每台机械登入3遍施行2次git
pull吗?借使开掘代码有难点亟需回滚呢?

1.二.二 自动布署布置

  • 曾经有3个足以上线的代码在git旅社。
  • 大家前日要做13个集群节点的一键铺排,秒级回滚。
  • 具备的web服务,都应有使用普通用户。(强烈建议)
  • 享有的web服务都不应有监听80端口,除了负载均衡。
  • 那我们怎么样规划一套生产自动化安插系统。

1.规划。
2.实现。
3.计算和扩充。(PDCA方法论)
肆.生产景况应用。

金玉满堂思路:

一.代码放置地方

Git(优先)、Svn

二.获取最新代码

  • git pull获取最新分支(更新十分频仍,没有特别严苛的花色管理集团。)
  • git tag 获取钦命标签版本(更新未有那么频仍,有自然的类型管理的团伙。)
  • git commit获取钦命版本号

三.差距化解

  • 逐1节点之间差别
  • 代码仓库和骨子里的差别。配置文件是或不是位于代码仓库中。(配置单独开始展览存放,config.example
    )短信接口,支付,等趁机音讯不让全体费用知道
  • 联合的.集群有十个节点。(Job节点 crontab.xml 配置文件不等同)

④.项目名称怎么样统一计划

项目名称_环境名称_版本_分支_时间_某开发提交
测试: rainbow_test_v1.1.1_dev_2016-08-11_12:12_wanyongzhen
生产: rainbow_pro_v1.1.1_master_2016-08-11_11:11_wanyongzhen

伍.怎样翻新

php,tomcat须求重启,重新软链接。

六.什么样测试

测试(关键的页面,API,后台等)
测试八个预生产条件,通过则再而三配备,即便战败,退出陈设操作。

7.笔录日志

能够配备总结。
打响多少次。
倒闭多少次。
回滚多少次。

八.多少人同时进行脚本

避防多个人操作形成重复上线失利。通过lock锁对文件进行支配。

9.串行,并行

机械少的意况串行感到不出什么。假诺机器过多则会异常的慢。
分组布署并行布置,以及分组测试。
测试二个预生产条件,通过则持续安排,倘使失利,退出安排操作。

10.什么进行

1.shell执行
2.web分界面点击(自定义或jenkins)

11.怎么着兑现平日回退,以及迫切回退(回滚的须要性)

通过软链接的格局来促成代码秒等级回退。

如若你还在像本身上边说的那种格局计划自身的代码的话,那么本人希望你能耐心看完那篇小说,从此摆脱代码计划之痛。

1.二.三 自动安插难点

在大公司推进自动化布署上线,是有不少的难处,根据个体集团的不等,来抉择区别的办法来打开推进。

自动化推进难题:

  • 力量(个人力量,团队力量)
  • 任务(责任是还是不是承受,敢于承责)
  • 合营社流程、人士、组织架构。

可透过如下方法拉动:

  • 目的化沟通。
  • 任务细分
  • ITIL
  • 品类管理:PMBOOK

 

1.三 自动安顿实行

全总集群自动化布置流程设计如下:
可依赖如下思路,结合集团实际上海工业作来编排shell脚本只怕Python。

  • 获取最新代码
  • 编译(可选)
  • 计划文件(软连接或然拷贝)。
  • 卷入(tar,加速传输)
  • 文本分发(Scp 福睿斯sync Salt)(无需密码验证)
  • 将对象服务器移除集群(注释配置文件)
  • 解压
  • 制止webroot站点目录
  • scp差别文件(恐怕有一个节点配置文件不壹致)
  • 重启Web服务
  • 测试

实质上绕了如此壹圈后日是想向我们介绍一下用php写的代码发表工具:deployer。

一.四 经常回退实践

  • 列出回滚版本
  • 目的服务器移除集群
  • 进行回滚
  • 重启并测试
  • 投入集群

deployer具备以下吸引人的表征:

一.伍 火急回退试行

  • 列出回滚版本(ls -l或find查出对应的历史版本)。
  • 试行回滚操作(删除软链接,重建软链接)。
  • 重启对应服务。

– 快捷     
采用了诸如并发公布、ssh通道复用、缓存可用情状下使用缓存等本领加快代码布署

一.六 自动安顿采坑

自动化陈设php蒙受仍然java境况的长河中,那么您早晚遭受了之类的标题。

  • 怎么运用到你的生育遇到。
  • 回退到“上一个”“正常”版本。
  • 自动计划软连接的坑。
    • PHP假如展开Opcache,要求重启PHP,或许清理opcache
    • Java 汤姆cat是必供给重启,最棒每一次清理work,tmp缓存目录。

– 原子安顿  
在新发布的版本内实行全部定义的操作,诸如下载信赖、设置文件访问权限等都不会间接影响线上,唯有全体打响后,最后一步设置软链才会真正替换线上代码

一.7 自动化系统营造执行-运行种类

– 神速回滚   由于使用了原子陈设,所以回滚也只是再次设置一下软链指向

一.柒.一 蒙受策动

第三在实施脚本前,先搞好初始化境遇,最好是因而saltstack来完毕。小编这里未有那么多机器,就先用两台演示。

  • linux-node1 192.168.90.201
  • linux-node2 192.168.90.202

1.创设普通用户

useradd wanyuetian
passwd wanyuetian

二.布署密钥

[root@linux-node1 ~]# su - wanyuetian #切换至普通用户
[wanyongzhen@Linux-node1 ~]$ ssh-keygen -t dsa #生成密钥    
Generating public/private dsa key pair.
Enter file in which to save the key (/home/wanyuetian/.ssh/id_dsa):  #默认回车一路
/home/wanyuetian/.ssh/id_dsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/wanyuetian/.ssh/id_dsa. #这是钥匙
Your public key has been saved in /home/wanyuetian/.ssh/id_dsa.pub. #这是锁
The key fingerprint is:
39:6f:d8:42:61:d7:c3:f9:4b:e7:fb:b0:af:52:cd:59 wanyuetian@nfs-server
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|           o .   |
|        o . =    |
|       . +   o  E|
|        S     oo+|
|       . =   ..=o|
|        o +  .o .|
|         o  .  o.|
|             .o++|
+-----------------+
[wanyuetian@nfs-server ~]$ ssh-copy-id -i ~/.ssh/id_dsa.pub wanyuetian@192.168.90.202  #公钥分发给其他服务器
wanyuetian@192.168.90.202's password: 
Now try logging into the machine, with "ssh 'wanyuetian@192.168.90.202'", and check in:
  .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
[wanyuetian@nfs-server ~]$ ssh -p22 wanyuetian@192.168.90.202       #使用wanyuetian用户登录node2节点服务器
Last login: Wed Aug 10 17:59:02 2016 from 192.168.90.201
[wanyuetian@linux-node2 ~]$ #成功登录

3.开立连锁目录

mkdir /deploy/
mkdir -p /deploy/code/rainbow_pro
mkdir -p /deploy/source/rainbow_pro
mkdir -p /deploy/config/rainbow_pro/config
mkdir -p /deploy/config/rainbow_pro/admin_config
mkdir -p /deploy/tmp
mkdir -p /home/wanyuetian/webroot
chown -R www:www /deploy
chown -R www:www /home/wanyuetian/webroot

4.配置Nginx

user wanyuetian;  #指定用户
root  /home/wanyuetian/webroot/rainbow_pro; #指定项目路径

5.配置好git环境

  • centos7部署gitlab
  • 仿造项目可参看 git远程宾馆创造与创立

谈起底效果如下:

[wanyuetian@linux-node1 ~]$ ll /deploy/source/rainbow_pro/
总用量 4
-rw-rw-r-- 1 wanyuetian wanyuetian   34 8月  12 18:05 index.html

– 并发铺排   集群碰到下,并发在有着机器上实践同样的计划流程

1.7.二 剖析脚本

翻开脚本,具体配和自动化运转之自动化布署系统构建及演变小说来解读

[wanyuetian@linux-node1 ~]$ cat deploy.sh
#!/bin/bash
# useradd wanyuetian  && sshkey需认证
# Nginx 权限必须让wanyuetian用户可访问
# Dir List
# mkdir -p /deploy/code/rainbow_pro  # web code的仓库
# mkdir -p /deploy/source/rainbow_pro #存放git源码仓库
# mkdir -p /deploy/config/rainbow_pro/config  #存放config信息
# mkdir -p /deploy/config/rainbow_pro/admin_config  #存放后台config信息
# mkdir -p /deploy/tmp
# Web Root Dir
# mkdir -p /home/wanyuetian/webroot
# chown web
# chown -R www:www /deploy
# chown -R www:www /home/wanyuetian/webroot
# Code Env
PRO_NAME="rainbow_pro"
CODE_DIR="/deploy/code/$PRO_NAME"
SOURCE_DIR="/deploy/source/$PRO_NAME"
CONFIG_DIR="/deploy/config/$PRO_NAME"
WEB_DIR="/home/wanyuetian/webroot"
TMP_DIR="/deploy/tmp"
# Node List
PRE_LIST="192.168.90.201"
GROUP1_LIST="192.168.90.202"
ROLLBACK_LIST="192.168.90.201 192.168.90.202"
# Date/Time Veriables
CTIME=$(date "+%F-%H-%M")
# Shell Env
SHELL_NAME="deploy.sh"
SHELL_DIR="/home/wanyuetian/webroot"
# Log
LOG_FILE="${SHELL_DIR}/${SHELL_NAME}".log
LOCK_FILE="/tmp/deploy.lock"
# Lock
shell_lock(){
    touch ${LOCK_FILE}
}
shell_unlock(){
    rm -f ${LOCK_FILE}
}
# URL Test
url_test(){
    URL=$1
    curl -s --head $URL |egrep '200|301|302'
    if [ $? -ne 0 ];then
        shell_unlock;
        echo  "test error" && exit;
    fi
}
# log 
writelog(){
    LOGINFO=$1
    echo "${CTIME}: ${SHELL_NAME} : ${LOGINFO}" >> ${LOG_FILE}
}
code_get(){
    writelog "code_get"
    cd $SOURCE_DIR && git pull
    GIT_CID=$(git log|awk 'NR==1{print $2}'|cut -c 1-6)
    PKG_VER="${CTIME}_${GIT_CID}"
    PKG_NAME="${PRO_NAME}_${PKG_VER}"
    cp -r ${SOURCE_DIR} ${TMP_DIR}/${PKG_NAME}
}
code_bulid(){
    echo code_bulid #由于php没有编译过程
}
code_config(){
    writelog "code_config"
    /bin/cp -r ${CONFIG_DIR}/config.php ${TMP_DIR}/${PKG_NAME}/config.php
}
code_tar(){
    writelog "code_tar"
    cd ${TMP_DIR} && tar czf ${PKG_NAME}_tar.gz ${PKG_NAME} --exclude=.git --exclude=.gitignore
    writelog "${PKG_NAME}_tar.gz"
}
code_scp(){
    writelog "code_scp"
    for node in $PRE_LIST;do
        scp ${TMP_DIR}/${PKG_NAME}_tar.gz $node:${TMP_DIR}/
    done
    for node in $GROUP1_LIST;do
        scp ${TMP_DIR}/${PKG_NAME}_tar.gz $node:${TMP_DIR}/
    done
}
pre_deploy(){
    writelog "remove from cluster"
    ssh $PRE_LIST "cd ${TMP_DIR} && tar xf ${PKG_NAME}_tar.gz -C ${CODE_DIR}/"
    ssh $PRE_LIST "rm -f $WEB_DIR/${PRO_NAME} && ln -s ${CODE_DIR}/${PKG_NAME} $WEB_DIR/${PRO_NAME}"
}
pre_test(){
    url_test "http://${PRE_LIST}/index.html"
    echo "Rre add to cluster"
}
group1_deploy(){
        writelog "remove from cluster"
    for node in $GROUP1_LIST;do
            ssh $node "cd ${TMP_DIR} && tar xf ${PKG_NAME}_tar.gz -C ${CODE_DIR}/"
            ssh $node "rm -f $WEB_DIR/${PRO_NAME} && ln -s ${CODE_DIR}/${PKG_NAME} $WEB_DIR/${PRO_NAME}"
    done
   #scp ${CONFIG_DIR}/other/192.168.90.201.crontab.xml 192.168.90.201:/$WEB_DIR/${PRO_NAME}/crontab.xml 额外不一样的配置可能需要用到
}
group1_test(){
        url_test "http://${GROUP1_LIST}/index.html"
        echo "group1_node add to cluster"
}
code_reload(){
    systemctl restart php-fpm  #重启php清楚opcode缓存
}
rollback_list(){
  for node in $GROUP1_LIST;do
        ssh $node ls -l "$WEB_DIR" &&\
        ssh $node find "$CODE_DIR/" -maxdepth 1 -mtime -2|sed 1d|awk -F '/' '{print $5}'
        #find "$CODE_DIR" -type d -name "$PRO_NAME*" -mtime +30|xargs rm -fr
  done
}
rollback_fun(){
  if [ -z $ROOLBACK ];then
    shell_unlock;
    echo "Please input rollback version" && exit;
else
    for node in $ROLLBACK_LIST;do
    ssh $node rm -f $WEB_DIR/${PRO_NAME} && \
    ssh $node ln -s ${CODE_DIR}/$ROOLBACK $WEB_DIR/${PRO_NAME}
    done
fi
}
main(){
  if [ -f "$LOCK_FILE" ];then
    echo "Deploy is Running" && exit;
  fi
  DEPLOY_METHOD="$1"
  ROOLBACK="$2"
  case $DEPLOY_METHOD in
    deploy)
        shell_lock;
        code_get;
        code_bulid;
        code_config;
        code_tar;
        code_scp;
        pre_deploy;
        pre_test;
        group1_deploy;
        group1_test;
    #   group2_deploy;
    #   group2_test;
        shell_unlock;
        ;;
    list)
    rollback_list;
        ;;
    rollback)
        shell_lock;
        rollback_fun $ROLLBACK;
        shell_unlock;
        ;;
    *)
        echo "$Usage:$0 [ deploy | list | rollback ]"
    esac
}
main $1 $2

推行上线:

[wanyuetian@linux-node1 ~]$ sh deploy.sh deploy
Already up-to-date.
code_bulid
rainbow_pro_2016-08-12-21-16_46236b_tar.gz                                     100% 6016KB   5.9MB/s   00:00
rainbow_pro_2016-08-12-21-16_46236b_tar.gz                                     100% 6016KB   5.9MB/s   00:00
rainbow_pro_2016-08-12-21-16_46236b_tar.gz                                     100% 6016KB   5.9MB/s   00:00
HTTP/1.1 200 OK
Rre add to cluster
HTTP/1.1 200 OK
HTTP/1.1 200 OK
group1_node add to cluster
php-fpm restart

翻看当前版本

[wanyuetian@linux-node1 ~]$ sh deploy.sh list
总用量 16
lrwxrwxrwx 1 wanyuetian wanyuetian    60 8月  12 21:16 rainbow_pro -> /deploy/code/rainbow_pro/rainbow_pro_2016-08-12-21-16_46236b
rainbow_pro_2016-08-12-19-24_46236b
rainbow_pro_2016-08-12-21-16_46236b
总用量 0
lrwxrwxrwx 1 wanyuetian wanyuetian 60 8月  12 21:16 rainbow_pro -> /deploy/code/rainbow_pro/rainbow_pro_2016-08-12-21-16_46236b
rainbow_pro_2016-08-12-19-24_46236b
rainbow_pro_2016-08-12-21-16_46236b

实施回滚操作

[wanyuetian@linux-node1 ~]$ sh deploy.sh rollback #直接执行是不允许的
Please input rollback version
[wanyuetian@linux-node1 ~]$ sh deploy.sh rollback rainbow_pro_2016-08-12-19-24_46236b #这个操作一定要配合list来做。

翻开已经回退到1九点的本子

[wanyuetian@linux-node1 ~]$ sh deploy.sh list
总用量 16
-rw-rw-r-- 1 wanyuetian wanyuetian 14224 8月  12 21:16 deploy.sh.log
lrwxrwxrwx 1 wanyuetian wanyuetian    60 8月  12 21:18 rainbow_pro -> /deploy/code/rainbow_pro/rainbow_pro_2016-08-12-19-24_46236b
rainbow_pro_2016-08-12-19-24_46236b
rainbow_pro_2016-08-12-21-16_46236b
总用量 0
lrwxrwxrwx 1 wanyuetian wanyuetian 60 8月  12 21:18 rainbow_pro -> /deploy/code/rainbow_pro/rainbow_pro_2016-08-12-19-24_46236b
rainbow_pro_2016-08-12-19-24_46236b
rainbow_pro_2016-08-12-21-16_46236b

查阅日志:

[wanyuetian@linux-node1 ~]$ cat webroot/deploy.sh.log
2016-08-12-21-35: deploy.sh : code_get
2016-08-12-21-35: deploy.sh : code_config
2016-08-12-21-35: deploy.sh : code_tar
2016-08-12-21-35: deploy.sh : rainbow_pro_2016-08-12-21-35_46236b_tar.gz
2016-08-12-21-35: deploy.sh : code_scp
2016-08-12-21-35: deploy.sh : remove from cluster
2016-08-12-21-35: deploy.sh : remove from cluster

– 壹致性    
集群情况下,只有具备机器都举办成功才算成功,一台退步则整个倒闭

壹.柒.叁 脚本其余职能

理当如此此脚本功用不唯有如此,能够通过git分支,git
tag包等艺术来上线,那个依据贵公司的现实性事情来拓展调节,也得以团结开采七个web分界面来调用此脚本,那样就足以将上线职业付出开垦,当然也能够运用开源jenkins来贯彻。

– 内置四个框架公布模板   比方Laravel、Yii、Symfony、CodeIgniter、Zend
Framework等

一.七.四 后期更新

(如上脚本)+gitlab+jenkins+Sonar 创设自动化陈设代码,并代码公布前品质管理

– 易扩张     很轻巧能够凭仗自个儿的门类用Common模板编写发布流程

安装: 

composer global require deployer/deployer

设置到位后,切换来协和的档案的次序目录,推行dep
init,遵照自个儿项目采纳的框架选用生成的布局模板:

➜  tb dep init
Please select your project type (defaults to common):
  [0] Common
  [1] Laravel
  [2] Symfony
  [3] Yii
  [4] Zend Framework
  [5] CakePHP
  [6] CodeIgniter
  [7] Drupal
 > 0

即便你的框架未选拔方面列出的任何1个框架,则选用0,然后回车,就可以转变通用的发布模板。

施行完这一步应该会在您的品类根目录生成2个deploy.php文件,你所须要的做的全数就是编写那些本子,填写部分自个儿的服务器和连串陈设,然后定制一些task。

下边作者将用一个实际的安插文件来介绍deployer的应用,配置文件如下:

 

<?php
namespace Deployer;

use Symfony\Component\Console\Input\InputOption;

require 'recipe/common.php';

option('tag', null, InputOption::VALUE_OPTIONAL, '发布的tag');

// 全局配置文件   
set('ssh_type', 'native');    // 登录远程主机使用的方式,有三种:phpseclib(默认方式)、native、ext-ssh2
set('ssh_multiplexing', true);  // 是否开启ssh通道复用技术(开启可以降低服务器和本地负载,并提升速度)
set('keep_releases', 10); //    报错10个之前版本,设置为-1表示一直保存历史版本
set('repository', 'git@xxxxxxx.com:loc/loc-api.git');    // 代码仓库的地址,只支持git
set('branch', 'master');    // 发布代码时候默认使用的分支
set('shared_files', []);    // 共享文件列表   这里面列出的文件会被移动到项目根目录的shared目录下,并做软链
set('shared_dirs', []);     // 共享目录    同上
set('writable_mode', 'chmod');  // 采用哪种方式控制可写权限,有4中:chown、chgrp、chmod、acl(默认方式)
set('writable_chmod_mode', '0755'); // 当使用chmod控制可写权限的时候,赋予的可写权限值
set('writable_dirs', []);   // 可写目录   规定那些目录是需要可以被web server写入的
set('clear_path', []);  // 设置在代码发布的时候需要被删除的目录
set('http_user', 'nginx');  // web server的用户,一般不用设置,deployer会自动判断
set('release_name', function () {   // 设置发布版名称,这里优先使用tag作为名称,不传的话会使用日期+时间表示发布时间
    if (input()->hasOption('tag')) {
        return input()->getOption('tag');
    }
    return date('Ymd-H:i');
});

// 可以设置多个服务器,发布的时候根据设置会同步发往多个服务器
// 针对每个服务器可以单独设置参数,设置的参数会覆盖全局的参数
server('prod_1', 'xxx.xxx.xxx.xxx')
    ->user('root')
    ->password('xxxxx')
    ->set('deploy_path', '/var/www/tb')   // 代码部署目录,注意:你的webserver,比如nginx,设置的root目录应该是/var/www/tb/current,
                                          // 因为current是一个指向当前线上实际使用的版本的软链
    ->stage('prod');  // 标识该服务器类型,用于服务器分组

server('prod_2', 'xxx.xxx.xxx.xxx')
    ->user('root')
    ->password('xxxxx')
    ->set('deploy_path', '/var/www/tb')
    ->set('branch', 'master')   // 指定发往这个服务器的分支,会覆盖全局设置的branch参数
    ->set('extra_stuff', '...') // 随意指定其他什么参数
    ->stage('prod');

server('beta', 'xxx.xxx.xxx.xxx')
    ->user('root')
    ->password('xxxxx')
    ->set('deploy_path', '/var/www/test')
    ->set('branch', 'beta')   // 测试环境使用beta分支
    ->stage('beta');    // 放在beta分组


// 配置的任务
task('success', function () {
    Deployer::setDefault('terminate_message', '<info>发布成功!</info>');
})->once()->setPrivate();   // 增加once调用那么这个任务将会在本地执行,而非远端服务器,并且只执行一次

desc('重启php-fpm');    // 可以给任务增加一个描述,在执行dep list的时候将能看到这个描述
task('php-fpm:restart', function () {
    run('systemctl restart php-fpm.service');  // run函数定义在服务器执行的操作,通常是一个shell命令,可以有返回值,返回命令打印
});     // 聪明如你一定发现了,可以用run函数制作一些批量管理服务器的任务,比如批量重载所有的nginx配置文件、批量执行服务器上的脚本等

after('deploy:symlink', 'php-fpm:restart'); // 钩子函数,表示执行完设置软链任务之后执行php-fpm重启任务

desc('发布项目');
task('deploy', [    // 可以设置复合任务,第二个参数是这个复合任务包括的所有子任务,将会依次执行
    'deploy:prepare',   // 发布前准备,检查一些需要的目录是否存在,不存在将会自动创建
    'deploy:lock',  // 生成锁文件,避免同时在一台服务器上执行两个发布流程,造成状态混乱
    'deploy:release',   // 创建代码存放目录
    'deploy:update_code',   // 更新代码,通常是git,你也可以重写这个task,使用upload方法,采用sftp方式上传
    'deploy:shared',    // 处理共享文件或目录
    'deploy:writable',  // 设置目录可写权限
    'deploy:vendors',   // 根据composer配置,安装依赖
    'deploy:clear_paths',   // 根据设置的clear_path参数,执行删除操作
    'deploy:symlink',   // 设置符号连接到最新更新的代码,线上此时访问的就是本次发布的代码了
    'deploy:unlock',     // 删除锁文件,以便下次发布
    'cleanup',  // 根据keep_releases参数,清楚过老的版本,释放服务器磁盘空间
    'success'   // 执行成功任务,上面自己定义的,一般用来做提示
]);


after('deploy:failed', 'deploy:unlock');    // 如果发布失败,则删除锁文件,以便下次重试

 

地方正是二个相比较完好的自动化安排脚本配置了,是否觉获得很简单?
因为大多数布局事业在您推行dep init的时候就早已帮你做了!

在接下去还要求做的1件工作便是把您要铺排的服务器的ssh-key参加到你的git帐号的认证Curry面,你也足以创建叁个账户,只具备仓库的git
pull和git
clone权限,保持最小权限原则。要求专注的是,加完key之后,第一次在服务器上进行git
clone恐怕会须求令你输入yes,所以最安妥的主意是,去每台要安插的服务器上去实践2遍git
clone,把库房代码拖1份到任何目录。

做完上边的事体现在,全部的预备专门的学问正是成功了。接下来就足以开始展览安顿测试了。

首先检查下布署有没难点:

 

dep config:dump beta    // 打印beta环境的配置
dep config:dump prod    // 打印生产环境的配置

打字与印刷出来的布署未有失常态的话,接着试行业发布布职务:

dep deploy beta // 发布当前beta分支到beta环境
dep --tag=v1.1 deploy prod // 发布v1.1这个tag的代码到生产环境,可以增加-p选项,并发发往所有服务器

三次中标的配置应该会有接近如下输出:

 

➜  tb git:(master) ✗ dep --tag=v1.1 deploy prod_1
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
✔ Executing task deploy:update_code
✔ Executing task deploy:shared
✔ Executing task deploy:writable
✔ Executing task deploy:vendors
✔ Executing task deploy:clear_paths
✔ Executing task deploy:symlink
✔ Executing task php-fpm:restart
✔ Executing task deploy:unlock
✔ Executing task cleanup
✔ Executing task success
发布成功!

查看当前添丁遇到使用的哪个版本

dep current prod  //这里应该会输出v1.1 

查阅当前添丁情况使用的哪个版本:

 

dep current prod  //这里应该会输出v1.1 

倘若公布到线上事先之后察觉有标题,要求回滚,只须求试行:

dep rollback prod   // 实际上只是修改软链指向,所以很快就能执行完成且基本不可能失败

重复用dep current prod应该就足以观望回滚到事先版本了

再譬如事先实行出了难题,被暂停,再次实践或然会唤醒:Deploy
locked,那么只用实施:

 

dep deploy:unlock prod // 删除锁文件

壹经线上磁盘空间吃紧了的话(一般不会),能够进行如下命令删除掉太早从前的本子:

dep cleanup

 

到了此处关于deployer全部你应该都通晓了。纵然第3次配置的确须求花点时间,恐怕半个小时也说不定半天。 
可是换成的却是接下去更优雅、火速、安全、易回滚的揭露流程,这么想转手是或不是还有点小震惊啊?

1旦在装置使用进度中有何样难点的话能够加群:632十9190举办座谈。对php、java、运营感兴趣的同室都能够加进去,笔者在那等你们
🙂

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website