From d50bf967015eb15e6e411aff8239dfec7e415c73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20S=2E=20Dokken?= Date: Tue, 2 May 2023 16:46:31 +0200 Subject: [PATCH] Improve CI and JB - Split CI into simpler standalone components - Use latest JupyterBook config --- .github/workflows/build_docs.yml | 51 ++++++--------------------- .github/workflows/deploy.yml | 54 +++++++++++++++++++++++++++++ .github/workflows/docker-image.yml | 4 +-- _config.yml | 1 + docs/logo.png | Bin 3630 -> 15269 bytes 5 files changed, 67 insertions(+), 43 deletions(-) create mode 100644 .github/workflows/deploy.yml diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index 07a2a8b..4f648ed 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -1,28 +1,16 @@ name: Github Pages on: - push: - branches: - - "**" + pull_request: + branches: ["main"] - # Allows you to run this workflow manually from the Actions tab + # Allows you to run this workflow manually from the Actions tab workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow one concurrent deployment -concurrency: - group: "pages" - cancel-in-progress: true - + workflow_call: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest env: # Directory that will be published on github pages PUBLISH_DIR: ./_build/html @@ -40,29 +28,10 @@ jobs: - name: Build docs run: jupyter book build . - - - name: Upload artifact - uses: actions/upload-pages-artifact@v1 + + - name: Upload documentation as artifact + uses: actions/upload-artifact@v3 with: + name: documentation path: ${{ env.PUBLISH_DIR }} - - - # Single deploy job since we're just deploying - deploy: - if: github.ref == 'refs/heads/main' - needs: build - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Pages - uses: actions/configure-pages@v2 - - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v1 + if-no-files-found: error \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..1382032 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,54 @@ +name: Deploy to Github pages + +on: + push: + branches: [main] + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + + + # Build documentation/website. Will be downloaded in first step + build-docs: + uses: ./.github/workflows/build_docs.yml + + deploy: + needs: [build-docs] + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Download docs artifact + # docs artifact is uploaded by build-docs job + uses: actions/download-artifact@v3 + with: + name: documentation + path: "./public" + + - name: Upload artifact + uses: actions/upload-pages-artifact@v1 + with: + path: "./public" + + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Setup Pages + uses: actions/configure-pages@v3 + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index df0e22f..d8b34da 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -42,12 +42,12 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + uses: docker/metadata-action@v4 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build and push Docker image - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . push: true diff --git a/_config.yml b/_config.yml index dd9b653..e1bd2a4 100644 --- a/_config.yml +++ b/_config.yml @@ -33,6 +33,7 @@ parse: sphinx: config: bibtex_bibfiles: ["docs/refs.bib"] + html_last_updated_fmt: "%b %d, %Y" extra_extensions: - 'sphinx.ext.autodoc' diff --git a/docs/logo.png b/docs/logo.png index ca31bd61af5ff5e967b25acffca1ddf41f6ae60c..dd93cac64c5888b7bc69d43032daad9de08c925e 100644 GIT binary patch literal 15269 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 F{9i<9hr$2= literal 3630 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 AC;$Ke