欢迎您光临本站,如有问题请及时联系我们。

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

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

  一、了解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值一样就不需要再对比了

  修改确认 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

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

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

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

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

linux


来源:本文由E8运维原创撰写,欢迎分享本文,转载请保留出处和链接!