8. Gitlab-Chat

8. Gitlab-Chat

Synology Chat은 Webhook도 지원하여 시스템간 integration 에 많은 도움이 됩니다. gitlab에 팀원 누군가가 코드를 push 했을때 chat의 channel을 통해 통지 받을 수 있다면, 채널에 들어있는 팀원들이 이를 보고 즉시 code review를 향해 달려갈 수 있을 것입니다(어기여차!)

Spec은 다음과 같습니다.

  • Synology Chat Webhooks Spec – https://www.synology.com/ko-kr/knowledgebase/DSM/help/Chat/chat_integration
  • Gitlab Webhooks Spec – https://docs.gitlab.com/ee/user/project/integrations/webhooks.html

아~ gitlab에서 Chat으로 그냥 webhook을 쏘았다가는 아무것도 안나오게 생겼습니다. 그래서 우리는 gitlab에서 발사한 webhook을 받아서 chat의 webhook spec으로 바꿔주는 녀석이 필요합니다. ㅠㅠ

DSM Office 에서 Web Station을 설치 하신것을 기억 하실 것입니다. 거기에 PHP설정을 하였고 curl도 켰었습니다. 이제 PHP로 작성된 작은 프로그램을 여기에 올려서 gitlab이 여기에 webhook을 쏘면 gitlab의 스펙을 읽어서 적당히 바꿔 Chat에 다시 쏘아 줄것입니다. 프로그램은 간략화 된것으로, 보시고 얼마든지 수정 하시면 될것 입니다. 특히 gitlab.php는 spec 참고 하셔서 원하는 내용으로 텍스트를 꾸밀 수 있도록 수정하시면 될것입니다.

다음에 나타난 파일 두개를 Web Station을 설치했을때 지정한 document root에 올려줍니다. base_url 은 각자 맞게 수정해 주어야 겠습니다.

func.php

<?php
function send_request($token,$text,$file_url = '') {
 $base_url = 'https://work.example.io:5001/webapi/entry.cgi';
 $params = array( 
 'api' => 'SYNO.Chat.External',
 'method' => 'incoming',
 'version' => '2'
 );

 $params['token'] = $token;
 $url = $base_url.'?'.http_build_query($params);
 $ch = curl_init($url);
 $json_param['text'] = $text;
 if($file_url != '') $json_param['file_url'] = $file_url;

 $payload = json_encode($json_param);
 curl_setopt($ch,CURLOPT_POSTFIELDS,'payload='.$payload);
 curl_setopt($ch,CURLOPT_HTTPHEADER,array('Content-Type:application/json'));
 curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

 $result = curl_exec($ch);
 if(curl_errno($ch)){
 trigger_error(curl_error($ch));
 curl_close($ch);
 } else {
 curl_close($ch);
 return $result;
 }
}
?>

만약 base_url 설정에서 https 로 연결이 안된다면 http://work.example.io:5000/ 과 같이 http 로 변경 해서 시도해 보시기 바랍니다.

gitlab.php

<?php
include_once 'func.php';

$text = '';
$token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
$data = json_decode(file_get_contents('php://input'), true);
if( $data != '' && $token != '') {
 $text = $text.'GIT Event : ';
 $text = $text.'Project = '.'['.$data['project']['name'].'], ';
 $text = $text.'Event = '.'['.$data['object_kind'].'], ';
 switch($data['object_kind']) {
 case 'push' :
 $text = $text.'User = '.'['.$data['user_name'].'], ';
 $text = $text.'Ref = '.'['.$data['ref'].'] ';
 break;
 case 'tag_push' :
 $text = $text.'User = '.'['.$data['user_name'].'], ';
 $text = $text.'Ref = '.'['.$data['ref'].'] ';
 break;
 case 'issue' :
 $text = $text.'User = '.'['.$data['user']['name'].'], ';
 $text = $text.'Issue = '.'['.$data['object_attributes']['title'].'] ';
 break;
 case 'note' :
 $text = $text.'User = '.'['.$data['user']['name'].'], ';
 $text = $text.'Note = '.'['.$data['object_attributes']['note'].'] ';
 break;
 }

 $result = send_request($token, $text, $file_url);
 echo $result;
}else{
 echo '<pre>missing param</pre>';
}
?>

Chat에서

Synology Chat을 실행하시고(Desktop App 혹은 Web), 우측 상단 메뉴에서 통합을 선택 합니다.

통합

들어오는 Webhooks를 선택 하고 생성을 누릅니다.

채널을 생성하거나 이미 있는 채널을 선택합니다. 이 채널에 내용이 게시 될 것입니다.

이제 여기서 Webhook URL 중에서 뒷부분에 보시면 token=%22어쩌구저쩌구%22 하는 부분이 보이며 이 어쩌구저쩌구를 복사합니다. 확인을 누르시고 생성이 잘 되었는지 확인 합니다. (어찌하다 token이 노출되어 이상한 메시지가 들어온다면 리프레시를 눌러서 token을 변경하면 됩니다)

Gitlab 에서

Gitlab에서 webhook을 쏘아줄 프로젝트의 Settings-Integrations 메뉴를 선택 합니다. URL에 우리가 작성한 gitlab.php를 넣어 주시고, Secret Token에 Chat 에서 생성했던 token값을 넣어 주시면 됩니다. 이때 %22는 넣지 않도록 주의 하십시오(%22가 붙어있어도 동작하게 gitlab.php를 수정하셔도 됩니다) .

Enable SSL verification은 Let’s Encrypt에서 인증서를 설치 했다면 체크 하셔도 됩니다. Synology Default 인증서로 브라우저의 경고를 감내하고 계시는 분들은 체크를 하지 않아야 합니다. Notificaiton을 받고 싶은 종류의 Trigger를 선택 하시고 Add webhook 을 눌러줍니다. 입력이 완료 되면 Test를 눌러서 Trigger에서 선택했던 Push Event를 한번 발송해 봅니다.

Chat의 Channel에 게시가 되면 성공입니다. 이제 부터는 gitlab 에서 이벤트가 발생 할 때마다 핸드폰의 Chat으로 통지 받을 수 있어 아주 편리 합니다. 다만 열일 하는 팀원이 새벽 두시에 푸시 하는 이벤트를 받을 수도 있습니다 ^^;

예쁜 언니가 push를 알려 줍니다.

Chat에 대한 더 많은 연동은 Chat Integration을 참고 하세요.

1 comment

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다