gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 13:03:12 27 4
gpt4 key购买 nike

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

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

显然,这种方法不可扩展(甚至不好)。因此,我正在尝试使用 Travis CI + Capistrano 设置部署管道,该管道会在 git 推送时自动安装、构建、测试和部署此 Web 应用程序。

到目前为止,我们让 Travis CI 在每次 git 推送时执行代码的安装、构建和测试,但我们正在寻找完成部署步骤的最佳方法。因为我们有需要使用 gulp 构建的 JS 和 SASS 文件,所以我们无法直接从 git pull 到服务器上并运行。由于 Travis CI 已经在构建这些文件,我们很好奇利用 Travis CI 构建的文件并将它们直接从 Travis CI 发送到我们的服务器是否合适。

我们考虑过的一些选项:


SCP + 直接传输

喜欢custom deployment FTP example在 Travis CI 上,我们可以将构建的文件通过 SCP 发送到我们的服务器,并调用运行迁移和重启应用服务器的 bash 脚本。

Capistrano + 直接传输

我们可以在 Travis CI 上安装 Capistrano,并使用它直接将在 Travis CI 上构建的文件传输到我们的服务器。在打包和发送之前,我们需要清理所有不需要传输的文件/目录(node_modules、bower 等)。传输包后,我们可以再次使用 Capistrano 提取它、运行数据库迁移并重新启动应用服务器。

为此,我们如何最大限度地减少部署停机时间?我们如何管理错误和回滚?

Capistrano + Git

我们可以将构建的 Travis CI 文件推送到 github 上的 Git 标签,然后使用 Capistrano pull 服务器上的 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

关于git - 使用 Travis CI 和 Capistrano 持续部署到 VPS 的良好工作流程是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392544/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com