| 1 | name: Preview Docs |
| 2 | |
| 3 | on: |
| 4 | pull_request_target: |
| 5 | types: [opened, synchronize, ready_for_review] |
| 6 | branches: |
| 7 | - main |
| 8 | |
| 9 | jobs: |
| 10 | run: |
| 11 | runs-on: ubuntu-latest |
| 12 | permissions: |
| 13 | pull-requests: write |
| 14 | contents: read |
| 15 | steps: |
| 16 | - name: Checkout repository |
| 17 | uses: actions/checkout@v4 |
| 18 | with: |
| 19 | fetch-depth: 0 |
| 20 | |
| 21 | - name: Checkout PR |
| 22 | run: | |
| 23 | git fetch origin pull/${{ github.event.pull_request.number }}/head:pr-${{ github.event.pull_request.number }} |
| 24 | git checkout pr-${{ github.event.pull_request.number }} |
| 25 | |
| 26 | - name: Setup Fern CLI |
| 27 | uses: fern-api/setup-fern-cli@v1 |
| 28 | |
| 29 | - name: Generate preview URL |
| 30 | id: generate-docs |
| 31 | env: |
| 32 | FERN_TOKEN: ${{ secrets.FERN_TOKEN }} |
| 33 | HEAD_REF: ${{ github.head_ref }} |
| 34 | run: | |
| 35 | OUTPUT=$(fern generate --docs --preview --id "$HEAD_REF" 2>&1) || true |
| 36 | echo "$OUTPUT" |
| 37 | URL=$(echo "$OUTPUT" | grep -oP 'Published docs to \K.*(?= \()') |
| 38 | echo "preview_url=$URL" >> $GITHUB_OUTPUT |
| 39 | echo "Preview URL: $URL" |
| 40 | |
| 41 | - name: Get page links for changed MDX files |
| 42 | id: page-links |
| 43 | env: |
| 44 | FERN_TOKEN: ${{ secrets.FERN_TOKEN }} |
| 45 | run: | |
| 46 | PREVIEW_URL="${{ steps.generate-docs.outputs.preview_url }}" |
| 47 | CHANGED_FILES=$(git diff --name-only origin/main...HEAD -- '*.mdx' 2>/dev/null || echo "") |
| 48 | |
| 49 | if [ -z "$CHANGED_FILES" ] || [ -z "$PREVIEW_URL" ]; then |
| 50 | echo "page_links=" >> $GITHUB_OUTPUT; exit 0 |
| 51 | fi |
| 52 | |
| 53 | BASE_URL=$(echo "$PREVIEW_URL" | grep -oP 'https?://[^/]+') |
| 54 | |
| 55 | FILES_PARAM=$(echo "$CHANGED_FILES" | tr '\n' ',' | sed 's/,$//') |
| 56 | RESPONSE=$(curl -sf -H "FERN_TOKEN: $FERN_TOKEN" "${PREVIEW_URL}/api/fern-docs/get-slug-for-file?files=${FILES_PARAM}" 2>/dev/null) || { |
| 57 | echo "page_links=" >> $GITHUB_OUTPUT; exit 0 |
| 58 | } |
| 59 | |
| 60 | PAGE_LINKS=$(echo "$RESPONSE" | jq -r --arg url "$BASE_URL" \ |
| 61 | '.mappings[] | select(.slug != null) | "- [\(.slug)](\($url)/\(.slug))"') |
| 62 | |
| 63 | if [ -n "$PAGE_LINKS" ]; then |
| 64 | { echo "page_links<<EOF"; echo "$PAGE_LINKS"; echo "EOF"; } >> $GITHUB_OUTPUT |
| 65 | else |
| 66 | echo "page_links=" >> $GITHUB_OUTPUT |
| 67 | fi |
| 68 | |
| 69 | - name: Create comment content |
| 70 | run: | |
| 71 | echo ":herb: **预览你的文档:** <${{ steps.generate-docs.outputs.preview_url }}>" > comment.md |
| 72 | |
| 73 | if [ -n "${{ steps.page-links.outputs.page_links }}" ]; then |
| 74 | echo "" >> comment.md |
| 75 | echo "以下是你更新的 markdown 页面:" >> comment.md |
| 76 | echo "${{ steps.page-links.outputs.page_links }}" >> comment.md |
| 77 | fi |
| 78 | |
| 79 | - name: Post PR comment |
| 80 | uses: thollander/actions-comment-pull-request@v2.4.3 |
| 81 | with: |
| 82 | filePath: comment.md |
| 83 | comment_tag: preview-docs |
| 84 | mode: upsert |