プロジェクトのデプロイ時にメールで通知を送信する

私たちのプロジェクトでは、デプロイするたびに、開発者、テスター、そして数人の人々が素晴らしい手紙を受け取ります。

件名:プロジェクトバージョンv1.1.1はサーバー「テスト」で更新されます



user1は、次の更新を「テスト」サーバーにアップロードしました。



タスクのコミット:

jira.local /参照/ PROJECT-1234



以前の更新からのコミットの完全なリスト:

4392a53木8月18日17:50:32 2011 +0700 user1 / [PROJECT-1234]が便利になりました

f2fcfe2 Thu Aug 18 17:37:53 2011 +0700 user1 /ひどいことをした

cb1fcbe 2011年8月17日水曜日15:18:10 2011 +0700 user2 /リファクタリング



ファイルの変更:

file1 | 4 ++-

file2 | 8 ++++ ----

file3 | 8 ++++ ----

3個のファイルが変更され、10個の挿入(+)、10個の削除(-)



このようなソリューションは、テスターの質問「バグXXXの修正を既に投稿しましたか?」、「テストサーバーの新機能」を取り除くのに役立ちました。 また、すべてのチームメンバー、実装部門、および管理者は、サーバー上のコードで何が起こっているかを認識しています。

作業には、git、capistrano(+マルチステージ)、php、bash(+一部のコンソールユーティリティ)が使用されます。 興味がある場合-猫の下に行きます。



作業アルゴリズム



タグ作成

capistranoとcapistrano-multistageの設定については、まだどこにも書かれていないので、タグの追加方法を説明します。



runtime.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
      
      





ここで何が起こっていますか:

リポジトリ更新の処理

pre-receiveフックは、入力(stdin)で3つの値を受け取ります。前のリビジョンと現在のリビジョン、refnameです。

着信パラメーターを読み取り、タグが到着したことを確認します。

 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
      
      





それでは、タスクのコミットを解析しましょう。 Jiraの後者は、マスク<プロジェクトエイリアス>-<タスクID>にちなんで命名されます。すべての開発者は、コミットでタスクエイリアス(大文字)を指定する必要があります。 タスクが30分を超えており、複数のコミットが必要な場合、タスクエイリアスに従ってブランチが作成され、コミットではこのタスクについて言及しなくなります。 合計で、タスクのリストを取得するには、定期的なスケジュールで簡単な処理を実行する必要があります。

 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



PS誰かがperl / bashのタスクの名前を引き出すコードの一部を書き直すのを手伝ってくれたら-私はとても幸せです。



All Articles