使用 git repo 保持远程服务器更新

使用 git repo 保持远程服务器更新

因此,我知道 git hooks,接下来会研究它们,但我想编写一个简单的 bash 脚本,通过 cron 运行,以使远程服务器上的 repo 保持最新状态。我想象它的工作方式如下:

  • cron 执行 myupdatescript.sh
  • myupdatescript.sh 将:
    1. 进入 /my/sites/staging
    2. git pull -q 源主机
    3. 如果 某物被拉了,然后:
      • 运行 grunt 来构建源代码
      • 等等等等

我目前将其作为 cron 任务运行,如下所示:

*/1 * * * * cd /my/sites/staging && git pull -q origin master && grunt production

如果没有任何变化,我试图避免运行我的 grunt build。我想这一切都归结为如何判断 git pull 是否真的拉取了任何东西,并将其用作运行我的 grunt build 的条件。Ubuntu 服务器,密钥安装在 github 上,所有这些好东西。感谢您的帮助!

答案1

我认为你可以通过以下简单的方法解决这个问题:

*/1 * * * * cd /my/sites/staging && git pull -q origin master|grep -v "up-to-date" && grunt production

答案2

这两个问题(自动处理你的部署并避免无用的工作,例如,grunt如果没有任何变化则运行任务)都是git钩子所要解决的。

cron因此,我的建议是尽快彻底摆脱任务并转而通过钩子来管理你的存储库。

详细描述了通常完成此操作的方式这里,基本上要求你有一个bare存储库(一个中心repo)推送/拉取,以及同一个 repo 的签出版本(居住例如,位于适当路径下的 .repo /srv/www/html

我喜欢用gitolite3处理中心repo,但这不是必需的,尽管有与您选择的 LDAP 绑定的细粒度访问控制如果需要的话。

gitolite3通过 限制用户的能力sudo并通过sudo调用来处理钩子也是一种很好的做法。这是一个使用钩子的工作示例gitolite3(您可以随意调整它们 - 或增强/修复它们 - 以满足您的需求):

  • 中心回购post-update挂钩:

    #!/bin/sh
    
    echo "****"
    echo "**** Calling publisher-hub2live script [Hub's post-update hook]"
    echo "****"
    
    sudo /usr/local/sbin/publisher-hub2live "/srv/www/html" "root:apache" "2750" "640"
    
    exit 0
    
  • publisher-hub2live脚本:

    #!/bin/sh
    
    echo "****"
    echo "**** Pulling changes into Live [publisher-hub2live]"
    echo "****"
    
    cd "$1" || exit
    umask 0022
    unset GIT_DIR
    /usr/bin/git pull hub master
    
    # custom actions here
    # e.g call grunt tasks
    /bin/chown -R "$2" "$1"
    /bin/find "$1" -type d -exec chmod "$3" {} +
    /bin/find "$1" -type f -exec chmod "$4" {} +
    /bin/chmod u+x "$1"/.git/hooks/post-commit
    /sbin/restorecon -R -v "$1"
    exec /usr/bin/git update-server-info
    
    exit 0
    
  • A居住repo post-commithook 也很有用,如果你曾经在签出的工作树中做出更改居住repo 并想要同步 hub。

sudoers该基础设施需要您的文件中包含以下条目(或等效条目) :

Cmnd_Alias        GITOLITE_CMDS = /usr/bin/git, /bin/chown, /bin/find, /bin/chmod, /sbin/restorecon, /usr/local/sbin/publisher-hub2live
Defaults:gitolite3 !requiretty
Defaults:gitolite3 lecture=never
gitolite3                ALL = (root)NOPASSWD: GITOLITE_CMDS

此外,根据您如何管理机器中的身份,Match您的阻止将是有用的:sshd_config

 Match Group gitolite3
  Banner /etc/issue.empty
  RequiredAuthentications2 publickey

有了这一切,推动中心repo 触发post-update钩子,确保执行你的自定义操作仅有的当有新事物出现时。

答案3

虽然我自己没有用过它,但从我对 Puppet 的理解来看http://puppetlabs.com/你可以这样做。

每次运行 puppet 时,如果发生任何更改,都会根据黄金映像自动将其推送到其他服务器。如果您有大量服务器,一旦创建了黄金映像,您就可以在另一个服务器上创建基础安装 puppet,新服务器将从主服务器获取其余配置。

相关内容