Отметить выпуск перед развертыванием с помощью 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 и он отобразится нормально.