php에서 JIRA의 Webhook을 받고 업데이트 알림을 Chatwork에 던지기

5176 단어 ChatworkPHPjira

개요



JIRA의 갱신 통지가 Chatwork에 도착하면 인용이라도 할 수 있고 편리하다고 하는 의견이 있었으므로,
원래 JIRA의 기능으로서 존재하는 Webhook을 이용해 JIRA의 갱신 통지를 Chatwork에 던지는 구조를 만들었다.

필요한 것


  • apache(또는 적당한 웹 서버)를 넣은 적당한 Linux 머신.
  • 인터넷에서 80번으로 액세스할 수 있는 것.
  • IP 주소로 적절하게 액세스 제어를 할 수 있는 것.
  • http에서 외부 API를 두드리는 것.

  • JIRA의 관리자 계정.
  • 이번은 클라우드판의 JIRA를 이용.

  • Chatwork 계정
  • API로 POST할 수 있는 채팅이라면 뭐든지 OK.
  • 오히려 이번에 Chatwork에서 던지는 부분은 할애한다.


  • 처리 흐름


  • JIRA 티켓 업데이트
  • JIRA가 Webhook에서 설정 한 URL에 POST 액세스
  • Key 정보를 파라미터로 해 JIRA의 API를 두드려 티켓 상세를 취득
  • 취득 내용을 채팅 워크에 던진다

  • 사실은 2→4로 가고 싶지만, 일부 정보가 hook로 받을 수 있는 파라미터에 포함되어 있지 않다(같은 생각이 든다) 때문에,
    Key(티켓의 ID)로 티켓의 상세 정보를 다시 취득한다.

    그렇기 때문에, 하는 것은 이하가 된다.
  • JIRA 관리자 계정으로 Webhook을 설정합니다.
  • IP 주소 제한을 제거합니다.
  • Webhook 대상의 php를 구현한다.

  • JIRA 관리자 계정으로 Webhook 설정하기



    1. 관리자 계정으로 로그인하여 다음 페이지로 이동합니다.



    htps : // 홉 x. 아 t ぁしあん. 네 t / p ぅ 긴 s / 세 rv ぇ t / ぇ b 호오 ks #
    ※XXXX 부분은 (아마) 라이센스마다 바뀐다.

    2. 화면 오른쪽 상단에서 Webhook 만들기를 클릭합니다.



    띠가 핑크색으로 되어 있는 것은 신경쓰지 말고 싶다.


    3. 적절한 항목을 채우기



    다양한 설정 항목이 있지만 우선 다음 내용으로 설정합니다.
  • webhook 대상 서버의 jiraWebHook.php에 티켓의 키 (Project Name-XXX 같은 사람)를 부여하고 hook한다
  • 대상 프로젝트를 JQL (JIRA 용 SQL 녀석)으로 짜내기
  • 과제가 작성되었을 때와 갱신되었을 때만 hook한다



  • webhook의 설정 자체는 이것으로 끝.

    IP 주소 제한 제거



    htps : // 이런 f ㅅ엔세. 아 t ぁしあん. 이 m / c ぉ d / 다타바세 앙 드 이 p ン ぉ r 마치 온 - 744721662. HTML
    클라우드 판의 경우는 상기의 페이지에 써 있는 대로, 이하의 IP 어드레스로부터의 80번 액세스를 허가한다.


    IP 주소


    131.103.26.0/23

    131.103.29.0/24

    165.254.226.0/23

    131.103.28.0/24

    104.192.140.0/23

    104.192.136.0/23


    자신의 서버에서 가동하고 있는 경우는 그 서버의 IP를 허가하면 좋다고 생각된다.
    클라우드 버전의 경우 Cloudfront에서 액세스하는 것 같습니다.
    회사의 정책에 따라 원래 Webhook을 사용할 수 없을지도.
    그 경우는 정기적으로 필터로 티켓을 크롤링할 정도밖에 생각하지 않는다.

    Webhook 대상 php 구현



    이번에는 AWS EC2에서 데비안 wheezy 인스턴스를 시작하여 apache와 php를 설치하고,
    Default의 DocmentRoot/var/www에 jiraWebHook.php라는 파일을 만들었다.
    JIRA 계정에 대해서는 적당히 권한을 붙인 계정을 준비해 둔다.
    PHP는 드물게 쓰지 않기 때문에 이상한 일을 해도 놓치면 좋겠다.
    jiraWebHook.php
    <?php
    
    $base_url='https://XXXX.atlassian.net';
    $end_point=$base_url . '/rest/api/2/issue/' . $_GET["key"];
    
    // Webhook用に作成したJIRAアカウント情報を入れる
    $user_name="";
    $password="";
    
    // hookで受け取ったKeyに対応するチケットの詳細を
    // JIRAのAPIを使って取得する。
    $curl = curl_init();
    
    // IDとパスを生で設定してるのはご愛嬌
    $option = [
        CURLOPT_URL => $end_point,
        CURLOPT_CUSTOMREQUEST => 'GET',
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_USERPWD => $user_name . ":" . $password,
    ];
    
    curl_setopt_array($curl,$option);
    
    $response = curl_exec($curl);
    $result = json_decode($response, true);
    
    curl_close($curl);
    
    // チケットのステータスに応じてChatworkの絵文字を付ける
    switch ($result['fields']['status']['id']) {
        // 解決済み
        case 5:
            $mark = '(F)';
            break;
        // クローズ
        case 6:
            $mark = '(coffee)';
            break;
        // オープン
        default:
            $mark = '(*)';
            break;
    }
    
    // プロジェクトIDによってチャットワークの通知先を決定
    switch($result['fields']['project']['id']) {
        case 10100:
            $room_id = "room_id1";
            break;
        case 10400:
            $room_id = "room_id2";
            break;
        default:
            $room_id = "";
            break;
    }
    
    // 本文を適当に結合。[info]とかはchatwork用のタグ。
    $mes_body = "[info][title](" . $mark . $result['fields']['status']['name'] . ")" . $result['key'] . "\:\ " . $result['fields']['summary'] . "(Reporter\:\ " . $result['fields']['reporter']['displayName'] . ")[/title]URL\:\ " . $base_url . "/browse/" . $result['key'] . "[/info]";
    
    // 何故か()があると上手くChatworkへ通知が飛ばなかったためエスケープ。
    // きっともっといいやり方がある。
    $mes_body=str_replace("(", "\(", $mes_body);
    $mes_body=str_replace("(", "\(", $mes_body);
    $mes_body=str_replace(")", "\)", $mes_body);
    $mes_body=str_replace(")", "\)", $mes_body);
    
    // チャットワークへ投げる処理。
    // チャットワークに限らず、適当なチャットサービスのAPIにメッセージボディとか指定して投げればOK。
    // とりあえずダミーの関数を書いておいた。
    send_chat_service($room_id, $mes_body);
    

    좋은 웹페이지 즐겨찾기