用 Git Hooks 進行自動部署

原文發表於 http://ourai.ws/posts/deployment-with-git-hooks/前端

昨天開始接手開發公司前端團隊的主頁,在稍微修改點東西后推送到遠程倉庫想看下線上結果時發現並無更改!詢問一把手得知,竟然還須要鏈接到服務器執行一下 git pull 才行……對於我這種怕麻煩的人來講,簡直不能忍!git

通過一番查找資料以及一頓折騰,終於讓它可以自動跑起來了,真是高興得我手舞足蹈啊!雖然弄了較長時間,在實踐的過程當中踩了點坑,但回過頭來一看仍是挺簡單的。總的來講,就只是在服務器和本機都作一下配置。(這不廢話麼……)vim

因爲公司的服務器是 CentOS,我所使用的電腦是 Mac OS X,故本文內容是基於這兩個系統環境所寫。GUI 在給用戶帶來不少便利的同時也隱藏了一些不便,如:須要下載應用軟件及在操做界面交互。鑑於本文的中心是「自動化」,因此一切操做都採用命令行——segmentfault

遠程鏈接服務器

在搭建環境的整個過程當中,有不少步驟是須要鏈接到服務器進行的,然而在每次訪問的時候都須要輸入用戶名和密碼,就像逢年過節回家聚會都會被親戚朋友詢問「何時結婚呀」「什麼時候抱小孩啊」。這就是爲何要把這步放到前面——在本身腦門上寫上計劃的結婚生子時間,免得他們總問!服務器

生成 SSH 密鑰

密鑰是免登陸鏈接服務器的通行證,有種刷臉通行的感受。若是本地已經存在而且不想另外生成的話,能夠跳過此步。session

cd ~/.ssh 切換目錄後用 ssh-keygen -t rsa -C "用於區分密鑰的標識" 生成一對具備相同名字的密鑰(默認爲 id_rsaid_rsa.pub):用於本地的私鑰和用於服務器的公鑰(有 .pub 擴展名)。ssh

若是私鑰名字不是默認的話,須要手動加入到被「認證」的私鑰列表中,不然每次鏈接服務器都會提示輸入服務器的密碼。在遇到了一些坑(文後有說明)後,我以爲設置 SSH config 最爲靠譜!post

編輯 ~/.ssh/config 文件(若是不存在則 touch ~/.ssh/config 建立一下),添加如下內容:fetch

Host HOST_ALIAS                       # 用於 SSH 鏈接的別名,最好與 HostName 保持一致
  HostName SERVER_DOMAIN              # 服務器的域名或 IP 地址
  Port SERVER_PORT                    # 服務器的端口號,默認爲 22,可選
  User SERVER_USER                    # 服務器的用戶名
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/PRIVATE_KEY     # 本機上存放的私鑰路徑

服務器端認證

先用 pbcopy < ~/.ssh/PRIVATE_KEY.pub 將公鑰複製到剪貼板;經過 ssh USER@SERVER 訪問服務器,這時會提示輸入密碼(它也許只有這麼一次「詢問」的機會);成功登陸後 vim ~/.ssh/authorized_keys,在合適的位置 cmd + V 並保存退出(同時 exit 退出 SSH 鏈接)。網站

配置 Git 倉庫

建立服務器端倉庫

服務器上須要配置兩個倉庫,一個用於代碼中轉的遠程倉庫,一個用於用戶訪問的本地倉庫。這裏的「遠程倉庫」並不等同於託管代碼的「中央倉庫」,這兩個倉庫都是爲了自動同步代碼並部署網站而存在。

在存放遠程倉庫的目錄中(假設是 /home/USER/repos)執行 git init --bare BRIDGE_REPO.git 會建立一個包含 Git 各類配置文件的「裸倉庫」。

切換到存放用戶所訪問文件的目錄(假設爲 /home/USER/www,若是不存在則在 /home/USER 中執行 mkdir www):

git init
git remote add origin ~/repos/BRIDGE_REPO.git
git fetch
git checkout master

配置 Git Hook

將目錄切換至 /home/USER/repos/BRIDGE_REPO.git/hooks,用 cp post-receive.sample post-receive 複製並重命名文件後用 vim post-receive 修改。其內容大體以下:

#!/bin/sh

unset GIT_DIR

NowPath=`pwd`
DeployPath="../../www"

cd $DeployPath
git pull origin master

cd $NowPath
exit 0

使用 chmod +x post-receive 改變一下權限後,服務器端的配置就基本完成了。

更新本機的倉庫源

在原有的(託管代碼的)倉庫上加入剛纔所配置的服務器上的遠程倉庫的地址爲源,之後往那個源推送代碼後就會自動部署了。

總結

在搭建環境時並無一路順風,磕磕絆絆遇到很多問題,雖然不少不值得一提,但有的點仍是有記錄並分享的價值的!

SSH 私鑰「認證」

將生成的私鑰進行「認證」有不止一種方式,然而,起初我用的是最挫最不靠譜的 ssh-add ~/.ssh/PRIVATE_KEY——只是在當前 session 有效,一重啓就又會被「詢問」了!

相關文章
相關標籤/搜索