Skip to content

Auto Merge PR on Sunday #37

Auto Merge PR on Sunday

Auto Merge PR on Sunday #37

Workflow file for this run

name: "Auto Merge PR on Sunday"
on:
schedule:
- cron: "59 14 * * 0"
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
merge:
runs-on: "ubuntu-latest"
steps:
- uses: "actions/github-script@v6"
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
const query = `query($owner:String!, $name:String!) {
repository(owner: $owner, name: $name) {
pullRequests(last: 10, states: OPEN) {
edges {
node {
number
mergeable
labels(first: 10) {
nodes {
name
}
}
}
}
}
}
}`
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const retry = async (fn, retries = 2, delay = 5000) => {
for (let i = 0; i < retries; i++) {
try {
return await fn();
} catch (error) {
if (i === retries - 1) throw error;
if (error.status === 405) {
await sleep(delay);
continue;
}
throw error;
}
}
};
const {repository:{pullRequests:{edges: list}}} = await github.graphql(query, {
owner: context.repo.owner,
name: context.repo.repo,
})
for (let {node} of list) {
const createComment = (body) => github.rest.issues.createComment({
...context.repo,
issue_number: node.number,
body
})
try {
const labels = node.labels.nodes.map(label => label.name)
if (!labels.includes("ready for merge")) {
await createComment("'ready for merge' 라벨이 필요합니다.")
continue
}
if (node.mergeable === "CONFLICTING") {
await createComment("충돌로 인해 자동 병합이 불가능합니다.")
continue
}
await sleep(5000); // 병합 전 5초 대기
await retry(() => github.rest.pulls.merge({
...context.repo,
pull_number: node.number,
merge_method: "merge"
}));
await createComment("자동 병합이 완료되었습니다.")
} catch (e) {
console.error("Merge failed:", e)
}
}