[英]What is a good workflow for Continuous Deployment to a VPS using Travis CI and Capistrano?
我有一个在Digital Ocean VPS上托管的Ruby Web应用程序。 在当前设置下,我有一个bash脚本驻留在VPS上,该脚本在执行时执行以下操作:
显然,这种方法无法扩展(甚至无法扩展)。 因此,我尝试使用Travis CI + Capistrano设置部署管道,该管道在git push时会自动安装,构建,测试和部署此Web应用程序。
到目前为止,我们已经让Travis CI在每次git push时都执行代码的安装,构建和测试,但是我们正在努力寻找完成部署步骤的最佳方法。 因为我们有需要使用gulp构建的JS和SASS文件,所以我们无法直接从git直接拉入服务器并运行。 并且由于Travis CI已经在构建这些文件,因此我们很好奇是否应该利用从Travis CI构建的文件并将其直接从Travis CI发送到我们的服务器。
我们考虑过的一些选择:
SCP +直接转移
就像Travis CI上的自定义部署FTP示例一样,我们可以将生成的文件SCP放入我们的服务器,并调用运行迁移并重新启动应用程序服务器的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的最佳方法是什么?
我最终使用Capistrano任务打包了Travis CI的发行版,并将其上传到适当的服务器。
我必须在Capistrano(我称为Travis)中创建一个新的SCM
,它覆盖了默认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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.