рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддреИрдирд╛рдд рд╣реЛрдиреЗ рдкрд░ рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬрдирд╛

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рд░ рддреИрдирд╛рддреА рдкрд░, рдбреЗрд╡рд▓рдкрд░реНрд╕, рдкрд░реАрдХреНрд╖рдХ рдФрд░ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрджреНрднреБрдд рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
рд╡рд┐рд╖рдп: рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд╕реНрдХрд░рдг 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 

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:

рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЕрджреНрдпрддрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг

рдкреВрд░реНрд╡-рдкреНрд░рд╛рдкреНрдд рд╣реБрдХ рдЗрдирдкреБрдЯ (рд╕реНрдЯрдбрд┐рди) рдореЗрдВ 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 рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ - рддреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/In126630/


All Articles