fix(ci): make Docs AI Review workflow work for fork PRs (#3577)
## Summary
Fix two related issues in `.github/workflows/docs-ai-review.yml` so that
the Docs AI Review packet + advisory comment works for fork-originated
PRs (which is the common case in this repo).
- **Rerun on push when labeled.** The `pull_request` trigger previously
only listed the `labeled` action, so the workflow ran exactly once when
the `ai-review-docs` label was first applied and did not re-run when the
PR was updated with new commits. Add `synchronize` and `reopened` to the
types list, and gate those two actions on the `ai-review-docs` label
already being present on the PR.
- **Split the advisory comment into a `workflow_run` workflow.** Pull
requests from forks run `pull_request` workflows with a read-only
`GITHUB_TOKEN` regardless of declared `permissions:`, so the inline
comment step could never post on fork PRs and returned 403 on both the
GraphQL `addComment` mutation (via `gh pr comment`) and the REST
`issues/{n}/comments` endpoint. Following the standard GitHub pattern:
- `docs-ai-review.yml` (pull_request trigger) now only prepares the
packet and uploads it, together with a `pr-metadata.json` describing PR
number / head SHA / base SHA / trigger name.
- A new `docs-ai-review-comment.yml` (`workflow_run` trigger) downloads
the artifact from the completed run, parses the metadata, and upserts
the advisory comment via REST. Because `workflow_run` runs in the
base-repo context, its `GITHUB_TOKEN` honors `issues: write` even for
fork PRs.
The comment workflow does not check out or execute any code from the
fork — it only consumes the prebuilt packet and metadata JSON — so it
avoids the footgun usually associated with giving write permissions to
fork-triggered runs.
## Test plan
- [ ] After merge, open a fresh fork PR and add the `ai-review-docs`
label — confirm `Docs AI Review` runs (prepare packet + upload
artifact).
- [ ] Confirm `Docs AI Review Comment` fires via `workflow_run`
afterwards and upserts a comment with the packet metadata.
- [ ] Push a follow-up commit to the same PR — confirm `Docs AI Review`
reruns on `synchronize` because the label is still applied, and the
advisory comment is updated in place (PATCH path).
- [ ] Post `/review-docs` as a COLLABORATOR/MEMBER on a PR — confirm
`Docs AI Review` runs via `issue_comment` and the comment workflow
follows.
- [ ] Remove the label, push again — confirm `Docs AI Review` no longer
runs.Source code for doris.apache.org, built with Docusaurus 3.
Use local_dev.sh to run the site locally. It handles dependency installation, version filtering, and memory settings automatically.
# Start English dev server (default: only 'current' version, 2 GB memory) ./local_dev.sh # Start Chinese dev server ./local_dev.sh start-zh # Start on a custom port ./local_dev.sh start --port 8080 # Build a specific doc version ./local_dev.sh start --versions "4.x" # Build English docs (production build) ./local_dev.sh build # Build all locales (en + zh-CN) ./local_dev.sh build-all # Clean build artifacts and caches ./local_dev.sh clean
Run ./local_dev.sh help for all available commands and options.
export NODE_OPTIONS=--max-old-space-size=8192 yarn install yarn docusaurus build --locale en --locale zh-CN
The output is generated in the build/ directory.
. ├── docs/ # Current (dev) version docs (English) ├── versioned_docs/ │ ├── version-4.x/ # 4.x version docs (English) │ ├── version-3.x/ # 3.x version docs (English) │ └── version-2.1/ # 2.1 version docs (English) ├── i18n/zh-CN/ │ └── docusaurus-plugin-content-docs/ │ ├── current/ # Current (dev) version docs (Chinese) │ ├── version-4.x/ # 4.x version docs (Chinese) │ ├── version-3.x/ # 3.x version docs (Chinese) │ └── version-2.1/ # 2.1 version docs (Chinese) ├── blog/ # Blog posts ├── community/ # Community docs ├── src/ # React components and pages ├── static/ # Static assets (images, JS, CSS) ├── sidebars.ts # Sidebar for current (dev) docs ├── versioned_sidebars/ # Sidebar files per version │ ├── version-4.x-sidebars.json │ ├── version-3.x-sidebars.json │ └── version-2.1-sidebars.json ├── sidebarsCommunity.json # Sidebar for community docs ├── versions.json # Active doc versions ├── docusaurus.config.js # Docusaurus configuration └── local_dev.sh # Local development helper script
For general contribution guidelines, see:
When modifying docs, you typically need to update both the English and Chinese versions in the corresponding directories:
| Version | English | Chinese | Sidebar |
|---|---|---|---|
| Current (dev) | docs/ | i18n/zh-CN/.../current/ | sidebars.ts |
| 4.x | versioned_docs/version-4.x/ | i18n/zh-CN/.../version-4.x/ | versioned_sidebars/version-4.x-sidebars.json |
| 3.x | versioned_docs/version-3.x/ | i18n/zh-CN/.../version-3.x/ | versioned_sidebars/version-3.x-sidebars.json |
| 2.1 | versioned_docs/version-2.1/ | i18n/zh-CN/.../version-2.1/ | versioned_sidebars/version-2.1-sidebars.json |
Note: When adding a new page, you must also add its path to the corresponding sidebar file, otherwise it will not appear in the navigation.
Blog posts are located in the blog/ directory. Submit a PR to add or modify blog content.
Community docs are in community/, with navigation controlled by sidebarsCommunity.json. Chinese community content lives under i18n/zh-CN/docusaurus-plugin-content-docs-community/.
All images are stored in static/images/. Use hyphens to separate words in filenames (e.g., query-profile-example.png).

The site is deployed via GitHub Actions:
| Workflow | Trigger | Description |
|---|---|---|
cron-deploy-website.yml | Daily at 01:00 AM | Syncs from Doris master branch and deploys |
manual-deploy-website.yml | Manual | Deploy from a specified branch |
build-check.yml | On PR | Validates the build passes (incrementally by detected version) |