Auto Merge PR on Sunday #37
This file contains hidden or 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: "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) | |
| } | |
| } |