【问题标题】:setting up a git post-receive hook设置一个 git post-receive 钩子
【发布时间】:2013-07-23 03:08:51
【问题描述】:

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

每次推送时让远程服务器为您处理部署 使用 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-receive.sample。此外,当我在远程服务器上创建目录 mkdir /Users/me/Sites/nginxjekyll/_site/.git/ 时,它没有在其中创建 post-update.sample 文件。

如果您有时间,能否帮我解释一下这些说明。先感谢您。

【问题讨论】:

    标签: git jekyll


    【解决方案1】:

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

    问题 2: 这取决于两种情况: 1. 您需要添加本地用户的公钥才能推送到远程服务器。 2. 如果需要将 ssh 部署到另一台服务器,您将需要向运行 post-receive 挂钩的本地用户添加公钥。很可能只有 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 目录成为服务的 html 页面,您可以通过多种方式执行此操作,我建议您在不干扰用户的情况下尽可能地执行此操作,here是一个可能做这样事情的示例脚本:

    #!/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 hooks/post-receive 文件中,那么它将在每次将存储库推送到时运行。只要记住让它可执行: chmod 755 hooks/post-receive 所以如果你把这个新的遥控器添加到你的 git repo 中:

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

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

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

    问题是您无法直接从 github 为这种方法运行服务器端挂钩,因此您必须解决它。我建议您查看 capistrano 作为部署策略 - current/releases/shared 目录和 git_maint 目录取自他们的架构,效果很好。

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

    【讨论】:

    • 谢谢,我会试一试,让你知道它是如何工作的。感谢您的帮助。
    • git repo 的 hooks 目录中没有 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
    • 你可以创建这个文件——它只是一个脚本,将在 git 收到包后运行。只需将其命名为 post-receive - git 将完成剩下的工作。
    • 并通过chmod +x post-receive使其可执行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2014-10-28
    • 2011-04-15
    • 2012-02-17
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多