mirror of https://github.com/tiangolo/fastapi.git
👷🏻 Add deploy docs status and preview links to PRs (#11961)
This commit is contained in:
parent
a031d80e5c
commit
f118154576
|
|
@ -20,6 +20,25 @@ jobs:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v4
|
- 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
|
- name: Clean site
|
||||||
run: |
|
run: |
|
||||||
rm -rf ./site
|
rm -rf ./site
|
||||||
|
|
@ -43,22 +62,11 @@ 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 == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
|
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
|
- name: Comment Deploy
|
||||||
if: steps.deploy.outputs.url != ''
|
if: steps.deploy.outputs.url != ''
|
||||||
run: python ./scripts/comment_docs_deploy_url_in_pr.py
|
run: python ./scripts/deploy_docs_status.py
|
||||||
env:
|
env:
|
||||||
GITHUB_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 }}
|
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||||
|
RUN_ID: ${{ github.run_id }}
|
||||||
|
|
|
||||||
|
|
@ -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")
|
|
||||||
|
|
@ -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()
|
||||||
Loading…
Reference in New Issue