繁体   English   中英

使用Travis CI和Capistrano连续部署到VPS的良好工作流程是什么?

[英]What is a good workflow for Continuous Deployment to a VPS using Travis CI and Capistrano?

我有一个在Digital Ocean VPS上托管的Ruby Web应用程序。 在当前设置下,我有一个bash脚本驻留在VPS上,该脚本在执行时执行以下操作:

  • 停止应用服务器
  • 将最新的git仓库代码克隆到本地服务器
  • 运行数据库迁移
  • 启动应用服务器
  • 清理

显然,这种方法无法扩展(甚至无法扩展)。 因此,我尝试使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM