协调发布

以 Markdown 格式查看

Fern Docs 支持基于其他仓库的发布来协调文档发布。这在记录依赖于其他仓库发布的功能时很有用。

这需要两个 GitHub Actions:一个在功能仓库中,一个在文档仓库中。

1

在功能仓库中设置发布通知

将此 GitHub Action 工作流程添加到功能发布的仓库中。当使用指定标签模式创建新发布时,此工作流程将向您的文档仓库发送通知,触发自动合并流程。

将以下占位符替换为您自己的值:

  • <GITHUB_ACCESS_TOKEN>:具有 repo 权限的 GitHub 令牌
  • <ORG>:包含文档仓库的组织
  • <DOCS_REPO>:文档仓库名称
  • <PRODUCT_RELEASE_TAG>:产品发布标签
.github/workflows/notify-docs-repo.yml
1name: Notify Docs Repo
2on:
3 release:
4 types: [created]
5
6jobs:
7 notify-docs:
8 runs-on: ubuntu-latest
9 if: startsWith(github.event.release.tag_name, '<PRODUCT_RELEASE_TAG>@')
10 steps:
11 - name: Trigger docs repo workflow
12 run: |
13 curl -f -X POST \
14 -H "Accept: application/vnd.github.v3+json" \
15 -H "Authorization: token ${{ secrets.<GITHUB_ACCESS_TOKEN> }}" \
16 https://api.github.com/repos/<ORG>/<DOCS_REPO>/dispatches \
17 -d '{"event_type":"<PRODUCT_RELEASE_TAG>","client_payload":{"version":"${{ github.ref_name }}"}}'
2

在文档仓库中配置自动合并

将此 GitHub Action 工作流程添加到您的文档仓库中,以在功能发布时自动合并 PR。将 <PRODUCT_RELEASE_TAG> 替换为您的产品发布标签。

.github/workflows/auto-merge-on-release.yml
1name: Auto-merge on Docs Release
2on:
3 repository_dispatch:
4 types: [<PRODUCT_RELEASE_TAG>]
5
6jobs:
7 merge-dependent-prs:
8 runs-on: ubuntu-latest
9 steps:
10 - name: Find and merge dependent PRs
11 uses: actions/github-script@v7
12 with:
13 script: |
14 const version = context.payload.client_payload.version;
15
16 // Find PRs with matching labels
17 const { data: prs } = await github.rest.pulls.list({
18 owner: context.repo.owner,
19 repo: context.repo.repo,
20 state: 'open'
21 });
22
23 for (const pr of prs) {
24 const labels = pr.labels.map(l => l.name);
25 const hasLatestLabel = labels.includes('depends-on: <PRODUCT_RELEASE_TAG>@latest');
26 const hasVersionLabel = labels.includes(`depends-on: <PRODUCT_RELEASE_TAG>@${version}`);
27
28 if (hasLatestLabel || hasVersionLabel) {
29 // Check if PR is approved
30 const { data: reviews } = await github.rest.pulls.listReviews({
31 owner: context.repo.owner,
32 repo: context.repo.repo,
33 pull_number: pr.number
34 });
35
36 const approved = reviews.some(r => r.state === 'APPROVED');
37
38 if (approved) {
39 await github.rest.pulls.merge({
40 owner: context.repo.owner,
41 repo: context.repo.repo,
42 pull_number: pr.number,
43 merge_method: 'squash'
44 });
45
46 console.log(`Merged PR #${pr.number}: ${pr.title}`);
47 }
48 }
49 }