在使用Capistrano部署之前标记版本

时间:2011-04-20 19:34:26

标签: ruby git 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

5 个答案:

答案 0 :(得分:23)

我和Capistrano做过类似的事情。最简单的方法是使用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

答案 1 :(得分:3)

只需添加您正在构建的提交的短哈希。

git log -1 --format=%h

答案 2 :(得分:3)

感谢@ dunedain289给出了一个很好的答案。我更进一步试图复制herist版本为capistrano。我需要一个很好的工具来了解已经部署在服务器上的内容,并使用我当前的本地分支进行差异化:

  1. 首先,使用@ 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
    
  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 :(得分:1)

关于如何通过Capistrano输出文本的代码中的问题。只需将p更改为puts即可显示。

答案 4 :(得分:0)

此接受的答案的更新版本对我有用:

desc 'Tag the deployed revision'
task :push_deploy_tag do
  env = fetch(:rails_env)
  timestamp = fetch(:release_timestamp)
  user = `git config --get user.name`.chomp
  email = `git config --get user.email`.chomp

  puts `git tag #{env}-#{timestamp} #{fetch :current_revision} -m "Deployed by #{user} <#{email}>"`
  puts `git push --tags origin`
end