]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
👷🏻 Add deploy docs status and preview links to PRs (#11961)
authorSebastián Ramírez <tiangolo@gmail.com>
Wed, 7 Aug 2024 19:15:24 +0000 (14:15 -0500)
committerGitHub <noreply@github.com>
Wed, 7 Aug 2024 19:15:24 +0000 (19:15 +0000)
.github/workflows/deploy-docs.yml
scripts/comment_docs_deploy_url_in_pr.py [deleted file]
scripts/deploy_docs_status.py [new file with mode: 0644]

index 7d8846bb390a8740869da1a7dce60162c036ca90..85c0cebecaa28a76d2ac75feb057ddc83630cd78 100644 (file)
@@ -20,6 +20,25 @@ jobs:
           GITHUB_CONTEXT: ${{ toJson(github) }}
         run: echo "$GITHUB_CONTEXT"
       - uses: actions/checkout@v4
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: "3.11"
+      - uses: actions/cache@v4
+        id: cache
+        with:
+          path: ${{ env.pythonLocation }}
+          key: ${{ runner.os }}-python-github-actions-${{ env.pythonLocation }}-${{ hashFiles('requirements-github-actions.txt') }}-v01
+      - name: Install GitHub Actions dependencies
+        if: steps.cache.outputs.cache-hit != 'true'
+        run: pip install -r requirements-github-actions.txt
+      - name: Deploy Docs Status Pending
+        run: python ./scripts/deploy_docs_status.py
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
+          RUN_ID: ${{ github.run_id }}
+
       - name: Clean site
         run: |
           rm -rf ./site
@@ -43,22 +62,11 @@ jobs:
           directory: './site'
           gitHubToken: ${{ secrets.GITHUB_TOKEN }}
           branch: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
-      - name: Set up Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: "3.11"
-      - uses: actions/cache@v4
-        id: cache
-        with:
-          path: ${{ env.pythonLocation }}
-          key: ${{ runner.os }}-python-github-actions-${{ env.pythonLocation }}-${{ hashFiles('requirements-github-actions.txt') }}-v01
-      - name: Install GitHub Actions dependencies
-        if: steps.cache.outputs.cache-hit != 'true'
-        run: pip install -r requirements-github-actions.txt
       - name: Comment Deploy
         if: steps.deploy.outputs.url != ''
-        run: python ./scripts/comment_docs_deploy_url_in_pr.py
+        run: python ./scripts/deploy_docs_status.py
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
           DEPLOY_URL: ${{ steps.deploy.outputs.url }}
           COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
+          RUN_ID: ${{ github.run_id }}
diff --git a/scripts/comment_docs_deploy_url_in_pr.py b/scripts/comment_docs_deploy_url_in_pr.py
deleted file mode 100644 (file)
index 3148a3b..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-import logging
-import sys
-
-from github import Github
-from pydantic import SecretStr
-from pydantic_settings import BaseSettings
-
-
-class Settings(BaseSettings):
-    github_repository: str
-    github_token: SecretStr
-    deploy_url: str
-    commit_sha: str
-
-
-if __name__ == "__main__":
-    logging.basicConfig(level=logging.INFO)
-    settings = Settings()
-    logging.info(f"Using config: {settings.model_dump_json()}")
-    g = Github(settings.github_token.get_secret_value())
-    repo = g.get_repo(settings.github_repository)
-    use_pr = next(
-        (pr for pr in repo.get_pulls() if pr.head.sha == settings.commit_sha), None
-    )
-    if not use_pr:
-        logging.error(f"No PR found for hash: {settings.commit_sha}")
-        sys.exit(0)
-    use_pr.as_issue().create_comment(
-        f"📝 Docs preview for commit {settings.commit_sha} at: {settings.deploy_url}"
-    )
-    logging.info("Finished")
diff --git a/scripts/deploy_docs_status.py b/scripts/deploy_docs_status.py
new file mode 100644 (file)
index 0000000..b199892
--- /dev/null
@@ -0,0 +1,97 @@
+import logging
+import re
+
+from github import Github
+from pydantic import SecretStr
+from pydantic_settings import BaseSettings
+
+
+class Settings(BaseSettings):
+    github_repository: str
+    github_token: SecretStr
+    deploy_url: str | None = None
+    commit_sha: str
+    run_id: int
+
+
+def main():
+    logging.basicConfig(level=logging.INFO)
+    settings = Settings()
+
+    logging.info(f"Using config: {settings.model_dump_json()}")
+    g = Github(settings.github_token.get_secret_value())
+    repo = g.get_repo(settings.github_repository)
+    use_pr = next(
+        (pr for pr in repo.get_pulls() if pr.head.sha == settings.commit_sha), None
+    )
+    if not use_pr:
+        logging.error(f"No PR found for hash: {settings.commit_sha}")
+        return
+    commits = list(use_pr.get_commits())
+    current_commit = [c for c in commits if c.sha == settings.commit_sha][0]
+    run_url = f"https://github.com/{settings.github_repository}/actions/runs/{settings.run_id}"
+    if not settings.deploy_url:
+        current_commit.create_status(
+            state="pending",
+            description="Deploy Docs",
+            context="deploy-docs",
+            target_url=run_url,
+        )
+        logging.info("No deploy URL available yet")
+        return
+    current_commit.create_status(
+        state="success",
+        description="Deploy Docs",
+        context="deploy-docs",
+        target_url=run_url,
+    )
+
+    files = list(use_pr.get_files())
+    docs_files = [f for f in files if f.filename.startswith("docs/")]
+
+    lang_links: dict[str, list[str]] = {}
+    for f in docs_files:
+        match = re.match(r"docs/([^/]+)/docs/(.*)", f.filename)
+        assert match
+        lang = match.group(1)
+        path = match.group(2)
+        if path.endswith("index.md"):
+            path = path.replace("index.md", "")
+        else:
+            path = path.replace(".md", "/")
+        if lang == "en":
+            link = f"{settings.deploy_url}{path}"
+        else:
+            link = f"{settings.deploy_url}{lang}/{path}"
+        lang_links.setdefault(lang, []).append(link)
+
+    links: list[str] = []
+    en_links = lang_links.get("en", [])
+    en_links.sort()
+    links.extend(en_links)
+
+    langs = list(lang_links.keys())
+    langs.sort()
+    for lang in langs:
+        if lang == "en":
+            continue
+        current_lang_links = lang_links[lang]
+        current_lang_links.sort()
+        links.extend(current_lang_links)
+
+    message = (
+        f"📝 Docs preview for commit {settings.commit_sha} at: {settings.deploy_url}"
+    )
+
+    if links:
+        message += "\n\n### Modified Pages\n\n"
+        message += "\n".join([f"* {link}" for link in links])
+
+    print(message)
+    use_pr.as_issue().create_comment(message)
+
+    logging.info("Finished")
+
+
+if __name__ == "__main__":
+    main()