我正在尝试使用类似于heroku的纯git工作流设置服务器。我不需要帮助设置git,但出于提供信息的目的,我正在使用gitolite。我想(不知何故)在这个系统的操作系统(Ubuntu)中编写自定义钩子,这样当它在特定分支上接收推送时,它会执行heroku所做的所有操作(启动Rack,Mongrel,Apache(用于)在我的情况下静态服务页面等)
有人能指向我这样做的资源或至少开始吗?谷歌搜索似乎没有帮助......
答案 0 :(得分:28)
听起来你想在Git工作流程的某个点执行任意功能。 Git钩子是要走的路。
如果你查看任何Git仓库(.git
文件夹内),你会看到一个hooks
文件夹。在其中有许多具有不同名称的示例钩子文件。根据您上面的解释,您需要编辑post-receive
挂钩文件,因为在远程仓库中更新新的ref后会立即调用该文件(由本地推送引起的)。有关详细信息,请阅读the official documentation on hooks或阅读此more approachable explanation。
您可以将任何所需的shell命令放在钩子文件中。将文件名从post-receive.sample
更改为简单post-receive
,添加启动Rack,Mongrel,Apache等所需的命令,然后快速chmod +x post-receive
使文件可执行即可全套。
答案 1 :(得分:19)
你看过Capistrano了吗?来自wiki:
Capistrano是一个实用程序和框架 用于并行执行命令 多台远程机器,通过SSH。它 使用简单的域特定语言 借用了工具耙子。 Rake类似于C世界中的make 并允许您定义任务,其中 可以适用于某些机器 角色。它还支持隧道 通过一些网关机器连接 允许执行操作 在VPN和防火墙之后。
Capistrano的 最初旨在简化 并自动部署Web 应用程序分发 环境,最初来了 捆绑了一套设计的任务 用于部署Rails应用程序。该 部署任务现在(截至 Capistrano 2.0)选择加入并要求 客户明确地加载"加载 “部署”"在他们的食谱中。
它不是基于任何类型的提交或发布挂钩,虽然我确定如果你确实需要它,那么你将能够找到一些示例配方来做类似的事情。
更新:也许git-deploy(基于Capistrano)就是您想要的:
在远程存储库上安装有用的git挂钩的工具,用于在主机上启用基于推送的Heroku式部署。
答案 2 :(得分:5)
我刚刚发现了https://github.com/mislav/git-deploy,这正是我想要的。我将把另一个答案保留为“正确”(因为它当时是最好的),但我现在正在使用git-deploy:)
答案 3 :(得分:2)
我有一个类似的设置,其中master分支在git push上使用capistrano自动部署为暂存。从生产部门手动部署生产。
设置要求您使用set :deploy_via, :remote_cache
中的deploy.rb
在服务器上拥有本地缓存副本。如果自上次部署以来已更改,则可以使用最新配置运行capistrano。
post-receive
钩子脚本:
#!/bin/bash
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/master" ] ; then
echo "Master branch pushed, deploying to staging"
# seams to be set to "." for hooks, unset to make things more normal
unset GIT_DIR
# deploy path, where "current", "releases", "shared" etc are
DEPLOYDIR="/home/user/deploy/staging"
# default path for :deploy_via :remote_cache is shared/cached-copy
cd "$DEPLOYDIR/shared/cached-copy"
# update cache to pushed revision, will be done by capistrano too
git fetch origin && git fetch --tags origin && git reset --hard "$newrev"
# load rvm
source ~/.rvm/scripts/rvm
rvm use 1.9.2
# make sure correct gems are installed
# this will also create a .bundle directory
bundle install --gemfile Gemfile --path "$DEPLOYDIR/shared/bundle" --deployment --without development test
# run capistrano
# if you use deploy:migrations instead of deploy you should probably add
# after "deploy:migrations", "deploy:cleanup"
# to your deploy.rb
bundle exec cap staging deploy:migrations
fi
done
没有:remote_cache
的简单设置也是可能的,但它会运行capistrano与之前(当前部署的)配置和接缝更脆弱。
post-receive
钩子脚本:
#!/bin/bash
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/master" ] ; then
echo "Master branch pushed, deploying to staging"
# seams to be set to "." for hooks, unset to make things more normal
unset GIT_DIR
source ~/.rvm/scripts/rvm
rvm use 1.9.2
cd /home/user/deploy/staging/current && bundle exec cap staging deploy:migrations
fi
done
答案 4 :(得分:2)
我建议您查看GitHub:progrium/dokku,它基于Docker技术,并且非常易于设置和使用。
如果您还在寻找云提供商,我建议DigitalOcean,因为他们支持开箱即用的Dokku!查看他们的community documentation以获取更多信息。
您的工作流程与Heroku非常相似:(Full Tutorial)
git remote add myheroku dokku@DOMAIN.com:your-app
git push myheroku master
http://your-app.DOMAIN.com
此外,如果您希望为自己的应用分配不同的子域或完整域名,则可以安装Dokku Domain Plugin,只需为您的应用指定域名:dokku domains:set your-app NEWDOMAIN.com
值得一提的是名为Flynn GitHub: flynn/flynn的新项目,其功能比Dokku更多。阅读Flynn和Dokku背后的历史here...