Використання capistrano для розгортання з різних гіт git


125

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

Моя проблема така: скажімо, я створюю нову гілку A від master . Файл розгортання посилається на головну гілку. Я це редагую, щоб A можна було розгорнути для тестування середовища. Я закінчую роботу над функцією та об'єдную гілку А в головний . Так як deploy.rbфайл з A свіжа, він отримує об'єднаний в і тепер deploy.rbв майстер посилання гілки А . Час знову редагувати.

Це багато, здавалося б, непотрібного ручного редагування - параметр повинен завжди відповідати поточній назві гілки. Крім того, легко забути редагувати налаштування кожен раз.

Який був би найкращий спосіб автоматизувати цей процес?

Редагувати: Виявляється, хтось уже зробив саме те, що мені потрібно :

Сьогодні вранці я мав нагоду розгорнути гілку сховища git на сервісі, але не маю найменшого уявлення, як це зробити. Швидкий пошук через вихідний код capistrano показав, що я можу використовувати набір :branch "branch_name"у своєму сценарії розгортання. Я спробував це, і це спрацювало. Тоді я подумав, що мені потрібно внести подібні зміни в усі мої гілки. Звичайно, я лінивий дерночок і замислювався, чи немає кращого способу.

Якщо ви не знайомі з git, результатом команди гілки git є перелік гілок із зірочкою, що позначає ту, яку зараз перевірено на вашій локальній машині. Наприклад:

> git branch
* drupal_authentication
fragment_caching
master

Отже, я зрозумів, що робити, якщо я просто проаналізував вихід і шукав гілку, позначену як поточну:

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']

а потім зателефонуйте до капістрано за допомогою:

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, але це працювало для мене просто за допомогою гілки
Том Гаррісон,

як стверджує @lulalala, мені потрібно використовувати малі регістри для того, щоб він міг отримати вказану гілку.
Джахан

@Jani: Дякую, схоже, вони змінили це в нових версіях capistrano, і я відповідно відредагував свою відповідь.
wintersolutions

У мене була точно протилежна проблема, ніж у @Jani: мені довелося мати верхній регістр -S, орелсе аргумент не передаватиметься до cap, коли використовується fetch (: var_name, 'default'), щоб отримати його.
Фредерік Струк-Шонінг

1
опція '-s' (--set) означає "Встановити змінну після завантаження рецептів." а опція 'S' (--set-before) означає «Встановити змінну перед завантаженням рецептів».
Рамон Кальдейра

33

Використовуючи 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
git rev-parse --abbrev-ref HEADвикористовується для з'ясування, на якій гілці знаходиться HEAD. біг git rev-parse --abbrev-ref stagingбуде (майже) завжди виводити staging. Можна просто використовувати set :branch, 'staging'.
MiniGod

27

З багатоступінчатою це насправді зараз:

cap production deploy -s branch=my-branch

Синтаксис попереднього допису не працює в моєму середовищі


1
-s branch=fooвстановлює гілку змінної capistrano fooпісля завантаження рецептів
Альвін

26

Я можу підтвердити, що наведене нижче все ще працює в Cap 3.11.0 13/10/18, а також у Cap 2:

В розгортанні.rb / stage.rb:

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

У командному рядку:

cap deploy BRANCH=featurex

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


15

Крім того, ви можете структурувати його з командного рядка, де у вас є гілка та середовище за замовчуванням, а також ви можете передати параметри до виклику з обмеженням, який міг би включати оточення та гілку для використання. Це може бути гілка, яка явно передана, або ви можете мати параметр, який би вказував поточну гілку, як описано у переліченому вами посиланні.

#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для того, щоб вона
отримала

У мене була протилежна проблема, ніж у @lulula: мені довелося мати верхній регістр -S, орелсе аргумент не переходитиме до шапки при використанні fetch (: var_name, 'default'), щоб отримати його.
Фредерік Струк-Шонінг

10

Якщо ви використовуєте capistrano-багатоступеневу , вам потрібно лише запустити

cap -s branch=$MY_BRANCH deploy

або

cap -s branch=$MY_BRANCH production deploy

без жодних додаткових змін до свого deploy.rb.


2
Це має бути branch=, ні branch-.
Джимофій

3
OptionParser :: AmbiguousOption: неоднозначний варіант: -s
giorgio

8

Ця команда більше не працюватиме:

cap deploy -s branch=your_branch

Підтримка -sSпрапорів була видалена в capistrano v3 +.
Тут ви можете прочитати докладніше про це: посилання
Це було зазначено в парі відповідей, але наразі це невірно.

Що для мене працює:
у deploy.rbфайл add

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

потім запустіть:

BRANCH=your_branch cap deploy

Також зауважте, що для успішного виконання цієї команди вам потрібно перейти в головну гілку.


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


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конфігурацію у файли етапу замість 'implemen.rb' та встановіть цільову гілку, на якій цей етап буде розгорнуто.

Для двоступеневого додатка із пов’язаною назвою гілки testта productionконфігурація виглядатиме так:

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

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

Цей спосіб дає змогу розгортатись із конкретних стадій гілок. Отже, лише додатковим кроком, який потрібно буде, є об'єднання або відновлення останнього коду з базової гілки.

Спосіб 2. Розгортайте безпосередньо з будь-якої гілки (використовуючи тег)

Інший підхід - розгортання за допомогою тегу. Для розгортання за допомогою тегу встановіть branchconfig. в 'implemen.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-тест"

  • І, натисніть

    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`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.