Browse Source

👷 Refactor GitHub Action to comment docs deployment URLs and update token (#11925)

pull/11933/head
Sebastián Ramírez 8 months ago
committed by GitHub
parent
commit
8b930f8847
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 9
      .github/actions/comment-docs-preview-in-pr/Dockerfile
  2. 13
      .github/actions/comment-docs-preview-in-pr/action.yml
  3. 69
      .github/actions/comment-docs-preview-in-pr/app/main.py
  4. 23
      .github/workflows/deploy-docs.yml
  5. 4
      requirements-github-actions.txt
  6. 31
      scripts/comment_docs_deploy_url_in_pr.py

9
.github/actions/comment-docs-preview-in-pr/Dockerfile

@ -1,9 +0,0 @@
FROM python:3.10
COPY ./requirements.txt /app/requirements.txt
RUN pip install -r /app/requirements.txt
COPY ./app /app
CMD ["python", "/app/main.py"]

13
.github/actions/comment-docs-preview-in-pr/action.yml

@ -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 <[email protected]>
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

69
.github/actions/comment-docs-preview-in-pr/app/main.py

@ -1,69 +0,0 @@
import logging
import sys
from pathlib import Path
from typing import Union
import httpx
from github import Github
from github.PullRequest import PullRequest
from pydantic import BaseModel, SecretStr, ValidationError
from pydantic_settings import BaseSettings
github_api = "https://api.github.com"
class Settings(BaseSettings):
github_repository: str
github_event_path: Path
github_event_name: Union[str, None] = 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: Union[PullRequest, None] = 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")

23
.github/workflows/deploy-docs.yml

@ -5,9 +5,11 @@ on:
- Build Docs
types:
- completed
permissions:
deployments: write
issues: write
pull-requests: write
jobs:
deploy-docs:
@ -41,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 == '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 != ''
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 }}

4
.github/actions/comment-docs-preview-in-pr/requirements.txt → requirements-github-actions.txt

@ -1,4 +1,4 @@
PyGithub
PyGithub>=2.3.0,<3.0.0
pydantic>=2.5.3,<3.0.0
pydantic-settings>=2.1.0,<3.0.0
httpx
httpx>=0.27.0,<0.28.0

31
scripts/comment_docs_deploy_url_in_pr.py

@ -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")
Loading…
Cancel
Save