GAS에서 풀릭별로 변경된 파일 목록을 스프레드 시트에 저장
하고 싶은 일
버그가 혼입하고 있던 파일(버그 수정으로 수정된 파일)을 취득해, 버그가 들어가기 쉬운 파일을 파악하고 싶다
구체적으로는 GitHub에서 버그 수정에 사용한 브랜치의 풀릭을 참조하여 변경된 파일 목록을 스프레드 시드에 저장하고 싶습니다.
그래서 GAS (Google Apps Script)에서 GitHub GraphQL API를 두드려 위의 내용을 구현해 보았습니다.
스프레드시트
브랜치 이름 취득용 스프레드시트
버그 수정에 사용한 브랜치명은 미리 알고 있어 스프레드시트로 아래와 같이 관리되고 있는 것으로 합니다
브랜치명에 「bug」라고 넣도록 하고 있기 때문에, 일일이 스프레드 시트로 파악할 필요는 없었을지도
출력용 스프레드시트
출력용으로는, 「브랜치명」 「변경된 파일 패스」 「변경 일시(Close 된 일시)」를 보존할 수 있도록 해 둡니다
이전 준비
GitHub API에 액세스하기위한 토큰을 GAS 매개 변수에 저장합니다.
브랜치 이름 취득용 스프레드시트
버그 수정에 사용한 브랜치명은 미리 알고 있어 스프레드시트로 아래와 같이 관리되고 있는 것으로 합니다
브랜치명에 「bug」라고 넣도록 하고 있기 때문에, 일일이 스프레드 시트로 파악할 필요는 없었을지도
출력용 스프레드시트
출력용으로는, 「브랜치명」 「변경된 파일 패스」 「변경 일시(Close 된 일시)」를 보존할 수 있도록 해 둡니다
이전 준비
GitHub API에 액세스하기위한 토큰을 GAS 매개 변수에 저장합니다.
적절하게 이름을 지정하고 획득한 토큰을 저장합니다.
GAS
프로그램의 흐름은 다음과 같은 느낌
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를 정기적으로 실행하면 수정된 파일 목록이 매일 저장됩니다.
그리고는, 이 일람으로부터 파일마다나 디렉토리마다 등 좋은 느낌에 자동 집계시켜 보고 싶다고 생각하고 있습니다.
Reference
이 문제에 관하여(GAS에서 풀릭별로 변경된 파일 목록을 스프레드 시트에 저장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hi-oowada/items/5d2f3e476b8a625a6692
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(GAS에서 풀릭별로 변경된 파일 목록을 스프레드 시트에 저장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hi-oowada/items/5d2f3e476b8a625a6692텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)