142 lines
5.7 KiB
YAML
142 lines
5.7 KiB
YAML
name: Review Pull Request
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
pr_number:
|
|
description: Pull request number to review
|
|
required: false
|
|
default: ""
|
|
type: string
|
|
trigger_source:
|
|
description: Source that requested the review
|
|
required: false
|
|
default: ""
|
|
type: string
|
|
requester:
|
|
description: Login of the user who requested the review, if any
|
|
required: false
|
|
default: ""
|
|
type: string
|
|
focus:
|
|
description: Optional extra focus guidance for the review
|
|
required: false
|
|
default: ""
|
|
type: string
|
|
comment_id:
|
|
description: Issue comment ID to react to for slash-command reviews
|
|
required: false
|
|
default: ""
|
|
type: string
|
|
secrets:
|
|
OZ_MGMT_GHA_APP_ID:
|
|
required: true
|
|
OZ_MGMT_GHA_PRIVATE_KEY:
|
|
required: true
|
|
OSS_WARP_API_KEY:
|
|
required: true
|
|
pull_request_target:
|
|
types:
|
|
- opened
|
|
- ready_for_review
|
|
- review_requested
|
|
- labeled
|
|
jobs:
|
|
resolve:
|
|
runs-on: ubuntu-slim
|
|
permissions:
|
|
contents: read
|
|
outputs:
|
|
should_run: ${{ steps.resolve.outputs.should_run }}
|
|
pr_number: ${{ steps.resolve.outputs.pr_number }}
|
|
trigger_source: ${{ steps.resolve.outputs.trigger_source }}
|
|
requester: ${{ steps.resolve.outputs.requester }}
|
|
focus: ${{ steps.resolve.outputs.focus }}
|
|
comment_id: ${{ steps.resolve.outputs.comment_id }}
|
|
skip_reason: ${{ steps.resolve.outputs.skip_reason }}
|
|
steps:
|
|
- name: Checkout repo
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
|
|
- name: Resolve review context
|
|
id: resolve
|
|
env:
|
|
INPUT_PR_NUMBER: ${{ inputs.pr_number || '' }}
|
|
INPUT_TRIGGER_SOURCE: ${{ inputs.trigger_source || '' }}
|
|
INPUT_REQUESTER: ${{ inputs.requester || '' }}
|
|
INPUT_FOCUS: ${{ inputs.focus || '' }}
|
|
INPUT_COMMENT_ID: ${{ inputs.comment_id || '' }}
|
|
GITHUB_ACTOR_LOGIN: ${{ github.actor }}
|
|
run: |
|
|
python - <<'PY'
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
event = json.loads(Path(os.environ["GITHUB_EVENT_PATH"]).read_text())
|
|
event_name = os.environ.get("GITHUB_EVENT_NAME", "")
|
|
input_pr_number = os.environ.get("INPUT_PR_NUMBER", "").strip()
|
|
pr = event.get("pull_request") or {}
|
|
head_ref = ((pr.get("head") or {}).get("ref") or "").strip()
|
|
action = (event.get("action") or "").strip()
|
|
requested_reviewer = ((event.get("requested_reviewer") or {}).get("login") or "").strip()
|
|
label_name = ((event.get("label") or {}).get("name") or "").strip()
|
|
has_pr_hooks = Path(".github/workflows/pr-hooks.yml").exists()
|
|
trigger_source = os.environ.get("INPUT_TRIGGER_SOURCE", "").strip() or event_name
|
|
requester = os.environ.get("INPUT_REQUESTER", "").strip() or os.environ.get("GITHUB_ACTOR_LOGIN", "")
|
|
focus = os.environ.get("INPUT_FOCUS", "")
|
|
comment_id = os.environ.get("INPUT_COMMENT_ID", "")
|
|
pr_number = input_pr_number or str(pr.get("number") or "")
|
|
matches_direct_trigger = (
|
|
(action == "opened" and not pr.get("draft", False))
|
|
or action == "ready_for_review"
|
|
or (action == "review_requested" and requested_reviewer == "oz-agent")
|
|
or (action == "labeled" and label_name == "oz-review")
|
|
)
|
|
if input_pr_number:
|
|
should_run = True
|
|
elif head_ref.startswith("cherrypick"):
|
|
should_run = False
|
|
elif has_pr_hooks and event_name == "pull_request_target":
|
|
should_run = False
|
|
else:
|
|
should_run = matches_direct_trigger and bool(pr_number)
|
|
with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as fh:
|
|
fh.write(f"should_run={'true' if should_run else 'false'}\n")
|
|
fh.write(f"pr_number={pr_number}\n")
|
|
fh.write(f"trigger_source={trigger_source}\n")
|
|
fh.write(f"requester={requester}\n")
|
|
fh.write("focus<<__EOF__\n")
|
|
fh.write(focus)
|
|
fh.write("\n__EOF__\n")
|
|
fh.write(f"comment_id={comment_id}\n")
|
|
if has_pr_hooks and event_name == "pull_request_target" and not input_pr_number:
|
|
fh.write("skip_reason=pr-hooks-present\n")
|
|
elif head_ref.startswith("cherrypick"):
|
|
fh.write("skip_reason=cherrypick-branch\n")
|
|
elif not should_run:
|
|
fh.write("skip_reason=event-not-enabled\n")
|
|
PY
|
|
skip_direct_trigger:
|
|
needs: resolve
|
|
if: needs.resolve.outputs.should_run != 'true' && needs.resolve.outputs.skip_reason == 'pr-hooks-present'
|
|
runs-on: ubuntu-slim
|
|
steps:
|
|
- name: Explain skip
|
|
run: echo "PR review orchestration skipped because .github/workflows/pr-hooks.yml is present."
|
|
review_pr:
|
|
needs: resolve
|
|
if: needs.resolve.outputs.should_run == 'true'
|
|
permissions:
|
|
contents: read
|
|
pull-requests: write
|
|
issues: write
|
|
uses: warpdotdev/oz-for-oss/.github/workflows/review-pull-request.yml@main
|
|
with:
|
|
pr_number: ${{ needs.resolve.outputs.pr_number }}
|
|
trigger_source: ${{ needs.resolve.outputs.trigger_source }}
|
|
requester: ${{ needs.resolve.outputs.requester }}
|
|
focus: ${{ needs.resolve.outputs.focus }}
|
|
comment_id: ${{ needs.resolve.outputs.comment_id }}
|
|
secrets:
|
|
OZ_MGMT_GHA_APP_ID: ${{ secrets.OZ_MGMT_GHA_APP_ID }}
|
|
OZ_MGMT_GHA_PRIVATE_KEY: ${{ secrets.OZ_MGMT_GHA_PRIVATE_KEY }}
|
|
WARP_API_KEY: ${{ secrets.OSS_WARP_API_KEY }}
|