git+slack連携
技術文書
2015/06/14
※参考URL
http://qiita.com/artifactsauce/items/242c71428fa85307c182
slackでIncoming WebHooks作成¶
gitサーバーperl環境構築¶
[root]$ yum install perl-JSON
[root]$ yum install perl-Net-SSLeay
[root]$ yum install perl-Crypt-SSLeay
[root]$ yum install perl-IO-Socket-SSL
gitサーバーにhook作成¶
[admin]$ vi /home/admin/git/x-generation.git/hooks/post-update
#!/usr/bin/env perl package MyApp::Git::Hook::Notifier::Webhook; use strict; use warnings; use utf8; use Data::Dumper; sub new { my $class = shift; my $self = { @_ }; bless($self, $class); return $self; } sub _generate_ua { my $ua = LWP::UserAgent->new; return $ua; } sub send { my $self = shift; my ( $repo, $branch, $message ) = @_; my ( $url, $post_data, $headers ) = $self->_create_request_parameters( $repo, $branch, $message ); my $ua = $self->_generate_ua(); my $response = $ua->post($url, $post_data, %$headers); unless ($response->is_success) { warn $response->status_line; return 0; } return 1; } package MyApp::Git::Hook::Notifier::Slack; use strict; use warnings; use utf8; use Data::Dumper; use JSON; @MyApp::Git::Hook::Notifier::Slack::ISA = qw(MyApp::Git::Hook::Notifier::Webhook); sub _create_request_parameters { my $self = shift; my ( $repo, $branch, $message ) = @_; my $endpoint = $self->{endpoint}; #my $token = $self->{token}; my $channel = $self->{channel}; my $username = 'Git hooks'; #my $icon = ':jack_o_lantern:'; #my $url = "${endpoint}\?token\=${token}"; my $url = "${endpoint}"; my $text = "(\`${repo}\`) [\`${branch}\`]"; if ( $branch eq 'master' ) { $text = ":bell: PUSHED INTO \`master\` BRANCH!!!\n${text} ${message}"; } elsif ( ! -f "refs/heads/$branch" ) { my @emojis = ( ':neckbeard:', ':scream:', ':scream_cat:', ':see_no_evil:', ':hear_no_evil:', ':speak_no_evil:', ':rage1:', ':rage2:', ':rage3:', ':rage4:', ':trollface:', ); my $emoji_index = int(rand(scalar @emojis)); my $emoji = $emojis[$emoji_index]; $text = "${text} ${emoji} Branch was deleted."; } else { $text = "${text} ${message}"; } my $post_data = { payload => encode_json +{ channel => $channel, username => $username, #icon_emoji => $icon, text => $text, }, }; return $url, $post_data, {}; } package main; use strict; use warnings; use utf8; use Data::Dumper; use FindBin qw($Bin); use File::Basename qw/dirname/; use JSON; use Encode; use Encode::Guess qw/shift-jis euc-jp 7bit-jis/; use LWP::UserAgent; if ( scalar @ARGV == 0 ) { die "[ERROR] Arguments not enough"; } my $config = _load_config(); my $repo = _get_repo_name(); my $branch = _get_branch_name(@ARGV); my $message = _get_commit_message($branch); my %notifiers = ( 'slack' => 'MyApp::Git::Hook::Notifier::Slack', ); while ( my ($name, $module) = each %notifiers ) { my $notifier = {}; eval "\$notifier = $module->new( \%{\$config->{$name}} )"; unless ( $notifier->send( $repo, $branch, $message ) ) { warn "[WARN] Faild to send message."; } } exit; sub _get_repo_name { my @dirs = split( /\//, dirname($Bin) ); my $repo = pop @dirs; $repo =~s/\.git$//; return $repo; } sub _get_branch_name { my @args = @_; my $branch = `git rev-parse --symbolic --abbrev-ref $args[0] 2> /dev/null`; chomp $branch; return $branch; } sub _get_commit_message { my $branch = shift; my $message = `git log -1 --pretty=format:"%h - %an : %s" $branch 2> /dev/null`; return 'EMPTY' unless $message; my $decoder = Encode::Guess->guess($message); if ( ref $decoder ) { return $decoder->decode($message); } else { return $message; } } sub _load_config { return decode_json( join '', <DATA> ); } 1; # magic number __DATA__ { "slack": { "endpoint": "https://hooks.slack.com/services/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", "channel": "#sdk" } }
endpointの箇所にslackで作成したwebhooksのURLをコピー
[admin]$ chmod 755 /home/admin/git/x-generation.git/hooks/post-update
文字化け対策¶
rubyバージョン¶
/home/admin/git/x-generation.git/hooks/post-update.rb
※参考サイト
http://qiita.com/tokumura11/items/a2b0a4af01e7b18a534d
[root]$ yum install rubygems [root]$ yum install ruby-devel [root]$ gem install json
rubyバージョンアップ
http://qiita.com/inouet/items/478f4228dbbcd442bfe8
[admin]$ ruby -v
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]
phpバージョン¶
/home/admin/git/x-generation.git/hooks/post-update.php
#!/usr/bin/php <?php // slackで発行したwebhookURLをセット $slack_webhook = "https://hooks.slack.com/services/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"; // slack channel $channel = "#sdk"; // slack username $username = "Git hooks"; // リポジトリ名 $repo = "x-generation"; // リビジョン取得 $rev = $argv[1]; // ブランチ取得 $cmd = "git rev-parse --symbolic --abbrev-ref $rev 2> /dev/null"; $res = exec($cmd, $ret); $branch = $ret[0]; // コミットメッセージ取得 $cmd = "git log -1 --pretty=format:\"%h - %an : %s\" $branch 2> /dev/null"; $res = exec($cmd, $ret); for($i = 1; $i < count($ret); $i++) { $commit .= $ret[$i]; } $text = "[ $repo ][ $branch ] $commit"; $post_array = array( 'channel' => $channel, 'username' => $username, 'text' => $text ); //print_r($post_array); // Start the CURL connection $process = curl_init($slack_webhook); curl_setopt($process, CURLOPT_POST, true); curl_setopt($process, CURLOPT_POSTFIELDS, array('payload' => json_encode($post_array))); curl_exec($process); curl_close($process); ?>