Skip to content

FE PR D-n 라벨 수정 자동화 #15

FE PR D-n 라벨 수정 자동화

FE PR D-n 라벨 수정 자동화 #15

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}'`);
}