我有一个托管在Digital Ocean VPS上的Ruby Web应用程序。在当前设置下,我有一个bash脚本存在于VPS上,执行时执行以下操作:
显然,这种方法不可扩展(甚至不好)。因此,我正在尝试使用Travis CI + Capistrano设置部署管道,该管道在git push上自动安装,构建,测试和部署此Web应用程序。
到目前为止,我们让Travis CI在每次git推送时执行代码的安装,构建和测试,但我们仍然在寻找完成部署步骤的最佳方法。因为我们需要使用gulp构建JS和SASS文件,所以我们无法直接从git直接进入服务器并运行。由于Travis CI已经在构建这些文件,我们很好奇是否适合利用Travis CI构建的文件并将它们直接从Travis CI发送到我们的服务器。
我们考虑过的一些选项:
SCP +直接转移
与Travis CI上的custom deployment FTP example一样,我们可以将构建的文件存储到我们的服务器并调用运行迁移的bash脚本并重新启动应用服务器。
Capistrano +直接转移
我们可以在Travis CI上安装Capistrano,并使用它直接将Travis CI上构建的文件传输到我们的服务器。在打包和发送之前,我们需要清理任何不需要传输的文件/目录(node_modules,bower等)。转移包后,我们可以再次使用Capistrano提取它,运行数据库迁移,然后重新启动应用服务器。
为此,我们如何最大限度地减少部署停机时间?我们如何管理错误和回滚?
Capistrano + Git
我们可以将构建的Travis CI文件推送到github上的Git标签,并使用Capistrano在服务器上提取Git标签,运行数据库迁移,然后重新启动应用服务器。
为此,似乎git版本应仅用于prod,那么我们如何管理不同的环境(dev,stage和prod)?
无论如何,我们已经在网上进行了相当多的研究,并且无法找到满足我们需求的解决方案,这些解决方案提供了从Travis CI部署到不受支持的部署提供商的最佳标准方法。
鉴于上述情况,从Travis CI部署到VPS的最佳方式是什么?
答案 0 :(得分:1)
我最终使用Capistrano任务从Travis CI打包发布并将其上传到相应的服务器。
我必须在Capistrano中创建一个新的SCM
(我称之为Travis),它覆盖了默认SCM的发布创建任务。
我已将其发布到此github主题:https://github.com/capistrano/capistrano/issues/722#issuecomment-54653745
完成后,自定义Capistrano代码也在下面。
set :scm, :git
namespace :travis do
desc 'Check that travis is reachable'
task :check do
exit 1 unless true
end
desc 'Package to release'
task :create_release do
run_locally do
execute :mkdir, '-p', :'tmp'
execute "tar -cz --exclude tests --exclude vendor --exclude .git --exclude node_modules --exclude tmp/#{fetch(:release_timestamp)}.tar.gz -f tmp/#{fetch(:release_timestamp)}.tar.gz ."
end
on release_roles :all do
execute :mkdir, '-p', release_path
upload! "tmp/#{fetch(:release_timestamp)}.tar.gz", "#{release_path}/#{fetch(:release_timestamp)}.tar.gz"
execute "tar -xvf #{release_path}/#{fetch(:release_timestamp)}.tar.gz --directory #{release_path}"
execute "rm #{release_path}/#{fetch(:release_timestamp)}.tar.gz"
end
run_locally do
execute "rm -rf tmp"
end
end
desc 'Determine the revision that will be deployed'
task :set_current_revision do
run_locally do
set :current_revision, capture(:git, "rev-parse --short #{fetch(:branch)}")
end
end
end
namespace :deploy do
desc 'Use Travis'
task :use_travis do
set :scm, :travis
end
before :starting, :use_travis
end