Repository navigation
255 lines (237 loc) · 9.58 KB
/
Copy pathci_docs.yml
File metadata and controls
255 lines (237 loc) · 9.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# Build and deploy documentation
#
# This workflow builds the documentation on Linux/macOS/Windows.
#
# It is run on every commit to the main and pull request branches, and also when a new
# release is published. In draft pull requests, only the job on Linux is triggered to
# save on Continuous Integration resources.
#
# On the main branch, the workflow also handles the documentation deployment:
#
# * Updating the development documentation by pushing the built HTML pages from the main
# branch onto the dev folder of the gh-pages branch.
# * Updating the latest documentation link to the new release.
#
name: Docs
on:
push:
branches: [ main ]
paths:
- 'pygmt/**/*.py'
- '!pygmt/tests/**'
- 'doc/**'
- 'examples/**'
- 'README.md'
- '.github/workflows/ci_docs.yml'
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
paths:
- 'pygmt/**/*.py'
- '!pygmt/tests/**'
- 'doc/**'
- 'examples/**'
- 'README.md'
- '.github/workflows/ci_docs.yml'
workflow_dispatch:
release:
types:
- published
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
permissions:
contents: write
jobs:
docs:
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}
if: github.repository == 'GenericMappingTools/pygmt'
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
# Is it a draft Pull Request (true or false)?
isDraft:
- ${{ github.event.pull_request.draft }}
# Only run jobs on Ubuntu for draft PRs
exclude:
- os: macos-latest
isDraft: true
- os: windows-latest
isDraft: true
timeout-minutes: 30
defaults:
run:
shell: bash -l {0}
env:
# Tectonic cache directory.
# See https://tectonic-typesetting.github.io/book/latest/getting-started/first-document.html#cache.
TECTONIC_CACHE_DIR: ${{ github.workspace }}/.tectonic-cache
steps:
# Checkout current git repository
- name: Checkout
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Get current week number of year
id: date
run: echo "date=$(date +%Y-W%W)" >> $GITHUB_OUTPUT # e.g., 2024-W19
# Install Micromamba with conda-forge dependencies
- name: Setup Micromamba
uses: mamba-org/setup-micromamba@f457c30a868e4760d3a6fcea5f25dc655b8edf39 # v3.2.1
with:
environment-name: pygmt
cache-environment: true
# environment cache is persistent for one week.
cache-environment-key: micromamba-environment-${{ steps.date.outputs.date }}
create-args: >-
python=3.15
gmt=6.7.0
ghostscript=10.08.0
numpy
pandas
xarray
packaging
contextily
geopandas
ipython
pyarrow-core
rioxarray
make
pip
python-build
myst-nb
panel
sphinx>=6.2
sphinx-autodoc-typehints
sphinx-copybutton
sphinx-design
sphinx-gallery
sphinx_rtd_theme
cairosvg
sphinxcontrib-svg2pdfconverter
tectonic
# Download cached remote files (artifacts) from GitHub
- name: Download remote data from GitHub
uses: $/.github/actions/download-gmt-cache
# Install the package that we want to test
- name: Install the package
run: |
python -m build --sdist
python -m pip install dist/*
- name: Build the HTML documentation
env:
GMT_DATA_SERVER: https://opentopography.s3.sdsc.edu/gmtdata
run: |
log_file="${RUNNER_TEMP}/sphinx-html.log"
make -C doc clean html 2>&1 | tee "${log_file}"
exit_code=${PIPESTATUS[0]}
if [[ "${RUNNER_OS}" == "Windows" && "${exit_code}" -eq 2 ]] && grep -q "make: .* Error 2816" "${log_file}"; then
echo "Sphinx HTML build exited with make error 2816 (segmentation fault) on Windows; allowing workflow to continue."
exit 0
fi
exit "${exit_code}"
- name: Cache tectonic packages
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 # zizmor: ignore[cache-poisoning]
with:
path: ${{ env.TECTONIC_CACHE_DIR }}
# Cache is persistent for one week, same as the micromamba environment cache.
key: tectonic-${{ runner.os }}-${{ steps.date.outputs.date }}
# Fall back to the most recent cache so tectonic only downloads what's missing.
restore-keys: tectonic-${{ runner.os }}-
- name: Build the PDF documentation
env:
GMT_DATA_SERVER: https://opentopography.s3.sdsc.edu/gmtdata
run: |
log_file="${RUNNER_TEMP}/sphinx-pdf.log"
make -C doc pdf 2>&1 | tee "${log_file}"
exit_code=${PIPESTATUS[0]}
if [[ "${RUNNER_OS}" == "Windows" && "${exit_code}" -eq 2 ]] && grep -q "make: .* Error 2816" "${log_file}"; then
echo "Sphinx PDF build exited with make error 2816 (segmentation fault) on Windows; allowing workflow to continue."
exit 0
fi
- name: Create the HTML ZIP archive and rename the PDF file
run: |
cd doc/_build/
cp -r html/ pygmt-docs/
zip -r pygmt-docs.zip pygmt-docs/
mv latex/pygmt.pdf pygmt-docs.pdf
cd ../..
- name: Upload PDF as artifact for previewing on pull requests
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
if: github.event_name == 'pull_request' && matrix.os == 'ubuntu-latest'
with:
name: artifact-pygmt-docs-pdf
path: doc/_build/pygmt-docs.pdf
- name: Copy the HTML ZIP archive and PDF to the html folder
run: cp -v doc/_build/pygmt-docs.zip doc/_build/pygmt-docs.pdf doc/_build/html/
if: (github.event_name == 'push' || github.event_name == 'release') && matrix.os == 'ubuntu-latest'
- name: Upload the HTML ZIP archive and PDF as release assets
run: gh release upload ${REF_NAME} doc/_build/pygmt-docs.zip doc/_build/pygmt-docs.pdf
if: github.event_name == 'release' && matrix.os == 'ubuntu-latest'
env:
GH_TOKEN: ${{ github.token }}
REF_NAME: ${{ github.ref_name }}
- name: Checkout the gh-pages branch
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: gh-pages
# Checkout to this folder instead of the current one
path: deploy
persist-credentials: true
if: (github.event_name == 'release' || github.event_name == 'push') && (matrix.os == 'ubuntu-latest')
- name: Push the built HTML to gh-pages
run: |
# Detect if this is a release or from the main branch
if [[ "${GITHUB_EVENT_NAME}" == "release" ]]; then
# Get the tag name without the "refs/tags/" part
version="${GITHUB_REF#refs/*/}"
else
version=dev
fi
echo "Deploying version: $version"
# Make the new commit message. Needs to happen before cd into deploy
# to get the right commit hash.
message="Deploy $version from $(git rev-parse --short HEAD)"
cd deploy
# Create some files in the root directory.
# .nojekyll: Need to have this file so that GitHub doesn't try to run Jekyll
touch .nojekyll
# CNAME: Set the custom domain name
echo "www.pygmt.org" > CNAME
# index.html: Redirect to the latest version
echo '<meta http-equiv="Refresh" content="0;url=latest/"/>' > index.html
# Delete all the files and replace with our new set
echo -e "\nRemoving old files from previous builds of ${version}:"
rm -rvf ${version}
echo -e "\nCopying HTML files to ${version}:"
cp -Rvf ../doc/_build/html/ ${version}/
# If this is a new release, update the link from /latest to it
if [[ "${version}" != "dev" ]]; then
echo -e "\nSetup link from ${version} to 'latest'."
rm -f latest
ln -sf ${version} latest
fi
# Stage the commit
git add -A .
echo -e "\nChanges to be applied:"
git status
# Configure git to be the GitHub Actions account
git config user.email "github-actions[bot]@users.noreply.github.com"
git config user.name "github-actions[bot]"
# If this is a dev build and the last commit was from a dev build
# (detect if "dev" was in the previous commit message), reuse the
# same commit
if [[ "${version}" == "dev" && `git log -1 --format='%s'` == *"dev"* ]]; then
echo -e "\nAmending last commit:"
git commit --amend --reset-author -m "$message"
else
echo -e "\nMaking a new commit:"
git commit -m "$message"
fi
# Make the push quiet just in case there is anything that could leak
# sensitive information.
echo -e "\nPushing changes to gh-pages."
git push -fq origin gh-pages 2>&1 >/dev/null
echo -e "\nFinished uploading generated files."
if: (github.event_name == 'release' || github.event_name == 'push') && (matrix.os == 'ubuntu-latest')