рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рд░ рддреИрдирд╛рддреА рдкрд░, рдбреЗрд╡рд▓рдкрд░реНрд╕, рдкрд░реАрдХреНрд╖рдХ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрджреНрднреБрдд рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
рд╡рд┐рд╖рдп: рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг v1.1.1 рд╕рд░реНрд╡рд░ 'рдкрд░реАрдХреНрд╖рдг' рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
user1 рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдкрдбреЗрдЯ 'рдкрд░реАрдХреНрд╖рдг' рд╕рд░реНрд╡рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдП:
рдХрд╛рд░реНрдп рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
jira.local / Browse / PROJECT-1234
рдкрд┐рдЫрд▓реЗ рдЕрдкрдбреЗрдЯ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдорд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА:
4392a53 Thu Aug 18 17:50:32 2011 +0700 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 1 / [рдкрд░рд┐рдпреЛрдЬрдирд╛ -1234] рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдпрд╛
f2fcfe2 Thu Aug 18 17:37:53 2011 +0700 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 1 / рдПрдХ рднрдпрд╛рдирдХ рдерд╛
cb1fcbe Wed Aug 17 15:18:10 2011 +0700 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 2 / рдкреБрдирдГ рд╕рдХреНрд░рд┐рдп
рдлрд╝рд╛рдЗрд▓ рдкрд░рд┐рд╡рд░реНрддрди:
file1 | 4 ++ -
file2 | 8 ++++ ----
file3 | 8 ++++ ----
3 рдлрд╛рдЗрд▓реЗрдВ рдмрджрд▓ рдЧрдИрдВ, 10 рд╕рдореНрдорд┐рд▓рди (+), 10 рд╡рд┐рд▓реЛрдкрди (-)
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реА "рдареАрдХ рд╣реИ, рдХреНрдпрд╛ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдЧ XXX рдХреЗ рд▓рд┐рдП рдлрд┐рдХреНрд╕ рдкреЛрд╕реНрдЯ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ?", "рдЯреЗрд╕реНрдЯ рд╕рд░реНрд╡рд░ рдкрд░ рдирдпрд╛ рдХреНрдпрд╛ рд╣реИ?"ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рднреА рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рднрд╛рдЧ рдФрд░ рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред
рдХрд╛рдо рдХреЗ рд▓рд┐рдП, git, capistrano (+ multistage), php, bash (+ рдХреБрдЫ рдХрдВрд╕реЛрд▓ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд░реБрдЪрд┐ рд╣реИ - рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдУред
рдХрд╛рд░реНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
- рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдкрд░ рдХреЛрдб рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ (рдЯреЛрдкреА рдкрд░реАрдХреНрд╖рдг рддреИрдирд╛рддреА)
- рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж: рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдПрдХ рд╣реБрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рдЯреИрдЧ рдмрдирд╛рддрд╛ рд╣реИред рдЯреИрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирддрд╛ рд╣реИ (рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд, рднрдВрдбрд╛рд░ рдореЗрдВ), рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╕рд░реНрд╡рд░ рдХрд╛ рдирд╛рдо рдФрд░ рд░рд┐рд▓реАрдЬ рдХрд╛ рдирд╛рдо
- рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдПрдХ рд╣реБрдХ рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЯреИрдЧ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ; рдпрджрд┐ рдЯреИрдЧ рд╣реИ:
- рд╣рдордиреЗ рдЗрд╕реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рджреЗрдЦрд╛: рд╕рдВрд╕реНрдХрд░рдг, рд╕рд░реНрд╡рд░
- рд╣рдо рдЙрд╕реА рд╕рд░реНрд╡рд░ рдкрд░ рдкрд┐рдЫрд▓реЗ рдЯреИрдЧ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ
- рдпрджрд┐ рдХреЛрдИ рдЯреИрдЧ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдкрд╣рд▓реА рд╕реНрдерд╛рдкрдирд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдВрддрд░ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рдХрдИ рд╣рдЬрд╛рд░ рдХрдорд┐рдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
- рдпрджрд┐ рдХреЛрдИ рдЯреИрдЧ рд╣реИ, рддреЛ рд╣рдо рдорддрднреЗрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдЦреАрдВрдЪрддреЗ рд╣реИрдВ; рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдУ
- рдПрдХ рдЙрддреНрдкрдиреНрди рдИрдореЗрд▓ рднреЗрдЬрдирд╛
рдЯреИрдЧ рдирд┐рд░реНрдорд╛рдг
рдХреИрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ рдФрд░ рдХреИрдкрд┐рд╕реНрдЯреНрд░рд╛рдиреЛ-рдорд▓реНрдЯреАрд╕реНрдЯреЗрдЬ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЯреИрдЧ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
runs.version рдХреБрдВрдЬреА рд╡рд╛рд▓реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдЬрдбрд╝ рдореЗрдВ рдПрдХ
configs.ini рдлрд╝рд╛рдЗрд▓ рд╣реИред рдЖрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
# 381852 ред
namespace :deploy do ... after "deploy:restart", "deploy:git:push_deploy_tag" namespace :git do desc "Place release tag into Git and push it to server." task :push_deploy_tag do user = `git config --get user.name`.strip email = `git config --get user.email`.strip version = `git cat-file -p #{real_revision}:configs.ini | fgrep runtime.version | awk -F '[ =]+' '{print $2}'`.strip puts `git tag v#{version}-#{stage}-#{release_name} #{real_revision} -m "Deployed by #{user} <#{email}>"` puts `git push --tags` end end end
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
- рд╣рдо git config рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ (рдирд╛рдо рдФрд░ рдореЗрд▓) рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ
- рд╣рдо рд╕реНрдерд╛рдкрд┐рдд рд╕рдВрд╢реЛрдзрди рд╕реЗ configs.ini рдлрд╝рд╛рдЗрд▓ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ
- рдПрдХ рдПрдиреЛрдЯреЗрдЯ рдЯреИрдЧ рдмрдирд╛рдПрдВред рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рдФрд░ рдХрдм
- рдЯреИрдЧ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЕрджреНрдпрддрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рдкреВрд░реНрд╡-рдкреНрд░рд╛рдкреНрдд рд╣реБрдХ рдЗрдирдкреБрдЯ (рд╕реНрдЯрдбрд┐рди) рдореЗрдВ 3 рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ: рдкрд┐рдЫрд▓рд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╢реЛрдзрди, рдлрд┐рд░ рд╕реЗ рднрд░рдирд╛ред
рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЯреИрдЧ рдЖ рдЧрдпрд╛ рд╣реИ:
while read oldrev newrev refname do rev_type=$(git cat-file -t $newrev 2>/dev/null) case "$refname","$rev_type" in refs/tags/*,tag) ... ;; esac done
рдЯреИрдЧ рдирд╛рдо рдЪреБрдиреЗрдВ, рдЗрд╕реЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рддреЛрдбрд╝реЗрдВ, рдЗрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдЯреИрдЧ рдХреЛ рджреЗрдЦреЗрдВ:
tag=${refname##refs/tags/} version=`echo $tag | cut -d- -f1` server=`echo $tag | cut -d- -f2` prevtag=$(git describe --tags --abbrev=0 --match="*-$server-*" $newrev^ 2>/dev/null)
рдпрджрд┐ $ prevtag рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдпрд╣ рд╕рд░реНрд╡рд░ рдкрд░ рдкрд╣рд▓реА рд╕реНрдерд╛рдкрдирд╛ рд╣реИред рдпрджрд┐ рдирдП рдФрд░ рдкреБрд░рд╛рдиреЗ рдЯреИрдЧ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрджреНрдпрддрди рд╣реИ; рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╕рд╣реА рд╕рдВрджреЗрд╢ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдЕрдХреНрд╖рд░ рдХрд╛ рд╢рд░реАрд░ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕рдХреА рддреИрдирд╛рддреА рдХреА рд╣рд┐рдореНрдордд рд╣реИ:
eval $(git for-each-ref --shell --format=' tagger=%(taggername) tagged=%(taggerdate)' $refname ) echo "$tagger '$server':" > msg
рдЕрдм рдЪрд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд╛рд░реНрдп рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЬреАрд░рд╛ рдХреЗ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдореБрдЦреМрдЯрд╛ рдХреЗ рдирд╛рдо рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ <рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд▓рд┐рдпрд╛рд╕> - <рдХрд╛рд░реНрдп рдЖрдИрдбреА>, рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ рдХрд╛рд░реНрдп рдЙрдкрдирд╛рдо (рдЕрдкрд░рдХреЗрд╕) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрд╛рд░реНрдп 30 рдорд┐рдирдЯ рд╕реЗ рдмрдбрд╝рд╛ рд╣реИ рдФрд░ 1 рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдЙрдкрдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╢рд╛рдЦрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
git log $rev_range --abbrev-commit --pretty="format:%s" > tmpfile php >tickets <<END <?php \$f = file_get_contents("$tmp"); if (preg_match_all("#([AZ.]+-\d+)#", \$f, \$matches)) { \$matches[1] = array_unique(\$matches[1]); foreach (\$matches[1] as \$match) { echo '$JIRA_HOST/browse/', \$match, PHP_EOL; } } END
рдпрджрд┐ рдЕрдВрдд рдореЗрдВ
tmpfile рдлрд╝рд╛рдЗрд▓ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ - рдЗрд╕реЗ рд╕рдВрджреЗрд╢ рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж рдЬрд╛рдирдХрд╛рд░реА рдЖрддреА рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд╣рд┐рдд: рдХрдорд┐рдЯ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА:
echo " :" >> msg git log $rev_range --no-merges --abbrev-commit --pretty="format:%h %ad %an / %s" >> msg echo -e "\n\n :" >>msg git diff --stat=140,110 $rev_range >>msg
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдореВрд░реНрдЦ рдПрдХ рдкрддреНрд░ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ:
cat msg | mail -s "$subject" $MAIL_TO
рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ github:
github.com/zvirusz/git-deploy-notify рдкрд░ рд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ
рдкреБрдирд╢реНрдЪ рдЕрдЧрд░ рдХреЛрдИ perl / bash рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ - рддреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред