件名:プロジェクトバージョン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
ここで何が起こっていますか:
- git configから現在のユーザーデータ(名前とメール)を取得します
- インストールされたリビジョンからconfigs.iniファイルを取得し、バージョンを引き出します
- 注釈付きタグを作成します。 注釈では、誰が、いつ
- タグを公開
リポジトリ更新の処理
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のタスクの名前を引き出すコードの一部を書き直すのを手伝ってくれたら-私はとても幸せです。