{"id":16683636,"url":"https://github.com/yamachu/merge-queue-action","last_synced_at":"2025-03-28T15:15:14.103Z","repository":{"id":237479897,"uuid":"794510496","full_name":"yamachu/merge-queue-action","owner":"yamachu","description":null,"archived":false,"fork":false,"pushed_at":"2024-05-28T16:43:58.000Z","size":46,"stargazers_count":3,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-16T01:32:15.230Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yamachu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-05-01T10:45:45.000Z","updated_at":"2024-05-30T16:18:20.000Z","dependencies_parsed_at":"2024-05-28T19:13:55.373Z","dependency_job_id":"901aaf4f-87c5-42e7-b281-0f72148786f4","html_url":"https://github.com/yamachu/merge-queue-action","commit_stats":null,"previous_names":["yamachu/merge-queue-action"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamachu%2Fmerge-queue-action","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamachu%2Fmerge-queue-action/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamachu%2Fmerge-queue-action/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamachu%2Fmerge-queue-action/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yamachu","download_url":"https://codeload.github.com/yamachu/merge-queue-action/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246049632,"owners_count":20715511,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T14:25:36.855Z","updated_at":"2025-03-28T15:15:14.083Z","avatar_url":"https://github.com/yamachu.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Merge Queue Action\n\n現在 GitHub Enterprise Cloud のみで提供されている Merge Queue のような機能を GitHub Actions で提供する Custom Actions です。\n\n## 提供する機能\n\n[popuko](https://github.com/voyagegroup/popuko) が提供している機能を参考に、以下の機能を提供します。\n\n- Merge の Queuing 機能\n  - ただし、GitHub Actions の Concurrency 機能を利用しているため、順序の保証はできません。\n\n## 提供する Actions\n\n- yamachu/merge-queue-action/precheck (optional)\n  - Merge Queue に追加する前の事前チェックを行う Action\n    - この Action が成功した場合のみ、Merge Queue に追加されます\n    - Merge 可能な PR かどうかのチェックを行うなどに利用できます\n    - CODEONWERS に記載されたユーザからの GitHub Actions のトリガーであるかのチェックを行うなどに利用できます\n- yamachu/merge-queue-action/pretesting\n  - テスト実行前に、merge 先と merge したブランチを作成した tmp ブランチを作成し、テストを実行できるようにします\n- yamachu/merge-queue-action/posttesting\n  - テスト実行後に、tmp ブランチを削除し、実際に merge します\n  - 当該 actions 経由じゃない merge を検知し、HEAD が進んでいる場合は、merge せずにエラーを返します\n\n\u003e [!IMPORTANT]\n\u003e yamachu/merge-queue-action/posttesting 経由での merge では、main などへの push イベントが発火しません。\n\u003e そのため、CD などを行う場合は、GitHub Apps などを利用して GITHUB_TOKEN を生成し、そのトークンを利用して merge を行う必要があります。\n\n## 使い方\n\n### yamachu/merge-queue-action/precheck\n\nPull Requests のコメントをトリガにして、Merge Queue に追加する前の事前チェックを行う Action です。\n\n#### Permissions\n\n- contents: read\n- issues: write\n- pull-requests: write\n\nPull Request にコメントを追加するため、`issues` と `pull-requests` の write 権限が必要です。\n\n#### Inputs\n\n- required-codeowners:\n  - CODEOWNERS に記載されているユーザのみがトリガーできるようにします\n  - default: \"true\"\n\n#### Outputs\n\n- base-branch:\n  - マージ先のブランチ名\n\n#### Example\n\n```yaml\nname: precheck\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  precheck:\n    runs-on: ubuntu-latest\n    if: (contains(github.event.comment.body, '/mq') \u0026\u0026 github.event.issue.pull_request != null)\n    permissions:\n      contents: write\n      issues: write\n      pull-requests: write\n    steps:\n      - uses: yamachu/merge-queue-action/precheck@v1\n        with:\n          required-codeowners: \"true\"\n        id: precheck\n      - name: Set base branch\n        run: echo \"base-branch=${{ steps.precheck.outputs.base-branch }}\" \u003e\u003e $GITHUB_ENV\n```\n\n### yamachu/merge-queue-action/pretesting\n\nPull Requests のコメントをトリガにして、テスト実行前に、merge 先と merge したブランチを作成した tmp ブランチを作成し、テストを実行できるようにします。\n\n#### Permissions\n\n- contents: write\n- issues: write\n- pull-requests: write\n\nPull Request にコメントを追加するため、`issues` と `pull-requests` の write 権限が必要です。\nまた、tmp ブランチを作成するため、`contents` の write 権限が必要です。\n\n#### Inputs\n\n- github-token:\n  - GitHub Token\n- pr-number:\n  - Pull Request の番号\n- tmp-ci-branch: (optional)\n  - テストを実行するための tmp ブランチ名\n  - default: \"auto.tmp\"\n- merge-user-email: (optional)\n  - commit を行うユーザのメールアドレス\n- merge-user-name: (optional)\n  - commit を行うユーザの名前\n\n#### Outputs\n\n- base-branch:\n  - マージ先のブランチ名\n- base-branch-sha:\n  - マージ先のブランチの SHA\n  - この Actions 経由ではなく、テスト実行中に変更された場合に、エラーを返すために利用します\n\n#### Example\n\n```yaml\nname: pretesting\non:\n  workflow_dispatch:\n    inputs:\n      issue_number:\n        description: 'Associated Pull Requests number'\n        required: true\n      tmp-ci-branch:\n        description: 'Temporary CI branch name'\n        required: true\n\njobs:\n  pretesting:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      issues: write\n      pull-requests: write\n    steps:\n      - uses: yamachu/merge-queue-action/pretesting@v1\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          pr-number: ${{ github.event.inputs.issue_number }}\n          tmp-ci-branch: ${{ github.event.inputs.tmp-ci-branch }}\n        id: pretesting\n      - name: Set base branch\n        run: echo \"base-branch=${{ steps.pretesting.outputs.base-branch }}\" \u003e\u003e $GITHUB_ENV\n      - name: Set base branch SHA\n        run: echo \"base-branch-sha=${{ steps.pretesting.outputs.base-branch-sha }}\" \u003e\u003e $GITHUB_ENV\n```\n\n### yamachu/merge-queue-action/posttesting\n\nテスト実行後に、tmp ブランチを削除し、実際に merge します。\n\n#### Permissions\n\n- contents: write\n- pull-requests: write\n\n#### Inputs\n\n- github-token:\n- pr-number:\n- base-branch-sha:\n- base-branch:\n- merge-user-email: (optional)\n- merge-user-name: (optional)\n- merge-method: (optional)\n  - merge 手法 (merge, squash, rebase)\n  - default: \"merge\"\n\n## Example\n\n### CommentHandler\n\nPull Requests に `/mq` というコメントを追加することで、Merge Queue に追加することができるサンプル。\n\nauto.${PR_NUMBER} というブランチを作成し、テストを実行するための workflow をトリガーします。\n後述する `testing-queue.yml` がトリガーされます。\n\n`merge-queue-trigger-handler.yml`\n\n```yaml\nname: Handle Merge Queue Trigger\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  CommentHandle:\n    if: (contains(github.event.comment.body, '/mq') \u0026\u0026 github.event.issue.pull_request != null)\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      issues: write\n      pull-requests: write\n      actions: write\n    steps:\n      - uses: yamachu/merge-queue-action/precheck@main\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - run: |\n          git push origin HEAD:auto.${{ github.event.issue.number }}\n        env:\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      - name: Dispatch workflow via GitHub CLI\n        run: \u003e\n          gh workflow run -R ${{ github.event.repository.full_name }}\n          -f issue_number=${{ github.event.issue.number }}\n          -f tmp-ci-branch=auto.${{ github.event.issue.number }}\n          --ref auto.${{ github.event.issue.number }} testing-queue.yml\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n```\n\n### TestingQueue\n\n`CommentHandler` がトリガーされた際に、テストを実行するための workflow。\n\nテストには Reusable Workflow として、`test.yml` を利用します。\nこの `test.yml` は\n\n```yml\non:\n  workflow_call:\n    inputs:\n      checkout-ref:\n        description: 'The ref to checkout'\n        required: false\n        type: string\n```\n\nとして、`checkout-ref` という引数を受け取ります。\n\nまた、TestingQueue として利用する workflow は、concurrency を利用して、同時に実行される workflow を制限する必要があります。\n\n`testing-queue.yml`\n\n```yaml\nname: Testing Queue Runner\non:\n  workflow_dispatch:\n    inputs:\n      issue_number:\n        description: 'Associated Pull Requests number'\n        required: true\n      tmp-ci-branch:\n        description: 'Temporary CI branch name'\n        required: true\nconcurrency:\n  group: merge-queue\n  cancel-in-progress: false\n\njobs:\n  PreTesting:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      issues: write\n      pull-requests: write\n    outputs:\n      base-branch: ${{ steps.pretesting.outputs.base-branch }}\n      base-branch-sha: ${{ steps.pretesting.outputs.base-branch-sha }}\n    steps:\n      - uses: yamachu/merge-queue-action/pretesting@main\n        id: pretesting\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          pr-number: ${{ github.event.inputs.issue_number }}\n          tmp-ci-branch: ${{ github.event.inputs.tmp-ci-branch }}\n\n  Test:\n    uses: ./.github/workflows/test.yml\n    with:\n      checkout-ref: ${{ github.event.inputs.tmp-ci-branch }}\n    needs: [PreTesting]\n\n  PostTesting:\n    runs-on: ubuntu-latest\n    needs: [PreTesting, Test]\n    permissions:\n      contents: write\n      pull-requests: write\n    steps:\n      - uses: yamachu/merge-queue-action/posttesting@main\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          base-branch: ${{ needs.PreTesting.outputs.base-branch }}\n          base-branch-sha: ${{ needs.PreTesting.outputs.base-branch-sha }}\n          pr-number: ${{ github.event.inputs.issue_number }}\n      - run:\n          git push origin --delete ${{ github.event.inputs.tmp-ci-branch }}\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyamachu%2Fmerge-queue-action","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyamachu%2Fmerge-queue-action","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyamachu%2Fmerge-queue-action/lists"}