Skip to content

Pre-process example notebooks #494

Pre-process example notebooks

Pre-process example notebooks #494

name: Pre-process example notebooks
on:
workflow_dispatch:
inputs:
pr_number:
description: 'Update the cache for PR#: (leave blank if not a PR)'
required: false
default: ""
type: string
schedule:
- cron: 0 0 * * * # 1/day at midnight UTC
push:
branches:
- main
concurrency:
group: ${{ github.workflow }}-${{ inputs.pr_number || github.ref || github.run_id }}
cancel-in-progress: true
jobs:
preprocess:
runs-on: ubuntu-latest
steps:
- name: Choose deployment branch
shell: bash -l {0}
run: |
if [[ ${{ github.event_name }} != "workflow_dispatch" ]]; then
echo "DEPLOY_BRANCH=_cookbook_data_$GITHUB_REF_NAME" >> "$GITHUB_ENV"
elif [[ "${{ inputs.pr_number }}" == "" ]]; then
echo "DEPLOY_BRANCH=_cookbook_data_$GITHUB_REF_NAME" >> "$GITHUB_ENV"
else
echo "DEPLOY_BRANCH=_cookbook_data_PR${{ inputs.pr_number }}" >> "$GITHUB_ENV"
fi
- name: Report dispatch to PR
if: github.event_name == 'workflow_dispatch' && inputs.pr_number != ''
uses: thollander/actions-comment-pull-request@v2
with:
pr_number: ${{ inputs.pr_number }}
message: >
A workflow has been dispatched to regenerate the cookbook cache for this PR.
- Run ID: [${{ github.run_id }}]
- Triggering actor: ${{ github.triggering_actor }}
- Target branch: ${{ github.ref_name }}
- Deployment branch: ${{ env.DEPLOY_BRANCH }}
[${{ github.run_id }}]: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
- name: Create check
if: github.event_name == 'workflow_dispatch' && inputs.pr_number != ''
id: create-check
uses: actions/github-script@v6
with:
script: |
const created_run = await github.request(
'POST /repos/{owner}/{repo}/check-runs',
{
owner: context.repo.owner,
repo: context.repo.repo,
name: '${{ github.job }}',
head_sha: '${{ github.sha }}',
details_url: '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}',
status: 'in_progress',
started_at: new Date().toISOString(),
output: {
title: 'Regenerate example notebook cache',
summary: 'Results and progress: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}',
text: ''
},
headers: {
'X-GitHub-Api-Version': '2022-11-28'
}
}
)
return created_run.data.id
- uses: actions/checkout@v3
- name: Install Conda environment
uses: mamba-org/setup-micromamba@v1
with:
environment-file: devtools/conda-envs/examples_env.yml
- name: Pre-process and execute notebooks
shell: bash -l {0}
run: |
set -e
python source/_ext/proc_examples.py --prefix=deploy/ --cache-branch=${DEPLOY_BRANCH} --log-failures=notebooks_log.json
- name: Read notebooks log
if: always()
shell: bash -l {0}
run: echo "NOTEBOOKS_LOG=$(cat 'notebooks_log.json')" >> "$GITHUB_ENV"
- name: Deploy cache
shell: bash -l {0}
run: |
cd deploy
git config --global user.name github-actions
git config --global user.email github-actions@github.com
git config --global init.defaultBranch main
# Create an empty repository so we don't have to fetch (guaranteeing atomicity)
git init .
git remote add origin "https://github-actions:${{ github.token }}@github.com/${{ github.repository }}.git"
# Commit the deployment and force push to the deploy branch
git add .
git commit -m "Deploy pre-processed notebook cache"
git push --force origin HEAD:$DEPLOY_BRANCH
- name: Trigger RTD build
# RTD doesn't offer a way to manually trigger builds in PRs, so we'll just do this for other builds
if: github.event_name == 'schedule' || github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && inputs.pr_number == '')
shell: bash -l {0}
run: |
curl -X POST -d "branches=$GITHUB_REF_NAME" -d "token=${{ secrets.RTD_WEBHOOK_TOKEN }}" https://readthedocs.org/api/v2/webhook/openff-docs/243876/
- name: Report status to PR
id: reportStatusToPr
if: always() && github.event_name == 'workflow_dispatch' && inputs.pr_number != ''
uses: thollander/actions-comment-pull-request@v2
with:
pr_number: ${{ inputs.pr_number }}
message: >
A workflow dispatched to regenerate the cookbook cache for this PR has just finished.
- Run ID: [${{ github.run_id }}]
- Triggering actor: ${{ github.triggering_actor }}
- Target branch: ${{ github.ref_name }}
- Deployment branch: ${{ env.DEPLOY_BRANCH }}
- Job status: **${{ job.status }}**
- Notebooks status: ${{fromJSON(env.NOTEBOOKS_LOG).n_successful}} / ${{fromJSON(env.NOTEBOOKS_LOG).n_total}} notebooks successfully executed (${{fromJSON(env.NOTEBOOKS_LOG).n_ignored}} failures ignored)
${{(fromJSON(env.NOTEBOOKS_LOG).failed || fromJSON(env.NOTEBOOKS_LOG).ignored) && '- Failing notebooks:
- ' || ''}}${{join(fromJSON(env.NOTEBOOKS_LOG).failed, '
- ')}}${{fromJSON(env.NOTEBOOKS_LOG).ignored && '
- [ignored] ' || ''}}${{join(fromJSON(env.NOTEBOOKS_LOG).ignored, '
- [ignored] ')}}
Changes will only be visible in the ReadTheDocs
preview after it has been [rebuilt].
[${{ github.run_id }}]: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
[rebuilt]: https://readthedocs.org/projects/openff-docs/builds/
- name: Report status to PR on templating failure
if: always() && steps.reportStatusToPr.outcome == 'failure'
uses: thollander/actions-comment-pull-request@v2
with:
pr_number: ${{ inputs.pr_number }}
message: >
A workflow dispatched to regenerate the cookbook cache for this PR has just finished.
- Run ID: [${{ github.run_id }}]
- Triggering actor: ${{ github.triggering_actor }}
- Target branch: ${{ github.ref_name }}
- Deployment branch: ${{ env.DEPLOY_BRANCH }}
- Job status: **${{ job.status }}**
- Notebooks status: N/A
Changes will only be visible in the ReadTheDocs
preview after it has been [rebuilt].
[${{ github.run_id }}]: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
[rebuilt]: https://readthedocs.org/projects/openff-docs/builds/
- name: Update check
if: always() && github.event_name == 'workflow_dispatch' && inputs.pr_number != ''
uses: actions/github-script@v6
with:
script: |
await github.request(
'PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}',
{
owner: context.repo.owner,
repo: context.repo.repo,
check_run_id: ${{ steps.create-check.outputs.result }},
status: 'completed',
conclusion: '${{ job.status }}',
completed_at: new Date().toISOString(),
headers: {
'X-GitHub-Api-Version': '2022-11-28'
}
}
)