因此,我知道 git hooks,接下来会研究它们,但我想编写一个简单的 bash 脚本,通过 cron 运行,以使远程服务器上的 repo 保持最新状态。我想象它的工作方式如下:
- cron 执行 myupdatescript.sh
- myupdatescript.sh 将:
- 进入 /my/sites/staging
- git pull -q 源主机
- 如果 某物被拉了,然后:
- 运行 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-commit
hook 也很有用,如果你曾经在签出的工作树中做出更改居住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,新服务器将从主服务器获取其余配置。