最近一段的工作是和馬來西亞的客戶一起Hack用React去重構(gòu)他們的主站,讓人比較郁悶的是他們對CI沒有推崇连茧,認(rèn)為Hack的工作沒有必要創(chuàng)建一個CI, 因?yàn)橹鲗?dǎo)權(quán)在他們那邊口芍,所以也就沒有太去堅(jiān)持這件事情。但最后還是達(dá)成一致使用Docker在服務(wù)器上面手動部署。
部署環(huán)境為AWS的EC2 Instance, 馬來西亞那邊不給西安他們的AWS 權(quán)限歼争,只是提供了一個Server的IP和密碼,所以剛開始的時候我們的部署步驟為:
ssh root@23.34.54.56
//輸入server密碼
cd app
git pull
// 輸入git密碼
docker-compose restart server
每一次更新都需要六步,其中還有兩部需要輸入密碼堪置,每天都有執(zhí)行好幾遍躬存,對于我這個特別懶的程序猿真的是無法忍受,開始想怎么能夠把六步變成一鍵執(zhí)行舀锨?
要實(shí)現(xiàn)一鍵執(zhí)行岭洲,過程中不能輸入密碼,但密碼也不能明文的寫到一個腳本坎匿,太不安全盾剩。解決這個問題我們需要使用SSH的OpenSSH Key來進(jìn)行認(rèn)證,免去輸入密碼的麻煩替蔬。比如我們要登錄到Linux server上告私,只需要:ssh -i ~/.ssh/ec2.pem root@23.34.54.56
具體實(shí)現(xiàn)步驟也是比較簡單:
- 生成key pair 和 pem file
ssh-keygen -t rsa -b 2048 -v
需要輸入key的名稱:ec2,不要設(shè)置密碼承桥。
完成后會生成ec2 和 ec2.pub兩個文件,重命名pem文件
mv ./ec2 ~/.ssh/ec2.pem
- 將認(rèn)證文件從本地上傳到server端
ssh-copy-id -i ./ec2.pub root@23.34.54.56
//輸入server密碼
- 測試連接
ssh -i ~/.ssh/ec2.pem root@23.34.54.56
解決了無密碼登錄server后驻粟,還需要解決git密碼問題,其實(shí)和上述的原理差不多快毛,但步驟不同格嗅,具體過程可以參見 GitHub幫助文檔。然后將repo的url設(shè)置為git remote set-url origin git@github.com:*USERNAME*/*OTHERREPOSITORY*.git
如果你的代碼是在github上托管的唠帝,按照其文檔步驟就OK了屯掖,但我們使用的git是公司內(nèi)部自己的,git服務(wù)ssh的端口被改成了5442襟衰,做完以上步驟仍然連接不到git服務(wù)器贴铜,需要我們進(jìn)行額外的配置:
打開或創(chuàng)建~/.ssh/config,加入以下配置
Host my.git.com # git倉庫地址
Port 5442
IdentityFile ~/.ssh/id_rsa_git # 生成的pem文件名稱
到此為止,無密碼登錄的需求已經(jīng)滿足,部署步驟需要四步:
ssh ~/.ssh/ec2.pem root@23.34.54.56
cd app
git pull
docker-compose restart server
ssh 提供在本地直接運(yùn)行服務(wù)器命令瀑晒, 例如前兩步就可以放在一行
ssh ~/.ssh/ec2.pem root@23.34.54.56 cd app
這樣的話就直接進(jìn)入到server的app目錄下绍坝。但想執(zhí)行多條命令的話可以在命令之間加&&來實(shí)現(xiàn)如
ssh ~/.ssh/ec2.pem root@23.34.54.56 cd app && git pull && docker-compose restart server
但不隨人愿,&& 后面的命令沒有在server上執(zhí)行苔悦,而是在local執(zhí)行了轩褐,原來是shell把 ssh ~/.ssh/ec2.pem root@23.34.54.56 cd app
解析成第一條local命令,git pull
為第二條local命令玖详,故而第二條命令沒有在server執(zhí)行把介。要解決這個問題其實(shí)很簡單,只需要在server的上執(zhí)行的幾條命令前后加上單/雙引號即可
ssh ~/.ssh/ec2.pem root@23.34.54.56 "cd app && git pull && docker-compose restart server"
一鍵升級的目標(biāo)已經(jīng)達(dá)到蟋座,但命令還是太長了拗踢,每次升級輸入或者copy這么長的命令也是很痛苦的。我們可以借助shell的alias特性實(shí)現(xiàn)向臀,即
echo alias myserver='ssh ~/.ssh/ec2.pem root@23.34.54.56' >> ~/.zshrc #.bashrc
echo alias update_myserver='myserver "cd app && git pull && docker-compose restart server"' >> ~/.zshrc #.bashrc
最終巢墅,只需要敲擊update_myserver
就可完成一次程序的升級部署。