]> git.ipfire.org Git - thirdparty/fastapi/sqlmodel.git/commitdiff
♻️ Refactor Deploy Docs GitHub Action to be a script and update token preparing for...
authorSebastián Ramírez <tiangolo@gmail.com>
Thu, 1 Aug 2024 00:05:06 +0000 (19:05 -0500)
committerGitHub <noreply@github.com>
Thu, 1 Aug 2024 00:05:06 +0000 (00:05 +0000)
.github/actions/comment-docs-preview-in-pr/Dockerfile [deleted file]
.github/actions/comment-docs-preview-in-pr/action.yml [deleted file]
.github/actions/comment-docs-preview-in-pr/app/main.py [deleted file]
.github/workflows/deploy-docs.yml
requirements-github-actions.txt [new file with mode: 0644]
scripts/comment_docs_deploy_url_in_pr.py [new file with mode: 0644]

diff --git a/.github/actions/comment-docs-preview-in-pr/Dockerfile b/.github/actions/comment-docs-preview-in-pr/Dockerfile
deleted file mode 100644 (file)
index 4f20c5f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-FROM python:3.7
-
-RUN pip install httpx "pydantic==1.5.1" pygithub
-
-COPY ./app /app
-
-CMD ["python", "/app/main.py"]
diff --git a/.github/actions/comment-docs-preview-in-pr/action.yml b/.github/actions/comment-docs-preview-in-pr/action.yml
deleted file mode 100644 (file)
index 0eb6440..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-name: Comment Docs Preview in PR
-description: Comment with the docs URL preview in the PR
-author: Sebastián Ramírez <tiangolo@gmail.com>
-inputs:
-  token:
-    description: Token for the repo. Can be passed in using {{ secrets.GITHUB_TOKEN }}
-    required: true
-  deploy_url:
-    description: The deployment URL to comment in the PR
-    required: true
-runs:
-  using: docker
-  image: Dockerfile
diff --git a/.github/actions/comment-docs-preview-in-pr/app/main.py b/.github/actions/comment-docs-preview-in-pr/app/main.py
deleted file mode 100644 (file)
index c9fb7cb..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-import logging
-import sys
-from pathlib import Path
-from typing import Optional
-
-import httpx
-from github import Github
-from github.PullRequest import PullRequest
-from pydantic import BaseModel, BaseSettings, SecretStr, ValidationError
-
-github_api = "https://api.github.com"
-
-
-class Settings(BaseSettings):
-    github_repository: str
-    github_event_path: Path
-    github_event_name: Optional[str] = None
-    input_token: SecretStr
-    input_deploy_url: str
-
-
-class PartialGithubEventHeadCommit(BaseModel):
-    id: str
-
-
-class PartialGithubEventWorkflowRun(BaseModel):
-    head_commit: PartialGithubEventHeadCommit
-
-
-class PartialGithubEvent(BaseModel):
-    workflow_run: PartialGithubEventWorkflowRun
-
-
-if __name__ == "__main__":
-    logging.basicConfig(level=logging.INFO)
-    settings = Settings()
-    logging.info(f"Using config: {settings.json()}")
-    g = Github(settings.input_token.get_secret_value())
-    repo = g.get_repo(settings.github_repository)
-    try:
-        event = PartialGithubEvent.parse_file(settings.github_event_path)
-    except ValidationError as e:
-        logging.error(f"Error parsing event file: {e.errors()}")
-        sys.exit(0)
-    use_pr: Optional[PullRequest] = None
-    for pr in repo.get_pulls():
-        if pr.head.sha == event.workflow_run.head_commit.id:
-            use_pr = pr
-            break
-    if not use_pr:
-        logging.error(f"No PR found for hash: {event.workflow_run.head_commit.id}")
-        sys.exit(0)
-    github_headers = {
-        "Authorization": f"token {settings.input_token.get_secret_value()}"
-    }
-    url = f"{github_api}/repos/{settings.github_repository}/issues/{use_pr.number}/comments"
-    logging.info(f"Using comments URL: {url}")
-    response = httpx.post(
-        url,
-        headers=github_headers,
-        json={
-            "body": f"📝 Docs preview for commit {use_pr.head.sha} at: {settings.input_deploy_url}"
-        },
-    )
-    if not (200 <= response.status_code <= 300):
-        logging.error(f"Error posting comment: {response.text}")
-        sys.exit(1)
-    logging.info("Finished")
index 41320b57b12044de361d00dd7c6896458a1bd313..1984643ddd1d2e2ec80e5d9a4075df24070f6df0 100644 (file)
@@ -6,6 +6,11 @@ on:
     types:
       - completed
 
+permissions:
+  deployments: write
+  issues: write
+  pull-requests: write
+
 jobs:
   deploy-docs:
     runs-on: ubuntu-latest
@@ -38,9 +43,22 @@ jobs:
           directory: './site'
           gitHubToken: ${{ secrets.GITHUB_TOKEN }}
           branch: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'main' && '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 != ''
-        uses: ./.github/actions/comment-docs-preview-in-pr
-        with:
-          token: ${{ secrets.GITHUB_TOKEN }}
-          deploy_url: "${{ steps.deploy.outputs.url }}"
+        run: python ./scripts/comment_docs_deploy_url_in_pr.py
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+          DEPLOY_URL: ${{ steps.deploy.outputs.url }}
+          COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
diff --git a/requirements-github-actions.txt b/requirements-github-actions.txt
new file mode 100644 (file)
index 0000000..559dc06
--- /dev/null
@@ -0,0 +1,4 @@
+PyGithub>=2.3.0,<3.0.0
+pydantic>=2.5.3,<3.0.0
+pydantic-settings>=2.1.0,<3.0.0
+httpx>=0.27.0,<0.28.0
diff --git a/scripts/comment_docs_deploy_url_in_pr.py b/scripts/comment_docs_deploy_url_in_pr.py
new file mode 100644 (file)
index 0000000..3148a3b
--- /dev/null
@@ -0,0 +1,31 @@
+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")