Capistrano:从两个不同的存储库中检出文件
Capistrano: Checkout files from two different repository
我在 BitBucket 中有两个存储库。
一个是我想首先部署的普通存储库,Laravel 安装,我想部署分支中的所有文件。
我的问题是,有另一个包含单个文件的存储库,它想要检出到服务器中的一个目录。该文件是 class,我不在本地使用,但对服务器来说是必不可少的。
我不知道如何处理这个问题。
这是我的 deploy.rb 文件:
#config valid only for current version of Capistrano
lock '3.6.1'
#require custom config
require './config/myconfig.rb'
set :stages, ["staging", "production"]
set :default_stage, "staging"
set :application, '<Application Name>'
set :repo_url, '<Url to my First main repo>'
set :scm, :git
set :branch, 'master'
set :user, 'vagrant'
这是我的 staging.rb 文件:
set :deploy_to, '<Directory to deploy to>'
server '<Server name or IP>', user: 'vagrant', roles: %w{app db web}
namespace :deploy do
desc 'Get stuff ready prior to symlinking'
task :compile_assets do
on roles(:app), in: :sequence, wait: 1 do
execute "cp #{deploy_to}/../components/.env #{release_path}"
execute "cp -r #{deploy_to}/../components/vendor #{release_path}"
execute "cp -r #{deploy_to}/../components/node_modules #{release_path}"
execute "cd #{release_path}; gulp;"
end
end
after :updated, :compile_assets
end
如何引入单个文件(Repo 2 中的 app/Extentions/TaskOneExtention.php)并将其放入目录(例如 Repo 1 中的 app/Extentions)?
我希望在部署任务后 运行 执行任务,但 运行 使用相同的部署命令。
非常感谢您的帮助。
我在这种情况下所做的是使用两个 Capistrano 部署和一些符号链接。
为了这个答案,我们将 $REPO1HOME
定义为部署 Repo1 的位置。
首先,我将 Repo2 中的文件名添加为 Repo1 中的 shared_file (config/deploy.rb):
set :shared_files, 'app/Extensions/TaskOneExtension.php'
此时,当您部署 Repo1 时,将创建一个从 $REPO1HOME/releases/[timestamp]/app/Extensions/TaskOneExtension.php
到 $REPO1HOME/shared/app/Extensions/TaskOneExtension.php
的符号链接。当然后一个文件还不存在,部署会失败。
要使此文件存在,请将 Repo2 部署到服务器。假设它现在在 $REPO1HOME/repo2/
中,而有问题的文件现在在 $REPO1HOME/repo2/releases/[timestamp]/app/Extensions/TaskOneExtension.php
中。在 $REPO1HOME/shared/app/Extensions/TaskOneExtension.php
中创建指向 $REPO1HOME/repo2/current/app/Extensions/TaskOneExtension.php
的符号链接。确保这是绝对符号链接而不是相对符号链接。
ln -s $REPO1HOME/repo2/current/app/Extensions/TaskOneExtension.php $REPO1HOME/shared/app/Extensions/TaskOneExtension.php
此时,您应该有两个可以独立部署的存储库,然后在服务器上链接起来。
我在 BitBucket 中有两个存储库。
一个是我想首先部署的普通存储库,Laravel 安装,我想部署分支中的所有文件。
我的问题是,有另一个包含单个文件的存储库,它想要检出到服务器中的一个目录。该文件是 class,我不在本地使用,但对服务器来说是必不可少的。
我不知道如何处理这个问题。
这是我的 deploy.rb 文件:
#config valid only for current version of Capistrano
lock '3.6.1'
#require custom config
require './config/myconfig.rb'
set :stages, ["staging", "production"]
set :default_stage, "staging"
set :application, '<Application Name>'
set :repo_url, '<Url to my First main repo>'
set :scm, :git
set :branch, 'master'
set :user, 'vagrant'
这是我的 staging.rb 文件:
set :deploy_to, '<Directory to deploy to>'
server '<Server name or IP>', user: 'vagrant', roles: %w{app db web}
namespace :deploy do
desc 'Get stuff ready prior to symlinking'
task :compile_assets do
on roles(:app), in: :sequence, wait: 1 do
execute "cp #{deploy_to}/../components/.env #{release_path}"
execute "cp -r #{deploy_to}/../components/vendor #{release_path}"
execute "cp -r #{deploy_to}/../components/node_modules #{release_path}"
execute "cd #{release_path}; gulp;"
end
end
after :updated, :compile_assets
end
如何引入单个文件(Repo 2 中的 app/Extentions/TaskOneExtention.php)并将其放入目录(例如 Repo 1 中的 app/Extentions)?
我希望在部署任务后 运行 执行任务,但 运行 使用相同的部署命令。
非常感谢您的帮助。
我在这种情况下所做的是使用两个 Capistrano 部署和一些符号链接。
为了这个答案,我们将 $REPO1HOME
定义为部署 Repo1 的位置。
首先,我将 Repo2 中的文件名添加为 Repo1 中的 shared_file (config/deploy.rb):
set :shared_files, 'app/Extensions/TaskOneExtension.php'
此时,当您部署 Repo1 时,将创建一个从 $REPO1HOME/releases/[timestamp]/app/Extensions/TaskOneExtension.php
到 $REPO1HOME/shared/app/Extensions/TaskOneExtension.php
的符号链接。当然后一个文件还不存在,部署会失败。
要使此文件存在,请将 Repo2 部署到服务器。假设它现在在 $REPO1HOME/repo2/
中,而有问题的文件现在在 $REPO1HOME/repo2/releases/[timestamp]/app/Extensions/TaskOneExtension.php
中。在 $REPO1HOME/shared/app/Extensions/TaskOneExtension.php
中创建指向 $REPO1HOME/repo2/current/app/Extensions/TaskOneExtension.php
的符号链接。确保这是绝对符号链接而不是相对符号链接。
ln -s $REPO1HOME/repo2/current/app/Extensions/TaskOneExtension.php $REPO1HOME/shared/app/Extensions/TaskOneExtension.php
此时,您应该有两个可以独立部署的存储库,然后在服务器上链接起来。