Capistranoを使用してRoRアプリケーションを展開しています。コードベースはgitリポジトリにあり、開発では分岐が広く使用されています。 Capistranoは、その設定にdeploy.rb
ファイルを使用します。そのうちの1つは、展開元のブランチです。
私の問題はこれです:新しいブランチ[〜#〜] a [〜#〜]をmasterから作成したとしましょう。デプロイファイルはmasterブランチを参照します。それを編集するので、[〜#〜] a [〜#〜]をテスト環境にデプロイできます。機能の作業を終了し、ブランチ[〜#〜] a [〜#〜]をmasterにマージします。 [〜#〜] a [〜#〜]からのdeploy.rb
ファイルは新しいため、マージされてdeploy.rb
inmasterブランチ参照[〜#〜] a [〜#〜]。もう一度編集してみましょう。
これは一見不必要に思える多くの手動編集です。パラメーターは常に現在のブランチ名と一致する必要があります。その上、毎回設定を編集するのを忘れがちです。
このプロセスを自動化する最良の方法は何でしょうか?
編集:判明 誰かがすでに私が必要とすることを正確に行っていた :
今朝、私はgitリポジトリのブランチをステージングサーバーにデプロイする機会がありました。 capistranoのソースコードをすばやく検索すると、展開スクリプトでset
:branch "branch_name"
を使用できることがわかりました。私はそれを試してみたが、うまくいった。次に、すべてのブランチで同様の変更を行う必要があると考えました。もちろん、私は怠け者であり、より良い方法がなかったのではないかと思いました。Gitに慣れていない場合、git branchコマンドの出力は、ローカルマシンで現在チェックアウトされているものを示すアスタリスクの付いたブランチのリストです。例えば:
> git branch * drupal_authentication fragment_caching master
だから、出力を解析して、現在のマークが付けられたブランチを検索したらどうなるかを考えました:
set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
これで、単一の共有された展開スクリプトから、ローカルマシンの現在のブランチを展開できます。
これはCapistrano> = 3.1で動作します:
この行をconfig/deploy.rb
に追加します。
set :branch, ENV['BRANCH'] if ENV['BRANCH']
次に、capistranoを呼び出します。
cap production deploy BRANCH=master
このソリューションは、カピストラーノ<3.1で動作します。
# call with cap -s env="<env>" branch="<branchname>" deploy
set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")
Capistrano 3.1.0+を使用すると、これらのどれももう機能していません。代わりに、彼らのコメントされた指示に従って:
ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
ただし、ask
を使用したくない場合は、プロンプトが表示されます。代わりに、set
を使用する必要があります。 HEAD
は最上位のブランチです。 「エッジ」と呼ばれます。別のブランチが必要な場合は、HEAD
をブランチ名に置き換えます。例:master
、staging
など。
例で締めくくるには、/config/deploy/production.rb
、次の行を含めることができます。
set :branch, proc { `git rev-parse --abbrev-ref master`.chomp }
...または
set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
ところで、HEAD
がデフォルト設定であるため、実際にファイルに記載する必要はありません。 /config/deploy/Edge.rb
。
/config/deploy/staging.rb
、次の行を含めることができます。
set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp }
...または
set :branch, proc { `git rev-parse --abbrev-ref test`.chomp }
あなたはアイデアを得る!
これらの例がcapistranoの将来のユーザーに役立つことを願っています(^_^)
マルチステージでは、実際には次のようになります。
cap production deploy -s branch=my-branch
前の投稿構文は私の環境では機能しません
Cap 3.11.0 13/10/18およびCap 2でも以下が機能することを確認できます。
Deploy.rb/stage.rbで:
set :branch, ENV['BRANCH'] || 'develop'
コマンドラインで:
cap deploy BRANCH=featurex
これにより、デフォルトのブランチ(環境によって異なる場合があります)と、必要に応じてブランチを変更する機能が提供されます。
あるいは、デフォルトのブランチと環境があるコマンドラインから構造化することもできます。また、使用する環境とブランチを含めることができるcap呼び出しにパラメーターを渡すこともできます。これは、明示的に渡されるブランチにすることも、リストしたリンクで説明されているように現在のブランチを示すパラメーターを持つこともできます。
#call with cap -S env="<env>" branch="<branchname>" deploy
...
# Prevents error if not parameter passed, assumes that default 'cap deploy' command
# and should deploy the master branch to the production server
set(:env, ‘production’) unless exists?(:env)
set(:branch, ‘master’) unless exists?(:branch)
if !env.nil? && env == "production"
role :web, "production_ip_address"
else # add more as needed
role :web, "development_ip_address"
end
if !branch.nil? && branch == "current"
set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
elsif !branch.nil?
set :branch, branch
else # add more as needed
set :branch, "master"
end
...
capistrano-multistage を使用している場合、実行する必要があるのは
cap -s branch=$MY_BRANCH deploy
または
cap -s branch=$MY_BRANCH production deploy
deploy.rb
を編集する必要はありません。
このコマンドはもう機能しません:
cap deploy -s branch=your_branch
へのサポート -sS
フラグはcapistrano v3 +で削除されました。
こちらで詳細をご覧いただけます。 link
いくつかの回答で言及されましたが、現在は正しくありません。
私のために働くもの:
in deploy.rb
ファイルの追加
set :branch, ENV['BRANCH'] || :master
次に実行します:
BRANCH=your_branch cap deploy
また、このコマンドを正常に実行するには、masterブランチにいる必要があることに注意してください。
このソリューションは、Capistranoのすべてのバージョンで動作するはずです。
def branch_name(default_branch)
branch = ENV.fetch('BRANCH', default_branch)
if branch == '.'
# current branch
`git rev-parse --abbrev-ref HEAD`.chomp
else
branch
end
end
set :branch, branch_name('master')
使用法:
BRANCH=. cap [staging] deploy
# => deploy current branch
BRANCH=master cap [staging] deploy
# => deploy master branch
cap [staging] deploy
# => deploy default branch
バージョン.3.5を使用していて、これが機能しています:
set :branch, 'develop'
Capistrano 3ユーザーの場合:
desc "Prompt for branch or tag"
task :git_branch_or_tag do
on roles(:all) do |Host|
run_locally do
execute :git, 'tag'
tag_Prompt = "Enter a branch or tag name to deploy"
ask(:branch_or_tag, tag_Prompt)
tag_branch_target = fetch(:branch_or_tag, 'master')
set(:branch, tag_branch_target)
end
end
end
before 'deploy:updated', :git_branch_or_tag
'deploy.rb'ではなくbranch
構成をステージファイルに配置し、そのステージのターゲットブランチをデプロイ元に設定します。
ブランチ名test
とproduction
が関連付けられた2ステージアプリの場合、構成は次のようになります。
# app_root/config/deploy/test.rb
...
set :branch, "test"
...
# app_root/config/deploy/production.rb
...
set :branch, "production"
...
この方法により、ステージ固有のブランチからデプロイできます。したがって、必要な追加の手順は、ベースブランチから最新のコードをマージまたはリベースすることだけです。
別のアプローチは、タグを使用してデプロイすることです。タグを使用してデプロイするには、branch
configを設定します。次のように「deploy.rb」で、
set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp
また、関連するタグパターンが一致する場合に異なるステージに条件付きで展開するようにCIを構成します(例:/.*-test$/
)。
これで、任意のブランチからデプロイを作成できます。
まず、任意のブランチからタグを作成し、
git tag -a v0.1.0-test -m "バージョン0.1.0-test"
そして、プッシュ
git Push Origin v0.1.0-テスト
注:上記の方法はCapistrano 3に基づいています。
一般的な答え:
環境ごとに内容が変更された設定ファイルがある場合、その行を「テンプレート」として作成する必要があります(@BRANCH_NAME@
または @ENV_NAME@
)。
次に、設定ファイルを読み取ることができる(バージョン管理された)スクリプトがあり、「@BRANCH_NAME@
"変数を展開プロセスに必要な適切な値で指定します。