我正在尝试遵循http://jekyllrb.com/docs/deployment-methods/指令来为Jekyll部署设置一个git post-receive钩子(Hook),但是,我发现它们对我来说有点密集。在该链接上,有一段文字
问题1:我不清楚应该在“哪个用户帐户”(在远程服务器上的Github?上)上创建该用户帐户,以及(问题2)在此authorized_keys
文件所在的位置上。我的本地计算机上的主目录中有一个known_hosts
文件,其中包含github等的 key 。那是authorized_keys文件吗?
说明继续告诉您如何设置一个接收后 Hook
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:它们是指远程服务器上的用户。
问题2:这取决于两种情况:1.您需要添加本地用户的公钥才能推送到远程服务器。 2.如果需要将ssh部署到另一台服务器,则需要向运行后接收 Hook 的本地用户添加公共(public) key 。很可能只有1个是您的关注点,而2个不是因为远程服务器将容纳远程git repo和www服务器。
这意味着您将公用 key 添加到linux/unix环境中的authorized_keys文件中。该文件通常位于/home/$USER/.ssh/authorized_keys中。authorized_keys文件与用户的known_hosts文件位于同一目录中。
问题3:他们正在解释如何设置远程git存储库。它不必与本地存储库位于同一路径。
好的-现在要弄清楚这里实际发生的情况。本教程将教您如何设置一个远程存储库,该存储库每次推送时都会部署jekyll安装。
这意味着,如果您有github存储库,则无法在此处设置服务器端 Hook 。相反,您将在远程服务器上设置一个新的远程服务器。假设您登录到服务器(通常使用ssh),运行pwd
来学习完整路径或在环境变量中进行设置:
$DIR=`pwd`
现在,您可以在此服务器上创建裸仓库:
git init --bare $DIR/<SOMEDIRNAME>.git
现在,您的服务器上有一个远程裸git存储库。接下来,您需要添加 Hook ,使其在收到推送后即可部署您的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
这样的事情将是一个很好的部署。如果将此脚本保存在远程服务器上的裸仓库 Hook /接收后文件中,则它将在每次将存储库推送到该脚本时运行。只要记住要使其可执行即可:chmod 755
hooks/post-receive
因此,如果您使用以下命令将此新的远程添加到您的git repo中:git remote add DEPLOY_PROD user@remote.server.com:/path/to/bare/repo
然后
git push DEPLOY_PROD
-它会推送到您的远程服务器,然后您的远程仓库将触发其接收后 Hook ,然后将裸仓库复制到几乎可以随时删除的维护目录中。然后使用该目录将站点目录cp到发行目录,然后将其链接到主目录。当然,所有这些都可能是过大了,您只需创建一个从本地主机运行的部署脚本即可通过ssh完成所有这些操作。
问题是您无法直接从github运行此方法的服务器端 Hook ,因此您必须解决它。我建议您将capistrano作为部署策略进行检查-当前/发行版/共享目录和git_maint目录是从其架构中获取的,效果很好。
让我知道您是否需要任何帮助,我在开发部署和自动部署策略方面有很多经验,因此,根据您的情况,情况会有所不同。