CYC有三臺(tái)服務(wù)器分別位于騰訊云倾贰、阿里云冕碟、美國(guó),最近在研究自動(dòng)化部署匆浙。主要使用git+webhook方案安寺。實(shí)現(xiàn)git push后服務(wù)器自動(dòng)拉取并運(yùn)行部署腳本。
CYC在寫(xiě)iOS的過(guò)程中首尼,經(jīng)常劃水寫(xiě)一寫(xiě)Python的Flask Web項(xiàng)目挑庶。感覺(jué)本地修改調(diào)試然后部署到服務(wù)器有時(shí)有點(diǎn)麻煩=、= 趁前陣子工作不飽和的時(shí)候瞎折騰了一番软能。
部署git服務(wù)器
為了搭建私有g(shù)it 原先是簡(jiǎn)單使用 git init --bare 的方式建立倉(cāng)庫(kù)然后編輯hook/post-recieve 添加腳本迎捺,造成擴(kuò)展復(fù)雜并且腳本執(zhí)行的權(quán)限便是ssh推送用戶(hù)的權(quán)限,略有不便查排,同時(shí)在兩臺(tái)服務(wù)器+多個(gè)項(xiàng)目的情況下凳枝,部署復(fù)雜。詳見(jiàn) https://zhuanlan.zhihu.com/airbnb/19757507
于是這次搭建了一個(gè)gogs 一個(gè)由go語(yǔ)言編寫(xiě)的git服務(wù)器(后來(lái)發(fā)現(xiàn)有個(gè)衍生版本gotea跋核,不過(guò)因?yàn)橐呀?jīng)弄好了就沒(méi)再折騰了)岖瑰。
[圖片上傳失敗...(image-714a4f-1513514362275)]
gogs中可以很方便的添加webhook記下密鑰文本,這是webhook服務(wù)端用來(lái)驗(yàn)證推送者合法性的密鑰
對(duì)了砂代,截止現(xiàn)在最新版本的左側(cè)選項(xiàng)中的git鉤子是無(wú)效的在官方issue中確認(rèn)了這個(gè)問(wèn)題蹋订,坑。
[圖片上傳失敗...(image-711395-1513514362275)]
添加完后就長(zhǎng)這樣
[圖片上傳失敗...(image-53a35-1513514362275)]
準(zhǔn)備部署腳本
誒誒誒泊藕,webhook怎么生效的呢辅辩? 便是倉(cāng)庫(kù)有動(dòng)作后遍像指定的url POST一個(gè)提交的相關(guān)信息。服務(wù)器收到這條POST校驗(yàn)合法后執(zhí)行部署腳本進(jìn)行上線(xiàn)操作娃圆。下面是我一個(gè)python-web服務(wù)器的部署腳本玫锋,其實(shí)就是很簡(jiǎn)單的git pull然后reload服務(wù)器。
#!/usr/bin/env bash
set -xe
echo "Running Post Receive Hook"
export GIT_WORK_TREE=/home/pyweb/src
cd ${GIT_WORK_TREE}
git fetch origin
git reset --hard origin/master
# reload my apps
echo "reload"
supervisorctl restart pyweb
echo "finish!"
運(yùn)行webhook服務(wù)器
webhook服務(wù)器有很多開(kāi)源的項(xiàng)目讼呢,自己寫(xiě)一個(gè)也非常的簡(jiǎn)單撩鹿。因?yàn)槲业男枨笠卜浅:?jiǎn)單,只需要收到指定項(xiàng)目post url后運(yùn)行特定項(xiàng)目的部署腳本即可悦屏。于是用flask簡(jiǎn)單實(shí)現(xiàn)了一個(gè)节沦。代碼如下
[圖片上傳失敗...(image-f40a0d-1513514362275)]
同時(shí)支持通過(guò)配置文件來(lái)進(jìn)行不同項(xiàng)目的配置
{
"progect1": {
"key": "xxxxxxx",
"shell_path": "progect1.sh",
"branch": "master"
},
"progect2":{
.......
}
}
然后就可以設(shè)置webhook url到 https://xxxxx/webhook/update/project1 進(jìn)行更新操作了。
讓supervisorctl 能在非root權(quán)限下運(yùn)行
剛剛有人肯定注意到我在腳本中執(zhí)行了 supervisorctl 并沒(méi)有添加sudo础爬,而我們的webhook服務(wù)器也肯定是已非root的低權(quán)限用戶(hù)運(yùn)行的甫贯,那要怎么做到呢?
編輯 /etc/supervisor/supervisord.conf
修改此字段
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0770 ; sockef file mode (default 0700)
chown=nobody:git ;這里我允許git用戶(hù)組進(jìn)行操作
然后重啟supervisor即可看蚜。
用git管理服務(wù)器公鑰叫搁、https證書(shū)?
由于CYC的免費(fèi)https wildcard將于2018年過(guò)期,同時(shí)聽(tīng)說(shuō)let's encrypt 也即將允許簽署wildcard渴逻。打算將多個(gè)服務(wù)器的https證書(shū)同一部署webhook管理疾党。部署腳本做 git pull; nginx reload。想想應(yīng)該很靠譜(大flag((誤
想想ssh公鑰也可以這樣管理吧惨奕?git pull && 替換 ~/.ssh/authorized_keys && chmod 600 && service ssh restart
嗯 多人服務(wù)器管理中 要添加密鑰還可以又用戶(hù)發(fā)起pull request雪位,admin同意merge后即可自動(dòng)授權(quán)(對(duì)了 gogs也支持網(wǎng)頁(yè)上直接編輯文件不需要clone,perfect@孀病)
但是 這會(huì)遇到一個(gè)權(quán)限問(wèn)題:
指定命令可以在特定用戶(hù)下sudo免密碼運(yùn)行
執(zhí)行 sudo visudo 編輯sudoer文件
添加
www-data ALL=(ALL:ALL) NOPASSWD:/usr/sbin/service nginx reload
// 這里也可以替換成一個(gè)指定的shell腳本路徑
運(yùn)行后如圖
[圖片上傳失敗...(image-eeb292-1513514362275)]
可見(jiàn)只有這條命令能夠sudo提權(quán)雹洗,比起添加整個(gè)用戶(hù)到sudo group安全的多啦~
有時(shí)在這里sudo會(huì)報(bào)錯(cuò)“unable to resolve host xxxx(hostname)” 這時(shí)我們只要編輯hosts添加hostname到127.0.0.1的映射即可。
阿里云給的hostname是一堆接近隨機(jī)數(shù)字的編碼聋袋,看著很不爽 好在ubuntu下可以很方便的永久修改hostname队伟。只需
sudo vi /etc/hostname
編輯完文件保存 重啟即可。
Emmmmmmm
感覺(jué)好像差不多了誒幽勒。嗜侮。。不過(guò)感覺(jué)很粗暴emmmmm(瑟瑟發(fā)抖啥容,溜了溜了)锈颗,還是怎么簡(jiǎn)單怎么來(lái)吧。接下去有空去了解了解docker咪惠。