首页 运维干货基于 Git 使用 PSCP + PSSH 快速发布代码

基于 Git 使用 PSCP + PSSH 快速发布代码

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥linux运维

 Git

女主宣言

HULK 平台中已经有基于 S3 的部署系统、基于 Git、SVN 的部署系统等,但今天分享的是命令行直接操作项目的部署,包括单文件、整体部署。

前言

很多公司都有成熟的代码发布系统,并行,备份,锁定,分批次,甚至还可以检验代码漏洞等等,功能十分完善,也十分强大,本文不讨论发布系统与命令行发布的优缺点,只针对广大喜欢命令行工具的码农朋友,一起来探讨简单,快捷又保险的文本类文件命令行发布工具。

一、了解PSSH,PSCP

1、 PSSH 并行到目标服务器执行指定的命令

pssh -h “hosts.txt” -i “cmd”

-h 指定目标服务器列表,服务器列表放在文件里

-H 指定服务器列表字符串,空格隔开

-p 并行数

-i 返回执行结果

-x “-o StrictHostKeyChecking=no”  加了这个参数已建立信任的机器第一次登录就不需要确认了。

这里只列出来本次用到的参数:

成功样例:

[1] 14:54:03 [SUCCESS] hulk001

[2] 14:54:03 [SUCCESS] hulk002

失败样例:

[1] 15:07:35 [FAILURE] hulk001 Exited with error code 1

[2] 15:07:36 [SUCCESS] hulk002

以下是pssh在执行过程可能的返回状态,但它并没有详细的列出来各种错误对应的错误码。

我们经常会碰到的 Exited with error code 1,Exited with error code 127,Exited with error code 255 等。

Git

2、 利用pscp或prsync把文件copy到目标服务器

pscp -H “hulk001 hulk002” /tmp/temp.tar.gz ~/deploy/temp.tag.gz

二、建立服务器间的信任

需要用到一个命令ssh-keygen,该命令会在用户home目录下生成一个隐藏的.ssh目录。

目录里面有两个文件:id_rsa、id_rsa.pub,这两个是密钥文件,id_rsa是密钥,id_rsa.pub是公钥。

(1)、切换到需要建立信任关系的用户,这里是pub用户。

(2)、执行命令:ssh-keygen , 然后一直回车。

(3)、在目标机pub用户.ssh目录下找到文件:authorized_keys,找不到就创建目录以及文件。

(4)、将刚才机器上产生的id_rsa.pub的内容添加到authorized_keys文件最后一行。

(5)、信任建好了,试一试,第一次无密码登录需要输入yes确认一次。

三、发布代码

~/project/pub(test) >> sh tools/deploy.sh src/application/controller/IndexController.php

=== 选择要上传的分支 ===

1    dev

2    master

3    test

请输入待发布的分支名称 [master ] : test

=== 切换到 [ test ] 分支 ===

=== 远程分支,执行 git pull ===   #如果该分支是远程分支,需要pull最新代码

代码

=== 请选择要部署的环境 ===

1    test

2    beta

3    prod

请输入要发布的环境 [ prod ] :   test

=== 请确认发布环境和文件列表 ===

=== 发布主机 ===

1:   hulk001

2:   hulk002

3:   hulk003

=== 发布文件列表 ===

1:   src/application/controller/IndexController.php

确认主机和文件列表? [y/n]: y

=== 打包待发布文件 ===

=== 逐个文件进行对比 ===   #记录下基本准文件的md5值,在全量发布的时候需要,如果md5值一样就不需要再对比了

基于 Git 使用 PSCP + PSSH 快速发布代码插图3

修改确认 src/app/controllers/IndexController.php ? [y/n]: y

=== 上线文件到基准机 [hulk001] ==  # 基准机,生产机用配置文件解决,这里的基准机选取发布列表中的第一台机器

=== 发送文件到基准机 === # pscp -H “hulk001” -p 10 -t 10 -i src.tgz dest.tgz

[1] 09:39:39 [SUCCESS] hulk001

=== 部署文件到基准机 === # 先备份原始文件,再把刚才上传的文件解压到指定位置 pssh -H “hulk001” -p 10 -t 10 -i  do_something

[1] 09:39:40 [SUCCESS] hulk001

发布完毕,执行此命令恢复原始版本: sh tools/deploy-revert.sh ~/deploy_bak/project_name/20170601093937.tgz hulk001

请验证发布结果 [y/n] y

=== 开始并行发布所有机器 ===

=== 并行上传文件, 总数:2, 并行数:10 === # pscp -H “hulk002 hulk003” -p 10 -t 10 -i src.tgz dest.tgz

[1] 09:57:03 [SUCCESS] hulk002

[2] 09:57:03 [SUCCESS] hulk003

=== 完成上传文件 ===

完成:2/2 成功:2 失败:0

=== 开始并行部署文件, 总数:2, 并行数:10 ===

[1] 09:57:04 [SUCCESS] hulk002

[2] 09:57:04 [SUCCESS] hulk003

=== 完成部署文件 ===

完成:2/2 成功:2 失败:0

发布完毕,执行此命回滚所有机器: sh tools/deploy-revert.sh ~/deploy_bak/project_name/20170601095657.tgz

四、如何完美的发布整个项目

很多时候大家的项目可能是这个样子,这种方式一旦发布出现问题,可以快速的回滚。

基于 Git 使用 PSCP + PSSH 快速发布代码插图4

我们在发布代码的时候势必会遇到  ls -sf 等情况,这看似一个单一的原子性操作,但在 strace 的结果来看却不是这样的,它其实是一个先删除再创建的过程,并非是原子的。

基于 Git 使用 PSCP + PSSH 快速发布代码插图5

实际上大家都知道 rename 在linux系统下是原子操作,这里我们应该使用 ln && mv 的操作来保证我们的发布过程更加稳妥,在strace的结果里可以看到mv实质上是执行了一个rename的操作。

linux

基于 Git 使用 PSCP + PSSH 快速发布代码插图7

文章来自微信公众号:HULK一线技术杂谈

本文链接:https://www.yunweipai.com/20095.html

网友评论comments

发表回复

您的电子邮箱地址不会被公开。

暂无评论

Copyright © 2012-2022 YUNWEIPAI.COM - 运维派 京ICP备16064699号-6
扫二维码
扫二维码
返回顶部