2013-07-23 95 views
7

我試圖按照說明http://jekyllrb.com/docs/deployment-methods/設置用於Jekyll部署的git post-receive hook,但是,我發現它們對我來說有點密集。在那個環節,有這麼說設置git post-receive hook

爲了有一個遠程服務器處理部署你的每一次按使用Git 變化的段落,你可以創建擁有所有被授權的 公共密鑰的用戶帳戶部署在其authorized_keys文件中。 有了到位,設立後收到鉤作爲 如下進行:

問題1:這不是很清楚,我在「用戶帳戶」被創建(在Github上的遠程服務器上? )和(問題2)這個authorized_keys文件。我在我的本地機器的主目錄中有一個known_hosts文件,其中包含github等的密鑰。是那個authorized_keys文件嗎?

指令去到告訴你建立後收到鉤這樣

laptop$ ssh [email protected] 
server$ mkdir myrepo.git 
server$ cd myrepo.git 
server$ git --bare init 
server$ cp hooks/post-receive.sample hooks/post-receive 
server$ mkdir /var/www/myrepo 

指令mkdir myrepo.git是一個小我不清楚。例如,我把我的Jekyll站點放到我本地機器上的git版本控制中,並且它給了我這個路徑/Users/me/Sites/nginxjekyll/_site/.git/

問題3)那麼這是否意味着,遵循mkdir myrepo.git指令,我應該創建我的遠程服務器上的目錄mkdir /Users/me/Sites/nginxjekyll/_site/.git/?繼續前進,它說,

cp hooks/post-receive.sample hooks/post-receive 

不過,我沒有hooks/post-receive.sample文件複製?在本地機器上的git倉庫中,我有一個post-update.sample,但沒有post-receive.sample。此外,當我在遠程服務器上創建目錄mkdir /Users/me/Sites/nginxjekyll/_site/.git/時,它並未在其中創建update-update.sample文件。

如果您有時間,您能澄清這些說明嗎?先謝謝你。

回答

6

問題1:它們指的是遠程服務器上的用戶。

問題2:這取決於兩種情況:1.您需要添加本地用戶的公鑰以推送到遠程服務器。 2.如果需要將ssh部署到其他服務器,則需要將公鑰添加到運行post-receive hook的本地用戶。最有可能的只有1個是你的問題,2不是因爲遠程服務器將容納遠程git倉庫和www服務器。

這意味着您將公鑰添加到linux/unix環境中的authorized_keys文件中。該文件通常位於/home/$USER/.ssh/authorized_keys中authorized_keys文件與用戶的known_hosts文件位於同一目錄中。

問題3:他們正在解釋如何設置遠程git存儲庫。它不需要與本地存儲庫位於同一路徑。

好的 - 現在來澄清這裏實際發生了什麼。本教程將教您如何設置遠程存儲庫,每次推送時都會部署jekyll安裝。

這意味着如果你有一個github repo,你不能在那裏設置服務器端鉤子。而是你會在你的遠程服務器上建立一個新的遠程。所以說,你登錄到你的服務器(使用ssh典型值),運行pwd學習您的完整路徑,或將其設置在環境變量:

$DIR=`pwd` 

現在,你可以在此服務器上創建一個裸露的回購協議:

git init --bare $DIR/<SOMEDIRNAME>.git 

現在,您的服務器上已有遠程裸Git存儲庫。接下來,您需要添加該鉤子,以便在接收推送時部署您的Jekyll站點。你列出的網站有一個相當簡單的部署,但基本上它所做的一切就是使_site目錄服務html頁面,你可以通過多種方式做到這一點,我建議你儘可能地在不中斷用戶的情況下做到這一點,在這裏是一個示例腳本可能會做這樣的事情:

#!/bin/bash 
# Assuming a directory structure for www: 
# $www_root/releases 
# $www_root/shared 
# $www_root/current 
# all releases go in releases dir as timestamps dirs 
# any logs or other shared items go in shared dir - shared/logs 
# current is a symlink to latest release 
unset GIT_DIR 
WWW_ROOT=/PATH/TO/WWW 
REPO_PATH=/PATH/TO/REPO 
REPO_BRANCH=master 
SITE_DIR=/PATH/TO/_SITE/DIR/IN/REPO 
DATE=$(date +"%Y%m%d%H%M") 

# get code 
if [ ! -d $WWW_ROOT/shared/git_maint ]; then 
    mkdir -p $WWW_ROOT/shared/git_maint 
    cd $WWW_ROOT/shared/git_maint 
    git clone $REPO_PATH $WWW_ROOT/shared/git_maint 
    git checkout master 
else 
    cd $WWW_ROOT/shared/git_maint 
    git pull 
    git checkout master 
fi 

# do deploy 
if [ ! -d $WWW_ROOT/releases/$DATE ]; then mkdir $WWW_ROOT/releases/$DATE; fi 
cp -ar $WWW_ROOT/shared/git_maint/$SITE_DIR $WWW_ROOT/releases/$DATE 
ln -s $WWW_ROOT/new_current $WWW_ROOT/releases/$DATE && mv $WWW_ROOT/new_current $WWW_ROOT/current 

exit 0 

喜歡的東西,這將是一個很好的部署。如果您將此腳本保存在遠程服務器上的裸回購鉤子/接收後文件中,則每次將存儲庫推送到該文件時都會運行該腳本。只記得,使其可執行的:chmod 755 hooks/post-receive所以,如果你這個新的遠程與添加到您的git回購:

git remote add DEPLOY_PROD [email protected]:/path/to/bare/repo 

然後git push DEPLOY_PROD - 這將推動遠程,然後遠程回購將觸發它後獲得掛鉤,然後將裸露的repo複製到維護目錄,幾乎在任何時候都可以將其刪除。該目錄然後用於將站點目錄cp到一個發佈目錄,然後鏈接到主目錄。

當然,所有這些都很可能過量使用,您可以創建一個從本地主機運行的部署腳本,通過ssh完成所有這些。

問題是您無法直接從github運行服務器端鉤子,因此您必須解決此問題。我建議你查看capistrano作爲部署策略 - 當前/發佈/共享目錄和git_maint目錄是從他們的模式中提取的,它運行良好。

讓我知道如果你想在這裏得到任何幫助,我有很多開發部署和自動化部署策略的經驗,所以根據你的情況,事情會有所不同。

+0

謝謝,我會試一試,讓你知道它是如何工作的。感謝你的幫助。 – Leahcim

+0

git倉庫中的鉤子目錄中沒有post-receive文件。只有'applypatch-msg.sample post-update.sample pre-commit.sample pre-rebase.sample commit-msg.sample pre-applypatch.sample prepare-commit-msg.sample update.sample' – Leahcim

+0

你可以創建這個文件 - 這只是在git收到包後運行的腳本。只需將它命名後 - git將完成剩下的工作。 – Michael