我正在寻找一个很好的小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
答案 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。我需要一个很好的工具来了解已经部署在服务器上的内容,并使用我当前的本地分支进行差异化:
首先,使用@ 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
答案 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