FE PR D-n 라벨 수정 자동화 #15
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: FE PR D-n 라벨 수정 자동화 | |
on: | |
schedule: | |
- cron: '10 15 * * *' # 매일 밤 12시 10분 실행 | |
workflow_dispatch: # 수동 실행 허용 | |
jobs: | |
update-labels: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Update PR Labels with github-script | |
uses: actions/github-script@v7 | |
with: | |
script: | | |
const owner = context.repo.owner; | |
const repo = context.repo.repo; | |
// 현재 시간(Locale) | |
const curr = new Date(); | |
// UTC 시간 계산 | |
const utc = curr.getTime() + curr.getTimezoneOffset() * 60 * 1000; | |
// UTC to KST (UTC + 9시간) | |
const KR_TIME_DIFF = 9 * 60 * 60 * 1000; | |
const kr_curr = new Date(utc + KR_TIME_DIFF); | |
const KSTDayOfWeek = kr_curr.getDay(); // 0: 일요일, 6: 토요일 | |
// 한국 시간 기준으로 주말인지 판단 | |
if (KSTDayOfWeek === 0 || KSTDayOfWeek === 6) { | |
console.log("주말은 쉬어야죠!"); | |
return; | |
} | |
// 열려 있는 모든 PR을 가져온다. | |
const pullRequests = await github.rest.pulls.list({ | |
owner, | |
repo, | |
state: 'open', | |
}); | |
// "FE" 라벨이 포함된 PR만 필터링 | |
const FEPullRequests = pullRequests.data.filter(pr => | |
pr.labels.some(label => label.name.includes('FE')) | |
); | |
if (FEPullRequests.length === 0) { | |
console.log("열려있는 FE PR이 없습니다."); | |
return; | |
} | |
for (const pr of FEPullRequests) { | |
const { number, labels } = pr; | |
// 'D-'로 시작하는 라벨이 있는지 확인한다. | |
const dLabel = labels.find(label => label.name.startsWith('D-')); | |
// 'D-'로 시작하는 라벨이 없다면 D-2' 라벨을 추가하고 끝낸다. | |
if (!dLabel) { | |
await github.rest.issues.addLabels({ | |
owner, | |
repo, | |
issue_number: number, | |
labels: ['D-2'], | |
}); | |
console.log(`Added 'D-2' label to PR #${number}`); | |
continue; | |
} | |
// 'D-0'이면 카운팅을 스킵한다. | |
if (dLabel.name === 'D-0') { | |
console.log(`PR #${number} already at 'D-0'. Skipping decrement.`); | |
continue; | |
} | |
// 'D-n'로 시작하는 라벨이 있다면 n 값을 가져온다. | |
const currentDay = parseInt(dLabel.name.split('-')[1], 10); | |
if (isNaN(currentDay) || currentDay < 1) { | |
console.log(`PR #${number} 유효하지 않은 라벨이거나 연산할 수 없는 라벨 '${dLabel.name}'.`); | |
continue; | |
} | |
// 현재 'D-n' 라벨을 제거한다. | |
await github.rest.issues.removeLabel({ | |
owner, | |
repo, | |
issue_number: number, | |
name: dLabel.name, | |
}); | |
// 'D-(n-1)' 라벨을 새로 추가한다. | |
const newDay = currentDay - 1; | |
const newLabel = `D-${newDay}`; | |
await github.rest.issues.addLabels({ | |
owner, | |
repo, | |
issue_number: number, | |
labels: [newLabel], | |
}); | |
console.log(`Updated PR #${number}: '${dLabel.name}' -> '${newLabel}'`); | |
} |