♻️ Refactor Deploy Docs GitHub Action to be a script and update token preparing for org (#1039)
This commit is contained in:
parent
d7af50c184
commit
77374aa016
@ -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"]
|
|
@ -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
|
|
@ -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")
|
|
26
.github/workflows/deploy-docs.yml
vendored
26
.github/workflows/deploy-docs.yml
vendored
@ -6,6 +6,11 @@ on:
|
|||||||
types:
|
types:
|
||||||
- completed
|
- completed
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
deployments: write
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy-docs:
|
deploy-docs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -38,9 +43,22 @@ jobs:
|
|||||||
directory: './site'
|
directory: './site'
|
||||||
gitHubToken: ${{ secrets.GITHUB_TOKEN }}
|
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 ) }}
|
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
|
- name: Comment Deploy
|
||||||
if: steps.deploy.outputs.url != ''
|
if: steps.deploy.outputs.url != ''
|
||||||
uses: ./.github/actions/comment-docs-preview-in-pr
|
run: python ./scripts/comment_docs_deploy_url_in_pr.py
|
||||||
with:
|
env:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
deploy_url: "${{ steps.deploy.outputs.url }}"
|
DEPLOY_URL: ${{ steps.deploy.outputs.url }}
|
||||||
|
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||||
|
4
requirements-github-actions.txt
Normal file
4
requirements-github-actions.txt
Normal file
@ -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
|
31
scripts/comment_docs_deploy_url_in_pr.py
Normal file
31
scripts/comment_docs_deploy_url_in_pr.py
Normal file
@ -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…
x
Reference in New Issue
Block a user