mirror of https://github.com/tiangolo/fastapi.git
✨ Add instant docs deploy previews for PRs from forks (#2244)
* 🔥 Disable action Watch Docs Previews * 🔧 Use predefined name for docs artifacts for previews * ✨ Add new GitHub Action Comment Docs Preview in PR * 🔧 Refactor GitHub Action Preview Docs to work as workflow_run using new action to extract where to comment
This commit is contained in:
parent
612d114f3a
commit
4e74d40736
|
|
@ -0,0 +1,7 @@
|
||||||
|
FROM python:3.7
|
||||||
|
|
||||||
|
RUN pip install httpx "pydantic==1.5.1" pygithub
|
||||||
|
|
||||||
|
COPY ./app /app
|
||||||
|
|
||||||
|
CMD ["python", "/app/main.py"]
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
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
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
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")
|
||||||
|
|
@ -28,7 +28,7 @@ jobs:
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
with:
|
with:
|
||||||
name: docs-zip-${{ github.event.pull_request.head.sha }}
|
name: docs-zip
|
||||||
path: ./docs.zip
|
path: ./docs.zip
|
||||||
- name: Deploy to Netlify
|
- name: Deploy to Netlify
|
||||||
uses: nwtgck/actions-netlify@v1.1.5
|
uses: nwtgck/actions-netlify@v1.1.5
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,41 @@
|
||||||
name: Preview Docs
|
name: Preview Docs
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_run:
|
||||||
inputs:
|
workflows:
|
||||||
pr:
|
- Build Docs
|
||||||
description: Pull Request number
|
types:
|
||||||
required: true
|
- completed
|
||||||
name:
|
# workflow_dispatch:
|
||||||
description: Artifact name for zip file with docs
|
# inputs:
|
||||||
required: true
|
# pr:
|
||||||
commit:
|
# description: Pull Request number
|
||||||
description: Commit SHA hash
|
# required: true
|
||||||
required: true
|
# name:
|
||||||
|
# description: Artifact name for zip file with docs
|
||||||
|
# required: true
|
||||||
|
# commit:
|
||||||
|
# description: Commit SHA hash
|
||||||
|
# required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: ./.github/actions/get-artifact
|
# - uses: ./.github/actions/get-artifact
|
||||||
|
# with:
|
||||||
|
# token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# name: ${{ github.event.inputs.name }}
|
||||||
|
# path: ./archive.zip
|
||||||
|
# - name: Unzip docs
|
||||||
|
# run: bash ./scripts/unzip-docs.sh
|
||||||
|
- name: Download Artifact Docs
|
||||||
|
uses: dawidd6/action-download-artifact@v2.9.0
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
name: ${{ github.event.inputs.name }}
|
workflow: build-docs.yml
|
||||||
path: ./archive.zip
|
run_id: ${{ github.event.workflow_run.id }}
|
||||||
- name: Unzip docs
|
name: docs-zip
|
||||||
run: bash ./scripts/unzip-docs.sh
|
|
||||||
- name: Deploy to Netlify
|
- name: Deploy to Netlify
|
||||||
id: netlify
|
id: netlify
|
||||||
uses: nwtgck/actions-netlify@v1.1.5
|
uses: nwtgck/actions-netlify@v1.1.5
|
||||||
|
|
@ -36,9 +48,7 @@ jobs:
|
||||||
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
|
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
|
||||||
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
|
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
|
||||||
- name: Comment Deploy
|
- name: Comment Deploy
|
||||||
env:
|
uses: ./.github/actions/comment-docs-preview-in-pr
|
||||||
PR: "${{ github.event.inputs.pr }}"
|
with:
|
||||||
DEPLOY_URL: "${{ steps.netlify.outputs.deploy-url }}"
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
deploy_url: "${{ steps.netlify.outputs.deploy-url }}"
|
||||||
COMMIT: "${{ github.event.inputs.commit }}"
|
|
||||||
run: bash ./scripts/docs-comment-deploy.sh
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
name: Watch Docs Previews
|
# name: Watch Docs Previews
|
||||||
on:
|
# on:
|
||||||
schedule:
|
# schedule:
|
||||||
- cron: "0 * * * *"
|
# - cron: "0 * * * *"
|
||||||
|
|
||||||
jobs:
|
# jobs:
|
||||||
deploy:
|
# deploy:
|
||||||
runs-on: ubuntu-18.04
|
# runs-on: ubuntu-18.04
|
||||||
steps:
|
# steps:
|
||||||
- uses: actions/checkout@v2
|
# - uses: actions/checkout@v2
|
||||||
- uses: ./.github/actions/watch-previews
|
# - uses: ./.github/actions/watch-previews
|
||||||
with:
|
# with:
|
||||||
token: ${{ secrets.ACTIONS_TOKEN }}
|
# token: ${{ secrets.ACTIONS_TOKEN }}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue