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


125

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

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

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

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

編集:判明誰かがすでに私が必要な正確に何行っていました

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

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

> git branch
* drupal_authentication
fragment_caching
master

そのため、出力を解析し、currentとしてマークされたブランチを検索した場合はどうなるかを考えました。

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

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


これは更新されたリンクです:Capistranoでブランチをデプロイする
wacko

回答:


157

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

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

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

そして、次のコマンドでcapistranoを呼び出します。

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")

4
mustistage拡張機能を使用する場合、設定する必要はありませんがenv、ブランチを使用するだけでうまくいきました
Tom Harrison、

@lulalalaで述べられているように、指定されたブランチを取得するには小文字の-sを使用する必要があります。
Jahan

@Jani:ありがとう、新しいcapistranoリリースでは、それに応じて私の回答を編集したようです。
wintersolutions 2013

私は@Janiとはまったく逆の問題を抱えていました:fetch(:var_name、 'default')を使用して取得するには、大文字の-Sを使用する必要がありました。
FrederikStruck-Schøning2014年

1
オプション '-s'(--set)は、 'レシピが読み込まれた後に変数を設定する'ことを意味します。オプション 'S'(--set-before)は、 'レシピがロードされる前に変数を設定する'ことを表しています。
Ramon Caldeira 14

33

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 }

あなたはアイデアを得ます!

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


4
git rev-parse --abbrev-ref HEADHEADがオンになっているブランチを見つけるために使用されます。実行git rev-parse --abbrev-ref stagingすると(ほぼ)常に出力されますstaging。そのまま使えますset :branch, 'staging'
MiniGod

27

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

cap production deploy -s branch=my-branch

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


1
-s branch=foofooレシピが読み込まれた後にcapistrano変数ブランチを設定します
alvin

26

以下は、Cap 3.11.0 13/10/18およびCap 2でも動作することを確認できます。

deploy.rb / stage.rbで:

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

コマンドラインで:

cap deploy BRANCH=featurex

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


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
...

ここから多用するコード例


3
-s指定されたブランチを取得するために小文字を使用する必要があります
lulalala

@lululaとはまったく逆の問題がありました。-Sを大文字にする必要がありました。fetch(:var_name、 'default')を使用して取得する場合は、引数がキャップに渡されないためです。
FrederikStruck-Schøning2014年

10

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

cap -s branch=$MY_BRANCH deploy

または

cap -s branch=$MY_BRANCH production deploy

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


2
それはそうであるべきでbranch=はありませんbranch-
ジモシー2013年

3
OptionParser :: AmbiguousOption:あいまいなオプション:-s
giorgio

8

このコマンドは機能しなくなります。

cap deploy -s branch=your_branch

-sSフラグのサポートはcapistrano v3 +で削除されました。
ここではそれについての詳細を読むことができます:リンク
それは答えのカップルで述べましたが、現在は正しくありません。

どのような私の作品:
deploy.rb、ファイルの追加

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

次に実行します:

BRANCH=your_branch cap deploy

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


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

2

私はバージョン3.3.5を使用しています私はをていて、私はこれで動作しています:

set :branch, 'develop'

1

一般的な答え:

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

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



1

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

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

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

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

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

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

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

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

別のアプローチは、タグを使用してデプロイすることです。タグを使用してデプロイするには、構成をbranch設定します。次のように「deploy.rb」で、

set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp

また、関連付けられたタグパターンが一致した場合(たとえば、 /.*-test$/

これで、任意のブランチからデプロイできます。

  • まず、任意のブランチからタグを作成し、

    git tag -a v0.1.0-test -m "バージョン0.1.0-test"

  • そして、押します

    git push origin v0.1.0-test

注:上記の方法はCapistrano 3に基づいています。


0
git rev-parse --abbrev-ref HEAD

正確に現在のブランチを返します。

私はいつものgpsh代わりに設定しますgit push -u origin branch_name

$ which gpsh
gpsh: aliased to git push -u origin `git rev-parse --abbrev-ref HEAD`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.