name: Slash Commands on: issue_comment: types: [created] permissions: contents: read pull-requests: write statuses: write jobs: handle-merge: if: >- github.event.issue.pull_request != null && startsWith(github.event.comment.body, '/merge') runs-on: ubuntu-latest steps: - name: Check write permission id: perm uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({ owner: context.repo.owner, repo: context.repo.repo, username: context.payload.comment.user.login, }); const hasWrite = ['admin', 'write'].includes(perm.permission); if (!hasWrite) { core.setFailed(`User ${context.payload.comment.user.login} lacks write permission (has: ${perm.permission}).`); } core.setOutput('has_write', String(hasWrite)); - name: Add ready label and react if: steps.perm.outputs.has_write == 'true' uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const owner = context.repo.owner; const repo = context.repo.repo; const prNumber = context.payload.issue.number; // Remove ready first to allow re-trigger (labeled event fires on add, not if already present) try { await github.rest.issues.removeLabel({ owner, repo, issue_number: prNumber, name: 'ready' }); } catch {} await github.rest.issues.addLabels({ owner, repo, issue_number: prNumber, labels: ['ready'] }); await github.rest.reactions.createForIssueComment({ owner, repo, comment_id: context.payload.comment.id, content: 'rocket', }); parse-command: if: >- github.event.issue.pull_request != null && startsWith(github.event.comment.body, '/test') runs-on: ubuntu-latest outputs: test_type: ${{ steps.parse.outputs.test_type }} test_scope: ${{ steps.parse.outputs.test_scope }} full_suite: ${{ steps.parse.outputs.full_suite }} pr_sha: ${{ steps.pr.outputs.sha }} pr_branch: ${{ steps.pr.outputs.branch }} has_write: ${{ steps.perm.outputs.has_write }} steps: - name: Check write permission id: perm uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({ owner: context.repo.owner, repo: context.repo.repo, username: context.payload.comment.user.login, }); const hasWrite = ['admin', 'write'].includes(perm.permission); core.setOutput('has_write', String(hasWrite)); if (!hasWrite) { core.info(`User ${context.payload.comment.user.login} lacks write permission — ignoring.`); } - name: Parse /test command id: parse if: steps.perm.outputs.has_write == 'true' shell: bash env: COMMENT: ${{ github.event.comment.body }} run: | set -euo pipefail TEST_NAME=$(echo "$COMMENT" | grep -oP '(?<=/test\s)\S+' | head -1 || true) VALID="encoder vae transformer kernel unit ssim training lora-inference lora-training distillation self-forcing vsa vmoba performance api full fastcheck pre-commit" if [ -z "$TEST_NAME" ] || ! echo "$VALID" | grep -qw "$TEST_NAME"; then echo "Unknown test: '$TEST_NAME'. Valid: $VALID" exit 1 fi declare -A MAP=( [encoder]=encoder [vae]=vae [transformer]=transformer [kernel]=kernel_tests [unit]=unit_test [ssim]=ssim [training]=training [lora-inference]=inference_lora [lora-training]=training_lora [distillation]=distillation_dmd [self-forcing]=self_forcing [vsa]=training_vsa [vmoba]=inference_vmoba [performance]=performance [api]=api_server ) if [ "$TEST_NAME" = "full" ]; then { echo "test_type=all" echo "test_scope=full" echo "full_suite=true" } >> "$GITHUB_OUTPUT" elif [ "$TEST_NAME" = "fastcheck" ]; then { echo "test_type=fastcheck" echo "test_scope=fastcheck" echo "full_suite=false" } >> "$GITHUB_OUTPUT" elif [ "$TEST_NAME" = "pre-commit" ]; then { echo "test_type=" echo "test_scope=precommit" echo "full_suite=false" } >> "$GITHUB_OUTPUT" else { echo "test_type=${MAP[$TEST_NAME]}" echo "test_scope=direct" echo "full_suite=false" } >> "$GITHUB_OUTPUT" fi - name: Get PR details id: pr if: steps.perm.outputs.has_write == 'true' uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | const { data: pr } = await github.rest.pulls.get({ owner: context.repo.owner, repo: context.repo.repo, pull_number: context.payload.issue.number, }); core.setOutput('sha', pr.head.sha); core.setOutput('branch', pr.head.ref); pre-commit: needs: parse-command if: >- needs.parse-command.outputs.has_write == 'true' && needs.parse-command.outputs.test_scope == 'precommit' uses: ./.github/workflows/ci-precommit.yml post-precommit-status: needs: [parse-command, pre-commit] if: always() && needs.parse-command.outputs.test_scope == 'precommit' runs-on: ubuntu-latest steps: - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: PR_SHA: ${{ needs.parse-command.outputs.pr_sha }} RESULT: ${{ needs.pre-commit.result }} with: script: | const state = process.env.RESULT === 'success' ? 'success' : 'failure'; await github.rest.repos.createCommitStatus({ owner: context.repo.owner, repo: context.repo.repo, sha: process.env.PR_SHA, state, context: 'pre-commit', description: `Triggered via /test pre-commit (${state})`, }); trigger-buildkite: needs: parse-command if: >- needs.parse-command.outputs.has_write == 'true' && needs.parse-command.outputs.test_type != '' runs-on: ubuntu-latest steps: - name: React to comment uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: script: | await github.rest.reactions.createForIssueComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: context.payload.comment.id, content: 'rocket', }); - name: Trigger Buildkite env: BUILDKITE_API_TOKEN: ${{ secrets.BUILDKITE_API_TOKEN }} PR_SHA: ${{ needs.parse-command.outputs.pr_sha }} PR_BRANCH: ${{ needs.parse-command.outputs.pr_branch }} PR_NUMBER: ${{ github.event.issue.number }} TEST_SCOPE: ${{ needs.parse-command.outputs.test_scope }} FULL_SUITE: ${{ needs.parse-command.outputs.full_suite }} TEST_TYPE: ${{ needs.parse-command.outputs.test_type }} BK_ORG: ${{ vars.BUILDKITE_ORG_SLUG }} BK_PIPELINE: ${{ vars.BUILDKITE_PIPELINE_SLUG }} run: | curl -sS --fail-with-body -X POST \ "https://api.buildkite.com/v2/organizations/${BK_ORG}/pipelines/${BK_PIPELINE}/builds" \ -H "Authorization: Bearer $BUILDKITE_API_TOKEN" \ -H "Content-Type: application/json" \ --data-raw "$(jq -n \ --arg commit "$PR_SHA" \ --arg branch "$PR_BRANCH" \ --arg message "/test ${TEST_TYPE} on PR #${PR_NUMBER}" \ --argjson pr_id "$PR_NUMBER" \ --arg test_scope "$TEST_SCOPE" \ --arg full_suite "$FULL_SUITE" \ --arg test_type "$TEST_TYPE" \ --arg pr_number "$PR_NUMBER" \ '{ commit: $commit, branch: $branch, message: $message, ignore_pipeline_branch_filters: true, pull_request_id: $pr_id, pull_request_base_branch: "main", env: { TEST_SCOPE: $test_scope, FULL_SUITE: $full_suite, TEST_TYPE: $test_type, PR_NUMBER: $pr_number } }')"