GAS에서 master에 병합된 풀릭 목록을 Slack에 게시

소개



GitHub의 GraphQL API v4와 Google Apps Script를 사용하여 '이번 주 master 브랜치에 병합 된 풀릭 목록'을 얻고 & Slack에 게시했습니다.

GitHub GraphQL 쿼리 만들기



공식 샘플 쿼리 을 베이스로, 공식 GitHub GraphQL API Explorer 로 조정해 갑니다.

풀릭의 필터링



다음 조건으로 필터링합니다.
  • 베이스 브랜치가 master => baseRefName: "master"
  • 풀릭이 병합됨 => states: MERGED
  • 드디어 취득 건수를 20 건으로 좁힌다 => last:20

  • ※ 참고 끌어 오기 요청을 좁히는 데 사용할 수있는 매개 변수

    필드 필터링



    풀릭의 모든 정보를 원하지는 않으므로 다음 필드로만 필터링합니다.
  • 풀릭 제목 => title
  • 풀릭 작성자의 이름 => author { login }
  • 풀릭 URL => permalink
  • 풀릭의 병합 날짜 => mergedAt

  • ※ 참고 풀 요청 필드 목록

    최종 쿼리



    이런 쿼리가 완성되었습니다.
    query { 
      repository(owner: "owner", name: "name") { 
        pullRequests(last: 20, states: MERGED, baseRefName: "master") {
          edges {
            node {
              title
              permalink
              mergedAt
              author {
                login
              }
            }
          }
        }
      }
    }
    

    GAS에서 GitHub API를 사용하여 풀릭 획득 및 Slack에 게시



    GitHub API에 POST하는 부분은 앞으로도 사용할 것 같아서 분리해 두었습니다.
    function fetchFromGitHub(query) {
      var TOKEN = "token";
      var ENDPOINT = "https://api.github.com/graphql";
    
      var payload = JSON.stringify({
        "query": query
      });
    
      var options = {
        "method": "POST",
        "contentType": 'application/json',
        "headers": {
          "Authorization": "Bearer " + TOKEN
        },
        "payload": payload
      };
      return JSON.parse(UrlFetchApp.fetch(ENDPOINT, options));
    }
    

    취득 후 병합 일을 보고 필터 & 성형하여 Slack에 투고하고 있습니다.
    function getMasterMergedBranchesInThisWeek() {
      var query = "{ \
        repository(owner: "owner", name: "name") { \
          pullRequests(last:20, states: MERGED, baseRefName: "master") { \
            edges { \
              node { \
                title \
                permalink \
                mergedAt \
                author { \
                  login \
                } \
              } \
            } \
          } \
        } \
      }";
      var response = postGitHubAPI(query);
      var pullRequests = response.data.repository.pullRequests.edges.map(function (edge) {
        return edge.node;
      });
    
      // マージ日でフィルタ
      // 日付操作にはmoment.jsを使っています
      var startDate = moment().startOf('week');
      var recentMergedPullRequests = pullRequests
        .filter(function (pr) {
          return moment(pr.mergedAt).isSameOrAfter(startDate);
        });
    
      // 整形
      var text = "今週マージされたプルリク一覧\n";
      text += recentMergedPullRequests.map(function(pr) {
        return "" + pr.title + "(" + pr.author.login + "):" + pr.permalink;
      }).join("\n");
    
      postSlackMessage("channel_id", text);
    }
    

    Slack에 게시하는 부분도 분리하고 있습니다.
    function postSlackMessage(channel, text) {
      var TOKEN = "token";
      var ENDPOINT = "https://slack.com/api/chat.postMessage";
    
      var payload = {
        "text": text,
        "channel": channel,
        "token": TOKEN
      };
      var options = {
        "method": "POST",
        "payload": payload
      };
      return UrlFetchApp.fetch(ENDPOINT, options);
    }
    

    안전하게 게시할 수 있었습니다.


    결론



    API v3와 달리 필요한 field 밖에 취하지 않기 때문에, 응답을 출력했을 때에 보기 쉽고 좋네요.
    GAS에서는 백 쿼트를 사용할 수 없기 때문에, query 쓰는 부분에서 백 슬래시를 많이 사용하지 않으면 안되는 것이 힘들다고 생각했습니다.

    참고로했습니다.



    GitHub GraphQL API v4를 Google App Script에서 실행하여 문제 목록을 가져 왔습니다.

    좋은 웹페이지 즐겨찾기