Использование capistrano для развертывания из разных веток git - PullRequest
116 голосов
/ 06 октября 2009

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

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

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

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

Редактировать: Оказывается кто-то уже сделал именно то, что мне нужно :

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

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

> git branch
* drupal_authentication
fragment_caching
master

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

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

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

Ответы [ 12 ]

145 голосов
/ 30 января 2012

Это работает с Capistrano> = 3.1:

добавить эту строку в config/deploy.rb:

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

, а затем вызвать Capistrano с:

cap production deploy BRANCH=master

Это решение работает с Capistrano <3.1: </p>

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

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")
30 голосов
/ 31 января 2014

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

Кстати, 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 (^ _ ^)

27 голосов
/ 16 октября 2012

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

cap production deploy -s branch=my-branch

Синтаксис предыдущего поста не работает в моей среде

24 голосов
/ 18 марта 2013

Я могу подтвердить, что ниже все еще работает в Cap 3.11.0 13/10/18, а также Cap 2:

В deploy.rb / stage.rb:

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

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

cap deploy BRANCH=featurex

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

15 голосов
/ 18 ноября 2009

В качестве альтернативы вы можете структурировать его из командной строки, где у вас есть ветвь и среда по умолчанию, а также вы можете передавать параметры в вызов 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
...

Пример кода заимствован здесь

10 голосов
/ 09 июля 2012

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

cap -s branch=$MY_BRANCH deploy

или

cap -s branch=$MY_BRANCH production deploy

без дальнейшего редактирования на deploy.rb.

7 голосов
/ 15 мая 2016

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

cap deploy -s branch=your_branch

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

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

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

затем запустите:

BRANCH=your_branch cap deploy

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

3 голосов
/ 25 июня 2014

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

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

set :branch, 'develop'
1 голос
/ 09 сентября 2017

Метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...