GAS에서 풀릭별로 변경된 파일 목록을 스프레드 시트에 저장

12686 단어 GraphQLgas

하고 싶은 일



버그가 혼입하고 있던 파일(버그 수정으로 수정된 파일)을 취득해, 버그가 들어가기 쉬운 파일을 파악하고 싶다

구체적으로는 GitHub에서 버그 수정에 사용한 브랜치의 풀릭을 참조하여 변경된 파일 목록을 스프레드 시드에 저장하고 싶습니다.

그래서 GAS (Google Apps Script)에서 GitHub GraphQL API를 두드려 위의 내용을 구현해 보았습니다.

스프레드시트



브랜치 이름 취득용 스프레드시트
버그 수정에 사용한 브랜치명은 미리 알고 있어 스프레드시트로 아래와 같이 관리되고 있는 것으로 합니다

브랜치명에 「bug」라고 넣도록 하고 있기 때문에, 일일이 스프레드 시트로 파악할 필요는 없었을지도

출력용 스프레드시트
출력용으로는, 「브랜치명」 「변경된 파일 패스」 「변경 일시(Close 된 일시)」를 보존할 수 있도록 해 둡니다


이전 준비



GitHub API에 액세스하기위한 토큰을 GAS 매개 변수에 저장합니다.
  • GitHub Personal Access Token 얻기
  • GAS 프로젝트 만들기

  • 적절하게 이름을 지정하고 획득한 토큰을 저장합니다.
  • 파일>프로젝트의 프로퍼티>스크립트의 프로퍼티



  • GAS



    프로그램의 흐름은 다음과 같은 느낌
  • 버그 수정을 위한 브랜치명을 얻는다
  • 출력 스프레드 시트와 비교하여 얻지 못한 분기 이름을 파악합니다
  • GitHub GraphQL API를 두드려 변경 파일 목록을 얻습니다
  • 스프레드 시트로 출력
  • function get_fixed_file_from_GitHub(){
      // BugチケットID を取得
      const bugListSsUrl = "https://docs.google.com/spreadsheets/d/**********";
      const sh = SpreadsheetApp.openByUrl(bugListSsUrl).getSheetByName('シート1');
      const lastRow = sh.getLastRow()
      const bugBranches = sh.getRange(2, 1, lastRow - 1).getValues();
    
      // 出力先スプレッドシート
      const outputSsUrl = "https://docs.google.com/spreadsheets/d/++++++++++";
      const sh2 = SpreadsheetApp.openByUrl(outputSsUrl).getSheetByName('シート1');
      let lastRow2 = sh2.getLastRow()
      const storedBranches = sh2.getRange(2, 1, lastRow2).getValues();
    
      for ( const bugBranche of bugBranches ){
        // まだ登録されていないバグなら以下を実行
        if( !storedBranches.some( id => id[0] === bugBranche[0] ) ){
    
         // プルリクから修正したファイルを取得
          let fixedFiles = get_fixed_files( bugBranche[0] );
    
          // スプレッドシートに保存
          for (const fixedFile of fixedFiles.files ) {
            const outputArray = [bugBranche, fixedFile, fixedFiles.closedAt]
            lastRow2 = lastRow2 + 1;
            sh2.getRange(lastRow2, 1, 1, outputArray.length).setValues([outputArray]);
          }
        }
      }
    }
    
    // GitHubのプルリクから、修正されたファイル一覧を取得する
    function get_fixed_files(bugBranch) {
      const accessToken = PropertiesService.getScriptProperties().getProperty("GITHUB_TOKEN");
      const endpoint = "https://api.github.com/graphql";
    
      const query = `
      {
        organization(login: "**********"){
          repository(name: "+++++++++"){
            pullRequests(states: [MERGED], headRefName: "${bugBranch}", last: 20){
              nodes{
                closedAt
                files(first: 20){
                  nodes{
                    path
                  }
                }
              }
            }
          }
        }
      }
      `;
    
      const option = {
        method: "post",
        contentType: "application/json",
        headers: {
        Authorization: `bearer ${accessToken}`,
        },
        payload: JSON.stringify({ query: query }),
      };
    
      const response = UrlFetchApp.fetch(endpoint, option);
      const json = JSON.parse(response.getContentText());
      const nodes = json.data.organization.repository.pullRequests.nodes[0].files.nodes;
      const closedAt = json.data.organization.repository.pullRequests.nodes[0].closedAt;
      const files = [];
    
      for (const node of nodes ) {
        files.push(node.path);
      }
    
      return {files: files, closedAt: closedAt};
    }
    

    사이고에게



    위의 GAS를 정기적으로 실행하면 수정된 파일 목록이 매일 저장됩니다.

    그리고는, 이 일람으로부터 파일마다나 디렉토리마다 등 좋은 느낌에 자동 집계시켜 보고 싶다고 생각하고 있습니다.

    좋은 웹페이지 즐겨찾기