2012-04-18 2 views
30

Я изучаю возможность использования Capistrano в качестве универсального развертывания. Под «родовым» я имею в виду не-рельсы. Я не доволен качеством документации, которую я нахожу, однако, предоставил, я не смотрю на те, которые предполагают, что вы развертываете рельсы. Поэтому я просто попытаюсь взломать что-то на основе нескольких примеров, но есть несколько проблем, с которыми я сталкиваюсь с самого начала.Передача параметров Capistrano

Моя проблема заключается в том, что cap deploy не располагает достаточной информацией для чего-либо. Важно отметить, что отсутствует тег для версии, которую я хочу развернуть, и этот имеет, который будет передан в командной строке.

Другая проблема заключается в том, как я указываю свой репозиторий git. Наш сервер git доступен SSH на учетной записи пользователя, но я не знаю, как изменить deploy.rb, чтобы использовать идентификатор пользователя как часть URL-адреса scm.

Итак, как я могу это осуществить?

Пример

Я хочу, чтобы развернуть результат первого спринта второго выпуска. Это помечено в репозитории git как r2s1. Кроме того, скажем, пользователь «johndoe» получает задачу развертывания системы. Чтобы получить доступ к репозиторию, он должен использовать URL-адрес [email protected]:app. Таким образом, удаленный URL-адрес репозитория зависит от идентификатора пользователя.

командные строки, чтобы получить нужные файлы были бы эти:

git clone [email protected]:app 
cd app 
git checkout r2s1 
+0

Эй, надеюсь, вы не проигнорируете наши ответы. Прокомментируйте их, по крайней мере, пожалуйста. :) – deadrunk

ответ

46

Has Jarrad сказал, Capistrano -ash - хороший базовый набор вспомогательных модулей для развертывания других типов проектов, хотя в конце дня он не требуется. Это всего лишь язык сценариев, и большинство задач выполняются с помощью системных команд и в конечном итоге становятся почти похожими на сценарий оболочки.

Чтобы передать параметры, вы можете установить флаг -s при запуске cap, чтобы дать вам пару значений ключа. Сначала создайте такую ​​задачу.

desc "Parameter Testing" 
task :parameter do 
    puts "Parameter test #{branch} #{tag}" 
end 

Тогда начните свою задачу так.

cap test:parameter -s branch=master -s tag=1.0.0 

Для последней части. Я бы рекомендовал настроить доступ без доступа с помощью ssh-ключей к вашему серверу. Но если вы хотите взять его у текущего зарегистрированного пользователя.Вы можете сделать что-то подобное.

desc "Parameter Testing" 
task :parameter do 
    system("whoami", user) 
    puts "Parameter test #{user} #{branch} #{tag}" 
end 

UPDATE: Edited работать с последними версиями Capistrano. Массив конфигурации больше не доступен.

Глобальные параметры: См. Комментарии Используйте параметры: branch, fetch (: branch, 'a-default-value') для использования параметров по всему миру. (И передайте их вместо -S.)

+0

Это прекрасно, насколько это возможно, но как я могу сказать Capistrano, какой тег он должен проверить? –

+1

Использование параметра -s. Поэтому у меня была бы такая командная строка для развертывания определенного тега. колпачка производственной Deploy -s тег = 2.1.3 Если вы делаете использование capistano золы, вы просто должны сделать набор: ветвь, # {Конфигурация [Тег]} Это должна проверкой тега установленный в командной строке –

+2

Это больше не работает. Согласно https://groups.google.com/forum/?fromgroups=#!topic/capistrano/1nFQPWf9EIo и других местах, 'configuration' устарел:' undefined local variable or method 'configuration' для # (NameError) '. Теперь вы можете просто использовать имена переменных. Как это работает всего несколько месяцев назад? – jordanpg

0

Заканчивать capistrano-ash для библиотеки, которая помогает при развертывании не-рельсы. Я использую его для развертывания приложения PyroCMS, и он отлично работает.

Вот отрывок из моего Capfile для этого проекта:

# deploy from git repo 
set :repository, "[email protected]:mygitrepo.git" 
# tells cap to use git 
set :scm, :git 

Я не уверен, я понимаю, последние две части вопроса. Предоставьте более подробную информацию, и я буду рад помочь.

EDIT после приведенного примера:

set :repository, "#{scm_user}@gitsrv.domain:app" 

Тогда каждый человек с Deploy priveledges можно добавить следующие строки в свой местный ~/.caprc файла:

set :scm_user, 'someuser' 
+0

Хорошо, пример приведен. Обратите внимание: я не могу установить репозиторий на фиксированное значение, как и в вашем фрагменте. –

+0

Домашний '.caprc' приятно иметь, но не может быть обязательным. Я хочу передать параметры в командной строке. –

9

Я бы предложил использовать переменные ENV.

Somethings нравится эта (команда):

$ GIT_REPO="[email protected]:app" GIT_BRANCH="r2s1" cap testing 

Cap конфигурации:

#deploy.rb: 
task :testing, :roles => :app do 
    puts ENV['GIT_REPO'] 
    puts ENV['GIT_BRANCH'] 
end 

И посмотрите на https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension, может быть такой подход будет полезен для вас.

+1

Я заметил, что использование переменных среды« в »с материалом Ruby, но я думаю, что они очень неудобны. Например, мне понадобится три отдельные команды в Windows с предложением, которое вы представляете, каждый из которых подвержен малым ошибкам опечатки, и паршивая обратная связь, если вы делаете опечатку. –

+0

Я согласен с последним комментарием, я предпочитаю командную строку с -s или -S var = value, а затем что-то вроде 'if variables.include? (: Var) ... else ... конец' – Federico

3

Как уже показал Джейми, вы можете передать параметры задания с флагом -s. Я хочу показать вам, как вы можете использовать значение по умолчанию.

Если вы хотите работать со значениями по умолчанию, вы должны использовать fetch вместо ||= или проверки nil:

namespace :logs do 
    task :tail do 
    file = fetch(:file, 'production') # sets 'production' as default value 
    puts "I would use #{file}.log now" 
    end 
end 

Вы можете либо запустить эту задачу (используется значение по умолчанию production для file)

$ cap logs:tail 

или (использует значение cron для file

$ cap logs:tail -s file=cron 
6

Обновление. Что касается передачи параметров только в задачу Capistrano 3.

Я знаю, что этот вопрос довольно старый, но по-прежнему всплывает в первую очередь в Google при поиске параметров для задачи Capistrano. К сожалению, фантастический ответ предоставляется Джейми Сазерленд уже не действует с Capistrano 3. Перед тем, как тратить свое время, пытаясь его, за исключением результатов, которые должны быть, как показано ниже:

cap test:parameter -s branch=master 

выходов:

cap aborted! 
OptionParser::AmbiguousOption: ambiguous option: -s 
OptionParser::InvalidOption: invalid option: s 

и

cap test:parameter -S branch=master 

выходы:

invalid option: -S 

Допустимы ответы на Capistrano 3 предоставляемые @senz и Брэд Dwyer вы можете найти, нажав на эту ссылку: золотой Capistrano 3 pulling command line arguments

Для полноты см ниже код, чтобы узнать о две опции у вас есть.

первый вариант:

Вы можете перебирать задачи с ключом и значением, как вы делаете с обычными хэшей:

desc "This task accepts optional parameters" 

task :task_with_params, :first_param, :second_param do |task_name, parameter| 
    run_locally do 
    puts "Task name: #{task_name}" 
    puts "First parameter: #{parameter[:first_param]}" 
    puts "Second parameter: #{parameter[:second_param]}" 
    end 
end 

Убедитесь, что нет пространства между параметрами при вызове Колпачок:

cap production task_with_params[one,two] 

второй вариант:

В то время как вы называете любую задачу, вы можете назначить переменные окружения, а затем вызывать их из кода:

set :first_param, ENV['first_env'] || 'first default' 
set :second_param, ENV['second_env'] || 'second default' 

desc "This task accepts optional parameters" 
task :task_with_env_params do 
    run_locally do 
    puts "First parameter: #{fetch(:first_param)}" 
    puts "Second parameter: #{fetch(:second_param)}" 
    end 
end 

Чтобы назначить переменные окружения, шапочку вызова, как ниже:

cap production task_with_env_params first_env=one second_env=two 

Надежда, что позволит сэкономить вы некоторое время.

Смежные вопросы