Browse Source

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
pull/2246/head
Sebastián Ramírez 5 years ago
committed by GitHub
parent
commit
4e74d40736
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      .github/actions/comment-docs-preview-in-pr/Dockerfile
  2. 13
      .github/actions/comment-docs-preview-in-pr/action.yml
  3. 70
      .github/actions/comment-docs-preview-in-pr/app/main.py
  4. 2
      .github/workflows/build-docs.yml
  5. 58
      .github/workflows/preview-docs.yml
  6. 24
      .github/workflows/watch-docs-previews.yml

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

@ -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"]

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

@ -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 <[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

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

@ -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")

2
.github/workflows/build-docs.yml

@ -28,7 +28,7 @@ jobs:
- uses: actions/upload-artifact@v2
if: github.event_name == 'pull_request'
with:
name: docs-zip-${{ github.event.pull_request.head.sha }}
name: docs-zip
path: ./docs.zip
- name: Deploy to Netlify
uses: nwtgck/[email protected]

58
.github/workflows/preview-docs.yml

@ -1,29 +1,41 @@
name: Preview Docs
on:
workflow_dispatch:
inputs:
pr:
description: Pull Request number
required: true
name:
description: Artifact name for zip file with docs
required: true
commit:
description: Commit SHA hash
required: true
workflow_run:
workflows:
- Build Docs
types:
- completed
# workflow_dispatch:
# inputs:
# pr:
# description: Pull Request number
# required: true
# name:
# description: Artifact name for zip file with docs
# required: true
# commit:
# description: Commit SHA hash
# required: true
jobs:
deploy:
runs-on: ubuntu-18.04
runs-on: ubuntu-latest
steps:
- 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/[email protected]
with:
token: ${{ secrets.GITHUB_TOKEN }}
name: ${{ github.event.inputs.name }}
path: ./archive.zip
- name: Unzip docs
run: bash ./scripts/unzip-docs.sh
github_token: ${{ secrets.GITHUB_TOKEN }}
workflow: build-docs.yml
run_id: ${{ github.event.workflow_run.id }}
name: docs-zip
- name: Deploy to Netlify
id: netlify
uses: nwtgck/[email protected]
@ -36,9 +48,7 @@ jobs:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
- name: Comment Deploy
env:
PR: "${{ github.event.inputs.pr }}"
DEPLOY_URL: "${{ steps.netlify.outputs.deploy-url }}"
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
COMMIT: "${{ github.event.inputs.commit }}"
run: bash ./scripts/docs-comment-deploy.sh
uses: ./.github/actions/comment-docs-preview-in-pr
with:
token: ${{ secrets.GITHUB_TOKEN }}
deploy_url: "${{ steps.netlify.outputs.deploy-url }}"

24
.github/workflows/watch-docs-previews.yml

@ -1,13 +1,13 @@
name: Watch Docs Previews
on:
schedule:
- cron: "0 * * * *"
# name: Watch Docs Previews
# on:
# schedule:
# - cron: "0 * * * *"
jobs:
deploy:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- uses: ./.github/actions/watch-previews
with:
token: ${{ secrets.ACTIONS_TOKEN }}
# jobs:
# deploy:
# runs-on: ubuntu-18.04
# steps:
# - uses: actions/checkout@v2
# - uses: ./.github/actions/watch-previews
# with:
# token: ${{ secrets.ACTIONS_TOKEN }}

Loading…
Cancel
Save