用 Git Hooks 進行自動部署


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

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

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

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

遠程連接服務器

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

生成 SSH 密鑰

密鑰是免登錄連接服務器的通行證,有種刷臉通行的感覺。如果本地已經存在並且不想另外生成的話,可以跳過此步。

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

如果私鑰名字不是默認的話,需要手動加入到被「認證」的私鑰列表中,否則每次連接服務器都會提示輸入服務器的密碼。在遇到了一些坑(文后有說明)后,我覺得設置 SSH config 最為靠譜!

編輯 ~/.ssh/config 文件(如果不存在則 touch ~/.ssh/config 創建一下),添加以下內容:

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 有效,一重啟就又會被「詢問」了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM