Пометка релиза перед развертыванием с Capistrano - PullRequest
12 голосов
/ 20 апреля 2011

Я собираюсь создать симпатичный маленький рецепт Capistrano для развертывания версий сайтов, управляемых в Git.

В дополнение к некоторым другим вещам, над которыми я работаю, моей первой задачей является пометка текущей версиис текущей датой ... и когда этот тег уже существует (например, несколько выпусков в день), добавьте письмо.

Я написал некоторый рабочий код и протестировал его в своей работе.рб (используя многоступенчатый в 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

Ответы [ 4 ]

23 голосов
/ 20 апреля 2011

Я сделал нечто похожее с Капистрано.Самое простое, что можно сделать, это тег с использованием имени временной метки, которое Capistrano использовал во время развертывания - это ГГГГММДДЧЧММСС, поэтому дубликаты действительно трудно получить.

Пример:

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
3 голосов
/ 15 июля 2013

Спасибо @ dunedain289 за отличный ответ.Я сделал еще один шаг, чтобы попытаться повторить релизы героку для Capistrano.Мне нужен был хороший инструмент, чтобы узнать, что уже было развернуто на серверах, и провести различие с моей текущей локальной веткой:

  1. сначала используйте код @ dunedain289, слегка модифицированный для работы сme

    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
    
  2. Добавить задачу для фильтрации тегов выпуска и сравнения последних

    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
    
  3. выполнить

    $ cap diff
    # awesome colored diff of production and local
    
3 голосов
/ 21 апреля 2011

Просто добавьте короткий хеш коммита, из которого вы строите.

git log -1 --format=%h
1 голос
/ 22 июня 2011

По поводу вашего вопроса в коде о том, как выводить текст через Capistrano.Просто измените p на put, и все будет хорошо.

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