持續(xù)集成 の 使用 git hook 部署代碼

持續(xù)集成的一個(gè)環(huán)節(jié)就是提交代碼后,能即刻部署到測試環(huán)境下伟桅,以運(yùn)行各類測試用例。

本文使用 git hook 即可做到代碼的簡易部署叽掘。我們以一個(gè)網(wǎng)站為例楣铁。

解決方案的思路

你的網(wǎng)站代碼在你本地 git 庫里,你把代碼 push 到遠(yuǎn)程 git 庫里(你的 Web 服務(wù)器)够掠,通過 post-receive hook 部署到 document root 網(wǎng)站目錄下民褂。

示例

原創(chuàng)文章請參見 Using Git to manage a web site茄菊,作者 menon-sen 2008年的一篇文章疯潭,致敬赊堪!
本文有改動(dòng),以用戶 /home/michael 為例竖哩。

The local repository:建庫
$ cd
$ mkdir wph/web
$ cd wph/web
$ git init
Initialized empty Git repository in /home/michael/wph/web.git/
$ echo 'Hello, world!' > index.html
$ git add index.html
$ git commit -q -m "The humble beginnings of my web site."
The remote repository:建庫
$ cd
$ mkdir -p wph/web.git
$ cd wph/web.git
$ git init --bare
Initialized empty Git repository in /home/michael/wph/web.git/
The remote repository:設(shè)置 hook
$ cd ~/wph/web.git

# 編輯 hook 腳本
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/home/app/wph/web git checkout -q -f

$ chmod +x hooks/post-receive
  • 請務(wù)必加上執(zhí)行權(quán)限哭廉,否則不會(huì)執(zhí)行;

hook 設(shè)置好后相叁,執(zhí)行以下任一命令查看效果:
hooks/post-receive遵绰,. hooks/post-receivesource hooks/post-receive

  • 請確保 GIT_WORK_TREE 所指向的目錄存在增淹,否則會(huì)報(bào)告錯(cuò)誤 “fatal: This operation must be run in a work tree”椿访。
網(wǎng)站目錄權(quán)限
  • 網(wǎng)站目錄
    post-receive 腳本中設(shè)置的 GIT_WORK_TREE 變量,就是網(wǎng)站目錄:
    $ mkdir -p /home/app/wph/web/
  • 目錄權(quán)限
    假設(shè)使用 nginx HTTP Server虑润,網(wǎng)站目錄一般都設(shè)置為 nginx:nginx成玫。可以把 michael 用戶加到 nginx 組內(nèi)(修改 /etc/group)拳喻,網(wǎng)站目錄 chmod 設(shè)置為同組可寫哭当。
chown -R nginx:nginx /home/app/wph/web/
chmod -R g+w /home/app/wph/web/

或者
chown -R michael:nginx /home/app/wph/web/,michael 作為 owner冗澈,用戶 nginx 屬于 nginx 組钦勘,更方便理解⊙乔祝或者直接設(shè)置為 michael:michael 也可以彻采。

The local repository:和 remote 關(guān)聯(lián)
$ cd ~/wph/web
$ git remote add xweb ssh://192.168.99.236/home/michael/wph/web.git
$ git push xweb +master:refs/heads/master

至此,網(wǎng)站目錄下就有了 master 分支的完整的文件副本捌归,但不包含 .git metadata(這個(gè)很好颊亮,類似于 svn export 了)。以后陨溅,你只要 git push xweb终惑,在推送到遠(yuǎn)程庫的同時(shí),你的網(wǎng)站目錄就得到了更新门扇。

注:

  1. git remote: Manage set of tracked repositories
  2. 假如你本地庫是從另外一個(gè)遠(yuǎn)程庫復(fù)制來的雹有,簽出在不同的分支下(不在 master 下),則 git push xweb +master:refs/heads/master 時(shí)臼寄,會(huì)報(bào)錯(cuò)霸奕,調(diào)整一下命令參數(shù)即可,比如:git push xweb +v0.3:refs/heads/v0.3吉拳。
  3. "Error: EPERM: operation not permitted, chmod ..." 錯(cuò)誤
    這個(gè)錯(cuò)誤有時(shí)會(huì)發(fā)生在 gulp 下生成的新目錄文件身上质帅。網(wǎng)站目錄設(shè)置為 michael:nginx 即可;
  4. pull/push from multiple remote locations
git remote set-url origin --add --push <a remote>
git remote set-url origin --add --push <another remote>

這樣你就可以同時(shí)推送到多個(gè)遠(yuǎn)程庫了煤惩,而不必一個(gè)一個(gè)推送嫉嘀。

git push <repository> [<refspec>…?]

  • <refspec>…?

Specify what destination ref to update with what source object. The format of a <refspec> parameter is an optional plus +, followed by the source object <src>, followed by a colon :, followed by the destination ref <dst>.

The <src> is often the name of the branch you would want to push, but it can be any arbitrary "SHA-1 expression", such as master~4 or HEAD.

The <dst> tells which ref on the remote side is updated with this push. The object referenced by <src> is used to update the <dst> reference on the remote side. By having the optional leading +, you can tell Git to update the <dst> ref even if it is not allowed by default.

To force a push to only one branch, use a + in front of the refspec to push (e.g git push origin +master to force a push to the master branch)

  • 示例
git remote add prod-web ssh://192.168.99.236/home/git/wph/web.git
git push prod-web +v0.3:refs/heads/v0.3
- `+v0.3:refs/heads/v0.3`:+<src>:<dst>;省略 `:<dst>`魄揉,則表示推送到遠(yuǎn)程同名 ref剪侮;
- `+`表示強(qiáng)制推送,allow non-fast-forward updates洛退;
- 為了簡單起見瓣俯,通常 +v0.3:master 即可,即將本地 v0.3 推送到遠(yuǎn)程 master(這樣遠(yuǎn)程簽出 master 到站點(diǎn)目錄兵怯,而不必每次都修改簽出目錄)彩匕;

post-receive 示例(發(fā)布指定分支)

#!/bin/bash

target_branch="production"
working_tree="PATH_TO_DEPLOY"

while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ -n "$branch" ] && [ "$target_branch" == "$branch" ]; then
    
       GIT_WORK_TREE=$working_tree git checkout $target_branch -f
       NOW=$(date +"%Y%m%d%H%M%S")
       git tag release_$NOW $target_branch
    
       echo "   /==============================="
       echo "   | DEPLOYMENT COMPLETED"
       echo "   | Target branch: $target_branch"
       echo "   | Target folder: $working_tree"
       echo "   | Tag name     : release_$NOW"
       echo "   \=============================="
    fi
done

備注


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媒区,一起剝皮案震驚了整個(gè)濱河市推掸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驻仅,老刑警劉巖谅畅,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異噪服,居然都是意外死亡毡泻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門粘优,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仇味,“玉大人,你說我怎么就攤上這事雹顺〉つ” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵嬉愧,是天一觀的道長贩挣。 經(jīng)常有香客問我,道長没酣,這世上最難降的妖魔是什么王财? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮裕便,結(jié)果婚禮上绒净,老公的妹妹穿的比我還像新娘。我一直安慰自己偿衰,他們只是感情好挂疆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布改览。 她就那樣靜靜地躺著,像睡著了一般缤言。 火紅的嫁衣襯著肌膚如雪宝当。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天墨闲,我揣著相機(jī)與錄音,去河邊找鬼郑口。 笑死鸳碧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的犬性。 我是一名探鬼主播瞻离,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乒裆!你這毒婦竟也來了套利?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鹤耍,失蹤者是張志新(化名)和其女友劉穎肉迫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稿黄,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喊衫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杆怕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片族购。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陵珍,靈堂內(nèi)的尸體忽然破棺而出寝杖,到底是詐尸還是另有隱情,我是刑警寧澤互纯,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布瑟幕,位于F島的核電站,受9級特大地震影響留潦,放射性物質(zhì)發(fā)生泄漏收苏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一愤兵、第九天 我趴在偏房一處隱蔽的房頂上張望鹿霸。 院中可真熱鬧,春花似錦秆乳、人聲如沸懦鼠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肛冶。三九已至街氢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睦袖,已是汗流浹背珊肃。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馅笙,地道東北人伦乔。 一個(gè)月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像董习,于是被迫代替她去往敵國和親烈和。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,665評論 9 163
  • 本文作者陳云峰皿淋,轉(zhuǎn)載請注明招刹。 這篇文章記錄個(gè)人常用的一些命令,和記不住的一些命令窝趣,轉(zhuǎn)載了并不斷更新疯暑。 Git官網(wǎng) ...
    陳云峰閱讀 2,817評論 0 24
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)哑舒,斷路器缰儿,智...
    卡卡羅2017閱讀 134,696評論 18 139
  • 領(lǐng)導(dǎo)是組織的思想,管理是組織的行為;領(lǐng)導(dǎo)是做正確的決策散址,管理是順著決策正確地做;領(lǐng)導(dǎo)是把梯子搭在成功的墻上乖阵,管理是...
    新吶喊閱讀 692評論 2 7
  • 2017.3.12 一,親子話題预麸,如何均衡二胎 二瞪浸,婚姻家庭,如何讓婚姻更幸福 三吏祸,美膚類对蒲,氣質(zhì)優(yōu)雅女神課程 一,...
    80后女諸葛閱讀 189評論 1 0