mirror of
https://github.com/PaiGramTeam/sqlmodel.git
synced 2024-11-29 10:36:33 +00:00
👷♂️ Upgrade CI for docs (#628)
This commit is contained in:
parent
02bd7ebffd
commit
a21d5c85a3
7
.github/actions/watch-previews/Dockerfile
vendored
7
.github/actions/watch-previews/Dockerfile
vendored
@ -1,7 +0,0 @@
|
|||||||
FROM python:3.7
|
|
||||||
|
|
||||||
RUN pip install httpx PyGithub "pydantic==1.5.1"
|
|
||||||
|
|
||||||
COPY ./app /app
|
|
||||||
|
|
||||||
CMD ["python", "/app/main.py"]
|
|
10
.github/actions/watch-previews/action.yml
vendored
10
.github/actions/watch-previews/action.yml
vendored
@ -1,10 +0,0 @@
|
|||||||
name: Watch docs previews in PRs
|
|
||||||
description: Check PRs and trigger new docs deploys
|
|
||||||
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
|
|
||||||
runs:
|
|
||||||
using: docker
|
|
||||||
image: Dockerfile
|
|
102
.github/actions/watch-previews/app/main.py
vendored
102
.github/actions/watch-previews/app/main.py
vendored
@ -1,102 +0,0 @@
|
|||||||
import logging
|
|
||||||
from datetime import datetime
|
|
||||||
from pathlib import Path
|
|
||||||
from typing import List, Optional
|
|
||||||
|
|
||||||
import httpx
|
|
||||||
from github import Github
|
|
||||||
from github.NamedUser import NamedUser
|
|
||||||
from pydantic import BaseModel, BaseSettings, SecretStr
|
|
||||||
|
|
||||||
github_api = "https://api.github.com"
|
|
||||||
netlify_api = "https://api.netlify.com"
|
|
||||||
main_branch = "main"
|
|
||||||
|
|
||||||
|
|
||||||
class Settings(BaseSettings):
|
|
||||||
input_token: SecretStr
|
|
||||||
github_repository: str
|
|
||||||
github_event_path: Path
|
|
||||||
github_event_name: Optional[str] = None
|
|
||||||
|
|
||||||
|
|
||||||
class Artifact(BaseModel):
|
|
||||||
id: int
|
|
||||||
node_id: str
|
|
||||||
name: str
|
|
||||||
size_in_bytes: int
|
|
||||||
url: str
|
|
||||||
archive_download_url: str
|
|
||||||
expired: bool
|
|
||||||
created_at: datetime
|
|
||||||
updated_at: datetime
|
|
||||||
|
|
||||||
|
|
||||||
class ArtifactResponse(BaseModel):
|
|
||||||
total_count: int
|
|
||||||
artifacts: List[Artifact]
|
|
||||||
|
|
||||||
|
|
||||||
def get_message(commit: str) -> str:
|
|
||||||
return f"Docs preview for commit {commit} at"
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
owner: NamedUser = repo.owner
|
|
||||||
headers = {"Authorization": f"token {settings.input_token.get_secret_value()}"}
|
|
||||||
prs = list(repo.get_pulls(state="open"))
|
|
||||||
response = httpx.get(
|
|
||||||
f"{github_api}/repos/{settings.github_repository}/actions/artifacts",
|
|
||||||
headers=headers,
|
|
||||||
)
|
|
||||||
data = response.json()
|
|
||||||
artifacts_response = ArtifactResponse.parse_obj(data)
|
|
||||||
for pr in prs:
|
|
||||||
logging.info("-----")
|
|
||||||
logging.info(f"Processing PR #{pr.number}: {pr.title}")
|
|
||||||
pr_comments = list(pr.get_issue_comments())
|
|
||||||
pr_commits = list(pr.get_commits())
|
|
||||||
last_commit = pr_commits[0]
|
|
||||||
for pr_commit in pr_commits:
|
|
||||||
if pr_commit.commit.author.date > last_commit.commit.author.date:
|
|
||||||
last_commit = pr_commit
|
|
||||||
commit = last_commit.commit.sha
|
|
||||||
logging.info(f"Last commit: {commit}")
|
|
||||||
message = get_message(commit)
|
|
||||||
notified = False
|
|
||||||
for pr_comment in pr_comments:
|
|
||||||
if message in pr_comment.body:
|
|
||||||
notified = True
|
|
||||||
logging.info(f"Docs preview was notified: {notified}")
|
|
||||||
if not notified:
|
|
||||||
artifact_name = f"docs-zip-{commit}"
|
|
||||||
use_artifact: Optional[Artifact] = None
|
|
||||||
for artifact in artifacts_response.artifacts:
|
|
||||||
if artifact.name == artifact_name:
|
|
||||||
use_artifact = artifact
|
|
||||||
break
|
|
||||||
if not use_artifact:
|
|
||||||
logging.info("Artifact not available")
|
|
||||||
else:
|
|
||||||
logging.info(f"Existing artifact: {use_artifact.name}")
|
|
||||||
response = httpx.post(
|
|
||||||
f"{github_api}/repos/{settings.github_repository}/actions/workflows/preview-docs.yml/dispatches",
|
|
||||||
headers=headers,
|
|
||||||
json={
|
|
||||||
"ref": main_branch,
|
|
||||||
"inputs": {
|
|
||||||
"pr": f"{pr.number}",
|
|
||||||
"name": artifact_name,
|
|
||||||
"commit": commit,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
logging.info(
|
|
||||||
f"Trigger sent, response status: {response.status_code} - content: {response.content}"
|
|
||||||
)
|
|
||||||
logging.info("Finished")
|
|
69
.github/workflows/build-docs.yml
vendored
69
.github/workflows/build-docs.yml
vendored
@ -7,14 +7,34 @@ on:
|
|||||||
types:
|
types:
|
||||||
- opened
|
- opened
|
||||||
- synchronize
|
- synchronize
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
debug_enabled:
|
|
||||||
description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)'
|
|
||||||
required: false
|
|
||||||
default: false
|
|
||||||
jobs:
|
jobs:
|
||||||
|
changes:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# Required permissions
|
||||||
|
permissions:
|
||||||
|
pull-requests: read
|
||||||
|
# Set job outputs to values from filter step
|
||||||
|
outputs:
|
||||||
|
docs: ${{ steps.filter.outputs.docs }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
# For pull requests it's not necessary to checkout the code but for the main branch it is
|
||||||
|
- uses: dorny/paths-filter@v2
|
||||||
|
id: filter
|
||||||
|
with:
|
||||||
|
filters: |
|
||||||
|
docs:
|
||||||
|
- README.md
|
||||||
|
- docs/**
|
||||||
|
- docs_src/**
|
||||||
|
- pyproject.toml
|
||||||
|
- mkdocs.yml
|
||||||
|
- mkdocs.insiders.yml
|
||||||
|
|
||||||
build-docs:
|
build-docs:
|
||||||
|
needs:
|
||||||
|
- changes
|
||||||
|
if: ${{ needs.changes.outputs.docs == 'true' }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Dump GitHub context
|
- name: Dump GitHub context
|
||||||
@ -26,18 +46,12 @@ jobs:
|
|||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
# Allow debugging with tmate
|
|
||||||
- name: Setup tmate session
|
|
||||||
uses: mxschmitt/action-tmate@v3
|
|
||||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled }}
|
|
||||||
with:
|
|
||||||
limit-access-to-actor: true
|
|
||||||
- uses: actions/cache@v3
|
- uses: actions/cache@v3
|
||||||
id: cache
|
id: cache
|
||||||
with:
|
with:
|
||||||
path: ${{ env.pythonLocation }}
|
path: ${{ env.pythonLocation }}
|
||||||
key: ${{ runner.os }}-python-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }}-root-docs-v2
|
key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }}-v01
|
||||||
- name: Install poetry
|
- name: Install Poetry
|
||||||
if: steps.cache.outputs.cache-hit != 'true'
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
@ -61,19 +75,20 @@ jobs:
|
|||||||
- name: Build Docs with Insiders
|
- name: Build Docs with Insiders
|
||||||
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false
|
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false
|
||||||
run: python -m poetry run mkdocs build --config-file mkdocs.insiders.yml
|
run: python -m poetry run mkdocs build --config-file mkdocs.insiders.yml
|
||||||
- name: Zip docs
|
|
||||||
run: python -m poetry run bash ./scripts/zip-docs.sh
|
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: docs-zip
|
name: docs-site
|
||||||
path: ./site/docs.zip
|
path: ./site/**
|
||||||
- name: Deploy to Netlify
|
|
||||||
uses: nwtgck/actions-netlify@v2.0.0
|
# https://github.com/marketplace/actions/alls-green#why
|
||||||
|
docs-all-green: # This job does nothing and is only used for the branch protection
|
||||||
|
if: always()
|
||||||
|
needs:
|
||||||
|
- build-docs
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Decide whether the needed jobs succeeded or failed
|
||||||
|
uses: re-actors/alls-green@release/v1
|
||||||
with:
|
with:
|
||||||
publish-dir: './site'
|
jobs: ${{ toJSON(needs) }}
|
||||||
production-branch: main
|
allowed-skips: build-docs
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
enable-commit-comment: false
|
|
||||||
env:
|
|
||||||
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
|
|
||||||
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
name: Preview Docs
|
name: Deploy Docs
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
workflow_run:
|
||||||
workflows:
|
workflows:
|
||||||
@ -7,39 +7,42 @@ on:
|
|||||||
- completed
|
- completed
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
preview-docs:
|
deploy-docs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3.1.0
|
- name: Dump GitHub context
|
||||||
|
env:
|
||||||
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
|
run: echo "$GITHUB_CONTEXT"
|
||||||
|
- uses: actions/checkout@v3
|
||||||
- name: Clean site
|
- name: Clean site
|
||||||
run: |
|
run: |
|
||||||
rm -rf ./site
|
rm -rf ./site
|
||||||
mkdir ./site
|
mkdir ./site
|
||||||
- name: Download Artifact Docs
|
- name: Download Artifact Docs
|
||||||
uses: dawidd6/action-download-artifact@v2.24.2
|
id: download
|
||||||
|
uses: dawidd6/action-download-artifact@v2.27.0
|
||||||
with:
|
with:
|
||||||
|
if_no_artifact_found: ignore
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
workflow: build-docs.yml
|
workflow: build-docs.yml
|
||||||
run_id: ${{ github.event.workflow_run.id }}
|
run_id: ${{ github.event.workflow_run.id }}
|
||||||
name: docs-zip
|
name: docs-site
|
||||||
path: ./site/
|
path: ./site/
|
||||||
- name: Unzip docs
|
|
||||||
run: |
|
|
||||||
cd ./site
|
|
||||||
unzip docs.zip
|
|
||||||
rm -f docs.zip
|
|
||||||
- name: Deploy to Netlify
|
- name: Deploy to Netlify
|
||||||
|
if: steps.download.outputs.found_artifact == 'true'
|
||||||
id: netlify
|
id: netlify
|
||||||
uses: nwtgck/actions-netlify@v1.1.5
|
uses: nwtgck/actions-netlify@v2.0.0
|
||||||
with:
|
with:
|
||||||
publish-dir: './site'
|
publish-dir: './site'
|
||||||
production-deploy: false
|
production-deploy: ${{ github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'main' }}
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
enable-commit-comment: false
|
enable-commit-comment: false
|
||||||
env:
|
env:
|
||||||
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
|
||||||
|
if: steps.netlify.outputs.deploy-url != ''
|
||||||
uses: ./.github/actions/comment-docs-preview-in-pr
|
uses: ./.github/actions/comment-docs-preview-in-pr
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
Loading…
Reference in New Issue
Block a user