setting up a git post-receive hook



我正在努力按照说明进行操作http://jekyllrb.com/docs/deployment-methods/然而,对于为Jekyll部署设置gitpostreceivehook,我发现它们对我来说有点密集。在这个链接上,有一段话说

让远程服务器在每次推送时为您处理部署使用Git进行更改,您可以创建一个用户帐户,该帐户具有被授权在其authorized_keys文件中部署的公钥。有了这些,设置后接收挂钩的步骤如下如下:

问题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-rereceive.sample。此外,当我在远程服务器上创建目录mkdir/Users/me/Sites/nginxjekyll_site/.git/时,它没有在其中创建post-update.shample文件。

如果你有时间的话,你能帮我澄清一下这些指示吗。提前谢谢。

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

问题2:这取决于两种情况:1。您需要添加本地用户的公钥才能推送到远程服务器。2.如果需要将ssh部署到另一台服务器,则需要向运行post-rereceive hook的本地用户添加公钥。很可能只有1是您关心的问题,2不是,因为远程服务器将容纳远程git-reo和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-hook/post-rereceive文件中,则它将在每次推送存储库时运行。只需记住使其可执行:chmod 755 hooks/post-receive。因此,如果您使用将此新远程添加到git-reo

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

然后git push DEPLOY_PROD-它将推送到您的远程,然后您的远程回购将启动其接收后挂钩,然后将裸回购复制到几乎任何时候都可能被吹走的维护目录。然后,该目录用于将站点目录cp为发布目录,然后链接到主目录。

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

问题是,对于这种方法,你无法直接从github运行服务器端挂钩,所以你必须解决它。我建议你将capistrano作为一种部署策略来查看-当前的/releases/shared目录和git_maint目录取自它们的模式,效果很好。

如果你想在这里得到任何帮助,请告诉我,我在开发部署和自动化部署策略方面有很多经验,所以根据你的情况,情况会有所不同。

最新更新