diff --git a/.github/workflows/release-docs-update.yml b/.github/workflows/release-docs-update.yml new file mode 100644 index 00000000..31d7d079 --- /dev/null +++ b/.github/workflows/release-docs-update.yml @@ -0,0 +1,154 @@ +name: Release docs update + +on: + workflow_dispatch: + inputs: + channel_versions_ref: + description: Git ref in warpdotdev/channel-versions to use for channel_versions.json. + required: false + default: main + task_set: + description: Release update task set to run. + required: true + type: choice + default: changelog + options: + - changelog + - all + create_draft_pr: + description: Create release docs PRs as drafts during rollout. + required: true + type: boolean + default: true + assign_oncall_reviewers: + description: Assign primary and secondary client on-call reviewers. + required: true + type: boolean + default: false + repository_dispatch: + types: + - release-docs-update + +permissions: + contents: write + pull-requests: write + +concurrency: + group: release-docs-update-${{ github.run_id }} + cancel-in-progress: false + +jobs: + release-docs-update: + name: Run release docs update agent + runs-on: ubuntu-latest + steps: + - name: Checkout docs + uses: actions/checkout@v4 + + - name: Normalize trigger inputs + id: trigger-inputs + env: + EVENT_NAME: ${{ github.event_name }} + WORKFLOW_CHANNEL_VERSIONS_REF: ${{ inputs.channel_versions_ref }} + WORKFLOW_TASK_SET: ${{ inputs.task_set }} + WORKFLOW_CREATE_DRAFT_PR: ${{ inputs.create_draft_pr }} + WORKFLOW_ASSIGN_ONCALL_REVIEWERS: ${{ inputs.assign_oncall_reviewers }} + DISPATCH_CHANNEL_VERSIONS_REF: ${{ github.event.client_payload.channel_versions_ref }} + DISPATCH_TASK_SET: ${{ github.event.client_payload.task_set }} + DISPATCH_CREATE_DRAFT_PR: ${{ github.event.client_payload.create_draft_pr }} + DISPATCH_ASSIGN_ONCALL_REVIEWERS: ${{ github.event.client_payload.assign_oncall_reviewers }} + run: | + python3 <<'PY' + import json + import os + import re + import sys + + event_name = os.environ["EVENT_NAME"] + if event_name == "repository_dispatch": + raw = { + "channel_versions_ref": os.environ.get("DISPATCH_CHANNEL_VERSIONS_REF") or "main", + "task_set": os.environ.get("DISPATCH_TASK_SET") or "changelog", + "create_draft_pr": os.environ.get("DISPATCH_CREATE_DRAFT_PR") or "true", + "assign_oncall_reviewers": os.environ.get("DISPATCH_ASSIGN_ONCALL_REVIEWERS") or "false", + } + else: + raw = { + "channel_versions_ref": os.environ.get("WORKFLOW_CHANNEL_VERSIONS_REF") or "main", + "task_set": os.environ.get("WORKFLOW_TASK_SET") or "changelog", + "create_draft_pr": os.environ.get("WORKFLOW_CREATE_DRAFT_PR") or "true", + "assign_oncall_reviewers": os.environ.get("WORKFLOW_ASSIGN_ONCALL_REVIEWERS") or "false", + } + + channel_ref = raw["channel_versions_ref"].strip() + if not re.fullmatch(r"[A-Za-z0-9._/@-]{1,100}", channel_ref): + print("Invalid channel_versions_ref. Use only letters, numbers, '.', '_', '/', '@', or '-'.", file=sys.stderr) + raise SystemExit(1) + + task_set = raw["task_set"].strip() + if task_set not in {"changelog", "all"}: + print("Invalid task_set. Expected 'changelog' or 'all'.", file=sys.stderr) + raise SystemExit(1) + + def normalize_bool(name: str) -> str: + value = raw[name].strip().lower() + if value in {"true", "1", "yes"}: + return "true" + if value in {"false", "0", "no"}: + return "false" + print(f"Invalid {name}. Expected boolean true/false.", file=sys.stderr) + raise SystemExit(1) + + normalized = { + "source": event_name, + "channel_versions_ref": channel_ref, + "task_set": task_set, + "create_draft_pr": normalize_bool("create_draft_pr"), + "assign_oncall_reviewers": normalize_bool("assign_oncall_reviewers"), + } + + with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as output: + for key, value in normalized.items(): + print(f"{key}={value}", file=output) + print("json<` + - changelog-only: `python3 .agents/skills/release_updates/scripts/run_release_updates.py --tasks changelog --create-pr --pr-base main` + - all tasks: `python3 .agents/skills/release_updates/scripts/run_release_updates.py --create-pr --pr-base main` + + Include `--pr-draft` when create_draft_pr is true. + Include `--assign-oncall-reviewer` and repeated `--oncall-schedule-id` values only when reviewer assignment is enabled and configured.