Repository navigation
197 lines (190 loc) · 8.93 KB
/
Copy pathbackfill-docs.yml
File metadata and controls
197 lines (190 loc) · 8.93 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
name: Backfill documentation
on:
workflow_dispatch:
inputs:
tag:
description: 'Tag to backfill from'
required: true
type: string
python-version:
description: 'Python version to build with (default: the one recorded in the tag)'
required: false
type: string
compiler-version:
description: 'DPC++ version to build with (default: the one required by the tag)'
required: false
type: string
permissions:
contents: read
env:
CHECK_CONFIG_SCRIPT: "import sys; from packaging.version import parse; print('true' if parse('0.17.0') <= parse(sys.argv[1]) < parse('0.22.0') else 'false')"
# dpctl gained NumPy 2 support in 0.18.0dev1; earlier tags fail to build against it.
NUMPY_SPEC_SCRIPT: "import sys; from packaging.version import parse; print('numpy<2' if parse(sys.argv[1]) < parse('0.18.0dev1') else 'numpy')"
# Used only for tags that predate the docs workflow and so record no version.
DEFAULT_PYTHON_VERSION: '3.10'
jobs:
build-and-backfill:
name: Build and Backfill Documentation
runs-on: ubuntu-latest
timeout-minutes: 240
permissions:
contents: write
actions: write
steps:
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@d07a454dad7609a92316b57b23c9ccfd4f59af66 # 0.13.1
with:
access_token: ${{ github.token }}
- name: Add Intel repository
run: |
wget -qO- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" \
| sudo tee /etc/apt/sources.list.d/oneAPI.list
sudo apt update
- name: Checkout repo at tag
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.inputs.tag }}
fetch-depth: 0
persist-credentials: false
- name: Resolve DPC++ version for the tag
id: resolve-compiler
env:
TAG: ${{ github.event.inputs.tag }}
COMPILER_VERSION_INPUT: ${{ github.event.inputs.compiler-version }}
run: |
COMPILER_PACKAGE=intel-oneapi-compiler-dpcpp-cpp
if [[ -n "${COMPILER_VERSION_INPUT}" ]]; then
COMPILER_VERSION="${COMPILER_VERSION_INPUT}"
echo "Using DPC++ ${COMPILER_VERSION} requested via workflow input."
else
# build against compiler version declared in the conda recipe
COMPILER_VERSION=$(grep -oP 'required_compiler_version\s*=\s*"\K[^"]+' \
conda-recipe/meta.yaml 2>/dev/null | head -n 1 || true)
if [[ -z "${COMPILER_VERSION}" ]]; then
echo "${TAG} declares no required_compiler_version. Using the latest DPC++."
echo "package=${COMPILER_PACKAGE}" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "${TAG} requires DPC++ ${COMPILER_VERSION}."
fi
VERSIONED_PACKAGE="${COMPILER_PACKAGE}-$(cut -d. -f1,2 <<< "${COMPILER_VERSION}")"
if apt-cache show "${VERSIONED_PACKAGE}" > /dev/null 2>&1; then
COMPILER_PACKAGE="${VERSIONED_PACKAGE}"
echo "Installing ${COMPILER_PACKAGE}."
else
echo "::warning::${VERSIONED_PACKAGE} is not in the Intel apt repository. Using the latest DPC++ instead."
fi
echo "package=${COMPILER_PACKAGE}" >> "$GITHUB_OUTPUT"
- name: Install Intel OneAPI
env:
COMPILER_PACKAGE: ${{ steps.resolve-compiler.outputs.package }}
run: |
sudo apt install "${COMPILER_PACKAGE}"
sudo apt install intel-oneapi-tbb
sudo apt install intel-oneapi-umf
sudo apt install hwloc
- name: Install Lua
run: |
sudo apt-get install liblua5.2-dev
- name: Install Doxygen
run: |
sudo apt-get install doxygen
- name: Install Ninja
run: |
sudo apt-get install ninja-build
- name: Resolve Python version for the tag
id: resolve-python
env:
TAG: ${{ github.event.inputs.tag }}
PYTHON_VERSION_INPUT: ${{ github.event.inputs.python-version }}
run: |
if [[ -n "${PYTHON_VERSION_INPUT}" ]]; then
PYTHON_VERSION="${PYTHON_VERSION_INPUT}"
echo "Using Python ${PYTHON_VERSION} requested via workflow input."
else
# reuse pin from generate-docs.yml at the tag
PYTHON_VERSION=$(grep -oP "python-version:\s*'?\K[0-9]+\.[0-9]+" \
.github/workflows/generate-docs.yml 2>/dev/null | head -n 1 || true)
if [[ -z "${PYTHON_VERSION}" ]]; then
PYTHON_VERSION="${DEFAULT_PYTHON_VERSION}"
echo "${TAG} records no docs Python version; falling back to ${PYTHON_VERSION}."
else
echo "Using Python ${PYTHON_VERSION} as recorded at ${TAG}."
fi
fi
echo "python-version=${PYTHON_VERSION}" >> "$GITHUB_OUTPUT"
- name: Setup Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: ${{ steps.resolve-python.outputs.python-version }}
architecture: x64
- name: Install sphinx dependencies
shell: bash -l {0}
env:
TAG: ${{ github.event.inputs.tag }}
run: |
pip install packaging
NUMPY_SPEC=$(python -c "$NUMPY_SPEC_SCRIPT" "$TAG")
echo "Building against ${NUMPY_SPEC}."
pip install "${NUMPY_SPEC}" cython setuptools">=70.1" scikit-build cmake sphinx"<7.2" pydot graphviz furo \
sphinxcontrib-programoutput sphinxcontrib-googleanalytics sphinx-design \
sphinxcontrib-jsmath sphinx-copybutton sphinxcontrib-spelling \
versioneer[toml]==0.29
- name: Inject new docs configuration
shell: bash -l {0}
env:
TAG: ${{ github.event.inputs.tag }}
run: |
git fetch origin master
# a tag cannot list the versions released after it, so the version list
# behind the sidebar dropdown always has to come from master
git checkout origin/master -- docs/doc_versions.txt
NEEDS_CONFIG=$(python -c "$CHECK_CONFIG_SCRIPT" "$TAG")
if [[ "${NEEDS_CONFIG}" == "true" ]]; then
git checkout origin/master -- docs/doc_sources/conf.py.in \
docs/doc_sources/_templates/versions.html
else
echo "Tag already has the current docs template, only the version list was injected."
fi
- name: Build dpctl+docs
shell: bash -l {0}
run: |
# Ensure that SYCL libraries are on LD_LIBRARY_PATH
source /opt/intel/oneapi/setvars.sh
wget https://github.com/vovkos/doxyrest/releases/download/doxyrest-2.1.2/doxyrest-2.1.2-linux-amd64.tar.xz
tar xf doxyrest-2.1.2-linux-amd64.tar.xz
python setup.py build_ext --inplace --generator=Ninja --build-type=Release \
-- \
-DCMAKE_C_COMPILER:PATH="$(which icx)" \
-DCMAKE_CXX_COMPILER:PATH="$(which icpx)" \
-DDPCTL_GENERATE_DOCS=ON \
-DDPCTL_ENABLE_DOXYREST=ON \
-DDPCTL_USE_MULTIVERSION_TEMPLATE=ON \
-DDoxyrest_DIR="$(pwd)/doxyrest-2.1.2-linux-amd64" \
-DCMAKE_VERBOSE_MAKEFILE=ON
python -m pip install -e . --no-build-isolation --no-deps
python -c "import dpctl; print(dpctl.__version__)" || exit 1
pushd "$(find _skbuild -name cmake-build)" || exit 1
cmake --build . --target Sphinx || exit 1
mv ../cmake-install/docs/docs ~/docs
git clean -dfx
popd
git reset --hard
- name: Publish docs
env:
TAG: ${{ github.event.inputs.tag }}
shell: bash -l {0}
run: |
git remote add tokened_docs https://IntelPython:${{ secrets.GITHUB_TOKEN }}@github.com/IntelPython/dpctl.git
git fetch tokened_docs
git checkout --track tokened_docs/gh-pages
# replace the directory outright so a re-run cannot merge into stale docs
rm -rf "${TAG:?}"
mv ~/docs "${TAG}" || exit 1
git add --all "${TAG}"
git config user.name 'github-actions[doc-deploy-bot]'
git config user.email 'github-actions[doc-deploy-bot]@users.noreply.github.com'
git commit -m "Docs backfilled for ${TAG}."
git push tokened_docs gh-pages