一行命令,自動將本地文件部署到遠程服務(wù)器上。
最近搭了個個人網(wǎng)站,在放到服務(wù)器上時,考慮到,如果每次更新的內(nèi)容,都要用 FTP 或者別的文件傳輸方式,將文件一個個的放到服務(wù)器上,簡直是太麻煩了,有沒有什么辦法更好,更快的完成部署呢?
使用 Git Hooks(Git 鉤子),可以做到這點。Git Hooks 是什么?「Git 能在特定的重要動作發(fā)生時觸發(fā)自定義腳本」,比如說pre-commit
, post-receive
等等,在這些動作之前或者之后,會運行定義好的腳本。要做到自動部署,就是要用到這個 post-receive
。
在設(shè)置自動部署前,先要設(shè)置無密碼登錄遠程服務(wù)器,具體操作可以參考這篇文章。[ SSH Key 無密碼登錄服務(wù)器 ]
自動部署
整個流程大概是:在服務(wù)器端創(chuàng)建一個 Git 倉庫(repository),然后將本地的文件使用 git push
上傳到這個倉庫后,將上傳到Git 倉庫的文件,自動復(fù)制到服務(wù)器里網(wǎng)頁運行的文件夾下。
- 在服務(wù)器端,創(chuàng)建一個 Git 倉庫,
git init --bare website.git
- 創(chuàng)建
post-receive
文件
cd website.git
vim hooks/post-receive
將以下內(nèi)容復(fù)制到post-receive
文件里
#!/bin/bash -l
GIT_REPO=/home/git/website.git
TMP_GIT_CLONE=/tmp/website
PUBLIC_WWW=/var/www/zhuangweiming.me/html
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
cd $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}
代碼解釋:
rm -rf ${TMP_GIT_CLONE}
清空臨時路徑里面的內(nèi)容
git clone $GIT_REPO $TMP_GIT_CLONE
將 Git 倉庫的內(nèi)容克隆到臨時路徑
rm -rf ${PUBLIC_WWW}/*
清空服務(wù)器網(wǎng)頁存放文件夾
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}
將臨時路徑里的文件復(fù)制到服務(wù)器網(wǎng)頁存放路徑
- 給
post-receive
文件授權(quán)
chmod +x hooks/post-receive
- 本地添加 Git 遠程倉庫,測試
git remote add deploy ssh://git@128.199.169.239/home/git/website.git
git push deploy
自動部署指定的 Git branch
如果是要部署特定的 branch,在上述第二部中,將 post-receive
的文件內(nèi)容替換為:
#!/bin/bash -l
while read oldrev newrev ref
do
branch=`echo $ref | cut -d/ -f3`
if [ "master" == "$branch" ] || [ "production" == "$branch" ]; then
GIT_REPO=/home/git/website.git
TMP_GIT_CLONE=/tmp/website
PUBLIC_WWW=/var/www/zhuangweiming.me/html
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
cd $TMP_GIT_CLONE
unset GIT_DIR
git checkout $branch
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}
fi
done