设置一个git post-receive hook

时间:2013-07-23 03:08:52

标签: git jekyll

我正在尝试按照http://jekyllrb.com/docs/deployment-methods/的说明设置jekyll部署的git post-receive挂钩,但是,我发现它们对我来说有点密集。在那个链接上,有一段说

  

让每次推送时让远程服务器为您处理部署   使用Git进行更改,您可以创建一个包含所有内容的用户帐户   有权在其authorized_keys文件中部署的公钥。   有了这个,设置post-receive钩子就像完成一样   如下:

问题1:我不清楚应该在哪里创建'用户帐户'(在​​远程服务器上的Github上?),以及(问题2)这个authorized_keys文件的位置。我的本地计算机上的主目录中有一个known_hosts文件,其中包含github的密钥等。这是authorized_keys文件吗?

说明会告诉您设置这样的接收后挂钩

laptop$ ssh deployer@myserver.com
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/时,它没有在其中创建post-update.sample文件。

如果你有时间,可以告诉我这些说明吗?先感谢您。

1 个答案:

答案 0 :(得分:6)

问题1:他们指的是远程服务器上的用户。

问题2:这取决于两种情况:1。您需要添加本地用户的公钥以推送到远程服务器。 2.如果需要将ssh部署到另一台服务器,则需要向运行post-receive hook的本地用户添加公钥。最有可能只有1是您的关注,2不是因为远程服务器将容纳远程git repo和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 dir作为服务的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 -snf $WWW_ROOT/releases/$DATE $WWW_ROOT/current

exit 0

这样的事情将是一个很好的部署。如果将此脚本保存在远程服务器上的裸repo挂钩/后接收文件中,则每次推送存储库时它都会运行。请记住使其可执行:chmod 755 hooks/post-receive因此,如果您使用以下命令将此新遥控器添加到您的git仓库中:

git remote add DEPLOY_PROD user@remote.server.com:/path/to/bare/repo

然后git push DEPLOY_PROD - 它将推送到您的遥控器然后您的远程仓库将触发其接收后挂钩,然后将裸仓库复制到维护目录,该目录几乎可以在任何点被吹走。然后使用此目录将站点目录cp发布到发行版dir,然后将其链接到主目录。

当然所有这些都很可能是矫枉过正的,您可以创建一个从本地主机运行的部署脚本,通过ssh完成所有这些操作。

问题是你无法直接从github运行服务器端钩子这种方法,所以你必须解决它。我建议你查看capistrano作为部署策略 - 当前/发布/共享dirs和git_maint目录取自他们的模式,它运行良好。

如果您需要任何帮助,请告诉我,我在开发部署和自动部署策略方面拥有丰富的经验,因此根据您的具体情况,情况会有所不同。