Отметить выпуск перед развертыванием с помощью Capistrano
Я хочу создать небольшой рецепт Capistrano для развертывания версии сайтов, управляемой в Git.
В дополнение к некоторым другим вещам, над которыми я работаю над добавлением, моя первая задача - пометить текущую версию текущей датой... и когда этот тег уже существует (например, несколько выпусков за день), добавьте письмо.
Я написал некоторый рабочий код, и я протестировал его в своем production.rb(используя многоступенчатый в capistrano-ext)... но я должен думать, что мог бы написать это лучше. Во-первых, существует огромное количество повторений в фактической проверке существования тега. Однако, независимо от того, какой порядок я перемещаю, это единственная конфигурация, которая дает результаты.
Любые идеи? Спасибо заранее.
before 'deploy' do
# Tag name is build_YYYYMMDD
tag_name = "build_#{Time.now.strftime('%Y%m%d')}"
check_tag = `git tag -l #{tag_name}`
# If the tag exists, being appending letter suffix
if not check_tag.empty?
suffix = 'a'
check_tag = `git tag -l #{tag_name}#{suffix}`
while not check_tag.empty? do
suffix.next!
check_tag = `git tag -l #{tag_name}#{suffix}`
end
tag_name = "#{tag_name}#{suffix}"
end
# Tag with computed tag name
p "Tagging #{tag_name}" # TODO How to output via Capistrano?
system "git tag #{tag_name}"
# Push tags to origin remote
p "Pushing tag to origin" # TODO How to output via Capistrano?
system "git push origin master --tags"
end
Ответы
Ответ 1
Я сделал что-то подобное с Капистрано. Проще всего сделать это тег, используя имя временной метки, которое использовал Capistrano во время развертывания - это YYYYMMDDHHMMSS, поэтому очень сложно получить дубликаты.
Пример:
task :push_deploy_tag do
user = `git config --get user.name`.chomp
email = `git config --get user.email`.chomp
puts `git tag #{stage}_#{release_name} #{current_revision} -m "Deployed by #{user} <#{email}>"`
puts `git push --tags origin`
end
Ответ 2
Просто добавьте короткий хэш котенка, из которого вы строите.
git log -1 --format=%h
Ответ 3
Спасибо @dunedain289 за отличный ответ. Я сделал еще один шаг, чтобы попытаться воспроизвести выпуски heroku для capistrano. Мне нужен был хороший инструмент, чтобы узнать, что уже было развернуто на серверах, и сделать разницу с моей текущей локальной ветвью:
-
сначала используйте код @dunedain289, немного модифицированный для работы для меня
task :push_deploy_tag do
user = `git config --get user.name`.chomp
email = `git config --get user.email`.chomp
stage = "production" unless stage # hack, stage undefined for me
puts `git tag #{stage}_#{release_name} -m "Deployed by #{user} <#{email}>"`
puts `git push --tags origin`
end
-
Добавить задачу для фильтрации тегов выпуска и разграничения последнего
task :diff do
stage = "production" unless stage
last_stage_tag = `git tag -l #{stage}* | tail -1`
system("git diff #{last_stage_tag}", out: $stdout, err: :out)
end
#this preserves coloring if you have a .gitconfig with
[color "diff"]
meta = yellow bold
frag = magenta bold
old = red bold
new = green bold
-
выполнить
$ cap diff
# awesome colored diff of production and local
Ответ 4
Относительно вашего вопроса в коде о том, как вывести текст через Capistrano. Просто измените p на puts и он отобразится нормально.