1. 程式人生 > >基於 Git 使用 PSCP + PSSH 快速釋出程式碼

基於 Git 使用 PSCP + PSSH 快速釋出程式碼

 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值一樣就不需要再對比了

修改確認 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

文章來自微信公眾號:HULK一線技術雜談