web-dev-qa-db-ja.com

capistranoを使用して異なるgitブランチからデプロイする

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

これで、単一の共有された展開スクリプトから、ローカルマシンの現在のブランチを展開できます。

117
Toms Mikoss

これは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")
145
wintersolutions

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

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

ただし、askを使用したくない場合は、プロンプトが表示されます。代わりに、setを使用する必要があります。 HEADは最上位のブランチです。 「エッジ」と呼ばれます。別のブランチが必要な場合は、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 }

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

これらの例がcapistranoの将来のユーザーに役立つことを願っています(^_^)

30
Eric Wanchic

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

cap production deploy -s branch=my-branch

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

27
David Hersey

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

Deploy.rb/stage.rbで:

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

コマンドラインで:

cap deploy BRANCH=featurex

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

24
Paul Odeon

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

ここから大きく借りたコード例

15
naven87

capistrano-multistage を使用している場合、実行する必要があるのは

cap -s branch=$MY_BRANCH deploy

または

cap -s branch=$MY_BRANCH production deploy

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

10
asymmetric

このコマンドはもう機能しません:

cap deploy -s branch=your_branch

へのサポート -sSフラグはcapistrano v3 +で削除されました。
こちらで詳細をご覧いただけます。 link
いくつかの回答で言及されましたが、現在は正しくありません。

私のために働くもの:
in deploy.rbファイルの追加

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

次に実行します:

BRANCH=your_branch cap deploy

また、このコマンドを正常に実行するには、masterブランチにいる必要があることに注意してください。

7
SakyHank

このソリューションは、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
Pablo Cantero

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

set :branch, 'develop'
2
David Rosa

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
1
lfender6445

方法1:展開のためにステージ固有のブランチ(テスト、本番など)を設定する

'deploy.rb'ではなくbranch構成をステージファイルに配置し、そのステージのターゲットブランチをデプロイ元に設定します。

ブランチ名testproductionが関連付けられた2ステージアプリの場合、構成は次のようになります。

# app_root/config/deploy/test.rb
...
set :branch, "test"
...

# app_root/config/deploy/production.rb
...
set :branch, "production"
...

この方法により、ステージ固有のブランチからデプロイできます。したがって、必要な追加の手順は、ベースブランチから最新のコードをマージまたはリベースすることだけです。

方法2:任意のブランチから直接展開する(タグを使用)

別のアプローチは、タグを使用してデプロイすることです。タグを使用してデプロイするには、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に基づいています。

1
Shakil

一般的な答え:

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

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

1
VonC