Использование capistrano для развертывания из разных ветвей git

Я использую capistrano для развертывания приложения RoR. Кодовая база находится в репозитории git, и ветвление широко используется в разработке. Capistrano использует для этого параметры deploy.rb, один из которых - ветвь для развертывания.

Моя проблема заключается в следующем: пусть я создаю новую ветку A от мастера. Файл развертывания будет ссылаться на главную ветку. Я редактирую это, поэтому A можно развернуть для тестирования среды. Я завершаю работу над этой функцией и объединяю ветку А в мастер. Поскольку файл deploy.rb от A более свежий, он объединяется и теперь deploy.rb в главной ветки ссылается A. Время для повторного редактирования.

Это много ненужного ручного редактирования - параметр всегда должен соответствовать текущему имени ветки. Кроме того, легко забыть редактировать настройки каждый раз.

Каким будет лучший способ автоматизировать этот процесс?

Изменить: Выключает кто-то уже сделал то, что мне нужно:

Сегодня утром мне пришлось развернуть ветку хранилища git для промежуточный сервер, но не было самой туманной идеи. Быстрый поиск через исходный код capistrano показал, что я мог бы использовать набор :branch "branch_name" в моем развертывании script. Я попробовал, и это сработало. Затем я решил, что мне нужно будет сделать аналогичные изменения во всех моих ветки. Конечно, Im ленивый дерн и задавался вопросом, не было ли лучший способ.

Если вы не знакомы с git, вывод команды ветвления gitпредставляет собой список ветвей со звездочкой, обозначающей извлечен на вашей локальной машине. Например:

> git branch
* drupal_authentication
fragment_caching
master

Итак, я понял, что, если бы я просто разбирал вывод и искал ветвь отмечена как текущая:

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

Теперь я могу развернуть любую ветку на моей локальной машине из одного, общего, развертывания script.

Ответ 1

Это работает с 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")

Ответ 2

С многоступенчатым, это на самом деле сейчас:

cap production deploy -s branch=my-branch

Предыдущий синтаксис сообщения не работает в моей среде

Ответ 3

Используя 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 }

btw, 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 (^ _ ^)

Ответ 4

Альтернативой этому является:

В deploy.rb/stage.rb:

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

В командной строке:

cap deploy BRANCH=featurex

Это дает вам ветку по умолчанию (которая может быть разной для разных сред) и возможность изменять ветки, когда вы хотите.

Ответ 5

В качестве альтернативы вы можете структурировать его из командной строки, где у вас есть ветвь по умолчанию и среда, а также вы можете передавать параметры в вызов крышки, который может включать среду и ветвь для использования. Это может быть ветвь, которая явно передана или вы можете иметь параметр, который указывает текущую ветвь, как описано в указанной вами ссылке.

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

Пример кода, заимствованный в значительной степени отсюда

Ответ 6

Если вы используете capistrano-multistage, вам нужно всего лишь запустить

cap -s branch=$MY_BRANCH deploy

или

cap -s branch=$MY_BRANCH production deploy

без каких-либо дальнейших изменений в deploy.rb.

Ответ 7

Эта команда больше не работает:

cap deploy -s branch=your_branch

Поддержка флажков -sS была удалена в capistrano v3+.
Здесь вы можете узнать больше об этом: ссылка
Это было упомянуто в нескольких ответах, но в настоящее время это неверно.

Что для меня работает:
в deploy.rb добавить файл

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

затем выполните:

BRANCH=your_branch cap deploy

Также обратите внимание, что для успешного выполнения этой команды вам необходимо находиться на главной ветке.

Ответ 8

Это решение должно работать со всеми версиями 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

Ответ 9

Я использую версию 3.3.5, и у меня это работает:

set :branch, 'develop'

Ответ 10

Общий ответ:

Если у вас есть файл настроек с содержимым, измененным из среды в среду, вы должны сделать эту строку "шаблоном" (со строкой, представляющей имя переменной, например @[email protected] или @[email protected]).

Затем у вас будет (версия) script возможность прочитать ваш файл конфигурации и заменить переменную "@[email protected]" на соответствующее значение, необходимое для процесса развертывания.

Ответ 11

Для пользователей 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

Ответ 12

Способ 1: установка ветки определенного типа (например, тест, производство) для развертывания

Поместите branch конфигурацию в сценических файлах вместо "deploy.rb" и установите целевую ветвь для этого этапа для развертывания.

Для двухэтапного приложения с именем связанной ветки test и production конфигурация будет выглядеть следующим образом:

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

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

Этот метод позволяет разворачиваться из отдельных ветвей. Таким образом, только дополнительный шаг, который потребуется, состоит в том, чтобы объединить или переустановить последний код из базовой ветки.

Способ 2. Развертывание непосредственно из любой ветки (с использованием тега)

Другой подход заключается в развертывании с использованием тега. Чтобы развернуть тег, установите конфигурацию branch. в разделе "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-test

Примечание. Вышеуказанные методы основаны на Capistrano 3.