Использование 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.