133

カピストラーノを使用して RoR アプリケーションをデプロイしています。コードベースは git リポジトリにあり、分岐は開発で広く使用されています。Capistrano はdeploy.rbその設定に file を使用します。そのうちの 1 つはデプロイ元のブランチです。

私の問題はこれです: masterから新しいブランチAを作成するとしましょう。deploy ファイルはmasterブランチを参照します。それを編集して、Aをテスト環境にデプロイできるようにします。機能の作業を終了し、ブランチAmasterにマージします。Aからのファイルはより新しいため、マージされ、マスターブランチ内でAが参照されます。もう一度編集する時間。deploy.rbdeploy.rb

これは、一見不必要な手動編集の多くです。パラメーターは常に現在のブランチ名と一致する必要があります。その上、毎回設定を編集するのを忘れがちです。

このプロセスを自動化する最良の方法は何でしょうか?

編集:誰かがすでに私が必要としていたことを正確に行っていることがわかりました:

今朝、ステージング サーバーに git リポジトリのブランチをデプロイする機会がありましたが、その方法がまったくわかりませんでした。capistrano のソース コードをざっと検索したところ :branch "branch_name"、デプロイ スクリプトで set を使用できることがわかりました。私はそれを試してみましたが、うまくいきました。次に、すべてのブランチで同様の変更を行う必要があると考えました。もちろん、私は怠け者なので、もっと良い方法はないかと考えました。

git に慣れていない場合、git branch コマンドの出力は、ローカル マシンで現在チェックアウトされているブランチを示すアスタリスクが付いたブランチのリストです。例えば:

> git branch
* drupal_authentication
fragment_caching
master

したがって、出力を解析して、最新としてマークされたブランチを検索するとどうなるかを考えました。

set :branch, $1 if `git branch` =~ /\* (\S+)\s/m

これで、単一の共有デプロイ スクリプトから、ローカル マシンに最新のブランチをデプロイできるようになりました。

4

13 に答える 13

172

これは Capistrano >= 3.1 で動作します:

この行を に追加しconfig/deploy.rbます。

set :branch, ENV['BRANCH'] if ENV['BRANCH']

次に、カピストラーノを次のように呼び出します。

cap production deploy BRANCH=master

このソリューションは Capistrano < 3.1 で動作します:

# call with cap -s env="<env>" branch="<branchname>" deploy

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")
于 2012-01-30T17:32:38.737 に答える
35

Capistrano 3.1.0+ を使用すると、これらのどれも機能しなくなりました。代わりに、コメントされた指示に従って:

   ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

ただし、使用したくないaskか、プロンプトが表示されます。代わりに を使用する必要がありますsetHEAD一番上のブランチです。通称「エッジ」。別のブランチが必要な場合はHEAD、ブランチ名に置き換えてください (例: masterstagingなど)。

例で締めくくるには/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 }

あなたはアイデアを得る!

これらの例がカピストラーノの将来のユーザーに役立つことを願っています (^_^)

于 2014-01-31T13:06:31.907 に答える
32

Cap 3.11.0 13/10/18 および Cap 2 で以下が引き続き機能することを確認できます。

deploy.rb / stage.rb:

set :branch, ENV['BRANCH'] || 'develop'

コマンドラインで:

cap deploy BRANCH=featurex

これにより、デフォルトのブランチ (環境によって異なる可能性があります) と、必要に応じてブランチを変更する機能が提供されます。

于 2013-03-18T17:21:13.253 に答える
28

マルチステージでは、実際には次のようになります。

cap production deploy -s branch=my-branch

私の環境では以前の投稿の構文が機能しません

于 2012-10-15T21:34:21.287 に答える
15

または、デフォルトのブランチと環境があるコマンドラインから構成することもできます。また、使用する環境とブランチを含めることができる 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
...

ここから大量に借りたコード例

于 2009-11-17T23:36:19.230 に答える
10

capistrano-multistageを使用している場合は、実行するだけです。

cap -s branch=$MY_BRANCH deploy

また

cap -s branch=$MY_BRANCH production deploy

をさらに編集する必要はありませんdeploy.rb

于 2012-07-09T16:06:32.793 に答える
3

バージョン3.3.5を使用していますが、これが機能しています:

set :branch, 'develop'
于 2015-01-22T09:53:26.703 に答える
3

このソリューションは、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
于 2014-06-25T09:35:27.830 に答える
1

一般的な答え:

環境ごとに内容が変更された設定ファイルがある場合は、その行を「テンプレート」として作成する必要があります(@BRANCH_NAME@またはのような変数名を表す文字列を使用@ENV_NAME@)。

次に、構成ファイルを読み取ることができる (バージョン管理された) スクリプトを用意し、" @BRANCH_NAME@" 変数を展開プロセスで必要な適切な値に置き換えます。

于 2009-10-06T09:06:35.123 に答える
1

カピストラーノ 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
于 2014-11-03T03:15:56.067 に答える