+++ /dev/null
-FROM python:3.7
-
-RUN pip install httpx "pydantic==1.5.1" pygithub
-
-COPY ./app /app
-
-CMD ["python", "/app/main.py"]
+++ /dev/null
-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
+++ /dev/null
-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")
types:
- completed
+permissions:
+ deployments: write
+ issues: write
+ pull-requests: write
+
jobs:
deploy-docs:
runs-on: ubuntu-latest
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 }}
--- /dev/null
+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
--- /dev/null
+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")