Skip to content

Commit 9ca5b4b

Browse files
committed
experimentally add conda-forge workflow
1 parent 2a16a65 commit 9ca5b4b

5 files changed

Lines changed: 428 additions & 51 deletions

File tree

Lines changed: 397 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,397 @@
1+
name: Conda package with conda-forge
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
pull_request:
8+
9+
permissions: read-all
10+
11+
env:
12+
PACKAGE_NAME: mkl_umath
13+
MODULE_NAME: mkl_umath
14+
TEST_ENV_NAME: test_mkl_umath
15+
VER_SCRIPT1: "import json; f = open('ver.json', 'r'); j = json.load(f); f.close(); d = j['mkl_umath'][0];"
16+
VER_SCRIPT2: "print('='.join((d[s] for s in ('version', 'build'))))"
17+
CONDA_BUILD_VERSION: 26.3.0
18+
19+
jobs:
20+
build_linux:
21+
runs-on: ubuntu-latest
22+
strategy:
23+
matrix:
24+
include:
25+
- python: "3.10"
26+
numpy: "2.2"
27+
- python: "3.11"
28+
numpy: "2.3"
29+
- python: "3.12"
30+
numpy: "2.3"
31+
- python: "3.13"
32+
numpy: "2.3"
33+
- python: "3.14"
34+
numpy: "2.3"
35+
steps:
36+
- name: Cancel Previous Runs
37+
uses: styfle/cancel-workflow-action@d07a454dad7609a92316b57b23c9ccfd4f59af66 # 0.13.1
38+
with:
39+
access_token: ${{ github.token }}
40+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
41+
with:
42+
fetch-depth: 0
43+
44+
- name: Set pkgs_dirs
45+
run: |
46+
echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
47+
48+
- name: Cache conda packages
49+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
50+
env:
51+
CACHE_NUMBER: 0 # Increase to reset cache
52+
with:
53+
path: ~/.conda/pkgs
54+
key:
55+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
56+
restore-keys: |
57+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
58+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
59+
60+
- name: Add conda to system path
61+
run: echo "$CONDA/bin" >> "$GITHUB_PATH"
62+
63+
- name: Update conda
64+
run: |
65+
conda update -n base --all
66+
67+
- name: Install conda-build
68+
run: conda install -n base conda-build=${{ env.CONDA_BUILD_VERSION }} -c conda-forge --override-channels
69+
70+
- name: Show Conda info
71+
run: |
72+
conda info --all
73+
74+
- name: List base environment packages
75+
run: |
76+
conda list -n base
77+
78+
- name: Build conda package
79+
run: |
80+
CHANNELS=(-c "conda-forge" --override-channels)
81+
VERSIONS=(--python "${{ matrix.python }}" --numpy "${{ matrix.numpy }}")
82+
TEST=(--no-test)
83+
echo "CONDA_BLD=${CONDA}/conda-bld/linux-64" >> "$GITHUB_ENV"
84+
85+
conda build \
86+
"${TEST[@]}" \
87+
"${VERSIONS[@]}" \
88+
"${CHANNELS[@]}" \
89+
conda-recipe-cf
90+
91+
- name: Upload artifact
92+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
93+
with:
94+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
95+
path: ${{ env.CONDA_BLD }}/${{ env.PACKAGE_NAME }}-*.conda
96+
97+
test_linux:
98+
needs: build_linux
99+
runs-on: ${{ matrix.runner }}
100+
101+
strategy:
102+
matrix:
103+
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
104+
numpy: ['numpy">=2"']
105+
experimental: [false]
106+
runner: [ubuntu-latest]
107+
continue-on-error: ${{ matrix.experimental }}
108+
env:
109+
CHANNELS: -c conda-forge --override-channels
110+
111+
steps:
112+
- name: Download artifact
113+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
114+
with:
115+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
116+
- name: Update conda
117+
run: |
118+
conda update -n base --all
119+
- name: Install conda-index
120+
run: |
121+
conda install -n base conda-index -c conda-forge --override-channels
122+
- name: Show Conda info
123+
run: |
124+
conda info --all
125+
- name: List base environment packages
126+
run: |
127+
conda list -n base
128+
- name: Add conda to system path
129+
run: echo "$CONDA/bin" >> "$GITHUB_PATH"
130+
- name: Create conda channel
131+
run: |
132+
mkdir -p "$GITHUB_WORKSPACE/channel/linux-64"
133+
mv "${PACKAGE_NAME}"-*.conda "$GITHUB_WORKSPACE/channel/linux-64"
134+
conda index "$GITHUB_WORKSPACE/channel"
135+
# Test channel
136+
conda search "$PACKAGE_NAME" -c "$GITHUB_WORKSPACE/channel" --override-channels
137+
- name: Test conda channel
138+
run: |
139+
conda search "$PACKAGE_NAME" -c "$GITHUB_WORKSPACE"/channel --override-channels --info --json > "$GITHUB_WORKSPACE"/ver.json
140+
cat "$GITHUB_WORKSPACE"/ver.json
141+
- name: Collect dependencies
142+
run: |
143+
CHANNELS=(-c "$GITHUB_WORKSPACE/channel" -c "conda-forge" --override-channels)
144+
PACKAGE_VERSION="$(python -c "${VER_SCRIPT1} ${VER_SCRIPT2}")"
145+
conda create -n "${{ env.TEST_ENV_NAME }}" "${PACKAGE_NAME}=${PACKAGE_VERSION}" "python=${{ matrix.python }}" ${{ matrix.numpy }} "${CHANNELS[@]}" --only-deps --dry-run > lockfile
146+
- name: Display lockfile
147+
run: cat lockfile
148+
149+
- name: Set pkgs_dirs
150+
run: |
151+
echo "pkgs_dirs: [~/.conda/pkgs]" >> ~/.condarc
152+
153+
- name: Cache conda packages
154+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
155+
env:
156+
CACHE_NUMBER: 0 # Increase to reset cache
157+
with:
158+
path: ~/.conda/pkgs
159+
key:
160+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
161+
restore-keys: |
162+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
163+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
164+
165+
- name: Install mkl_umath
166+
run: |
167+
CHANNELS=(-c "$GITHUB_WORKSPACE/channel" -c "conda-forge" --override-channels)
168+
PACKAGE_VERSION="$(python -c "${VER_SCRIPT1} ${VER_SCRIPT2}")"
169+
conda create -n "${{ env.TEST_ENV_NAME }}" "python=${{ matrix.python }}" ${{ matrix.numpy }} "$PACKAGE_NAME=${PACKAGE_VERSION}" pytest "${CHANNELS[@]}"
170+
# Test installed packages
171+
conda list -n "${{ env.TEST_ENV_NAME }}"
172+
173+
- name: Smoke test
174+
run: |
175+
source "$CONDA/etc/profile.d/conda.sh"
176+
conda activate "${{ env.TEST_ENV_NAME }}"
177+
python -c "import mkl_umath, numpy as np; mkl_umath.patch_numpy_umath(); np.sin(np.linspace(0, 1, num=10**6));"
178+
179+
- name: Run tests
180+
run: |
181+
source "$CONDA/etc/profile.d/conda.sh"
182+
conda activate "${{ env.TEST_ENV_NAME }}"
183+
pytest -v --pyargs ${{ env.MODULE_NAME }}
184+
185+
build_windows:
186+
runs-on: windows-latest
187+
188+
strategy:
189+
matrix:
190+
include:
191+
- python: "3.10"
192+
numpy: "2.2"
193+
- python: "3.11"
194+
numpy: "2.3"
195+
- python: "3.12"
196+
numpy: "2.3"
197+
- python: "3.13"
198+
numpy: "2.3"
199+
- python: "3.14"
200+
numpy: "2.3"
201+
env:
202+
conda-bld: C:\Miniconda\conda-bld\win-64\
203+
steps:
204+
- name: Cancel Previous Runs
205+
uses: styfle/cancel-workflow-action@d07a454dad7609a92316b57b23c9ccfd4f59af66 # 0.13.1
206+
with:
207+
access_token: ${{ github.token }}
208+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
209+
with:
210+
fetch-depth: 0
211+
212+
- uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1
213+
with:
214+
auto-update-conda: true
215+
miniforge-version: latest
216+
activate-environment: build
217+
channels: conda-forge
218+
python-version: ${{ matrix.python }}
219+
conda-build-version: ${{ env.CONDA_BUILD_VERSION }}
220+
221+
- name: Cache conda packages
222+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
223+
env:
224+
CACHE_NUMBER: 3 # Increase to reset cache
225+
with:
226+
path: /home/runner/conda_pkgs_dir
227+
key:
228+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('**/meta.yaml') }}
229+
restore-keys: |
230+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
231+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
232+
233+
- name: Store conda paths as envs
234+
shell: bash -l {0}
235+
run: |
236+
echo "CONDA_BLD=$CONDA/conda-bld/win-64/" | tr "\\\\" '/' >> "$GITHUB_ENV"
237+
238+
- name: Install conda build
239+
run: |
240+
conda activate
241+
conda install -y conda-build
242+
conda list -n base
243+
244+
- name: Build conda package
245+
run: |
246+
conda activate
247+
conda build --no-test --python ${{ matrix.python }} --numpy ${{ matrix.numpy }} -c conda-forge --override-channels conda-recipe-cf
248+
249+
- name: Upload artifact
250+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
251+
with:
252+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
253+
path: ${{ env.CONDA_BLD }}${{ env.PACKAGE_NAME }}-*.conda
254+
255+
test_windows:
256+
needs: build_windows
257+
runs-on: ${{ matrix.runner }}
258+
defaults:
259+
run:
260+
shell: cmd /C CALL {0}
261+
strategy:
262+
matrix:
263+
python: ["3.10", "3.11", "3.12", "3.13", "3.14"]
264+
numpy: ['numpy">=2"']
265+
experimental: [false]
266+
runner: [windows-latest]
267+
continue-on-error: ${{ matrix.experimental }}
268+
env:
269+
workdir: '${{ github.workspace }}'
270+
CHANNELS: -c conda-forge --override-channels
271+
272+
steps:
273+
- name: Download artifact
274+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
275+
with:
276+
name: ${{ env.PACKAGE_NAME }} ${{ runner.os }} Python ${{ matrix.python }}
277+
278+
- uses: conda-incubator/setup-miniconda@8ee1f361103df19b6f8c8655fd3967a8ecb162d5 # v4.0.1
279+
with:
280+
auto-update-conda: true
281+
miniforge-version: latest
282+
activate-environment: ${{ env.TEST_ENV_NAME }}
283+
channels: conda-forge
284+
conda-remove-defaults: "true"
285+
python-version: ${{ matrix.python }}
286+
287+
- name: Install conda-index
288+
run: |
289+
conda install -n base conda-index
290+
291+
- name: Show Conda info
292+
run: |
293+
conda info --all
294+
295+
- name: List base environment packages
296+
run: |
297+
conda list -n base
298+
299+
- name: Create conda channel with the artifact bit
300+
shell: cmd /C CALL {0}
301+
run: |
302+
echo ${{ env.workdir }}
303+
mkdir ${{ env.workdir }}\channel
304+
mkdir ${{ env.workdir }}\channel\win-64
305+
move ${{ env.PACKAGE_NAME }}-*.conda ${{ env.workdir }}\channel\win-64
306+
dir ${{ env.workdir }}\channel\win-64
307+
308+
- name: Index the channel
309+
shell: cmd /C CALL {0}
310+
run: |
311+
conda index ${{ env.workdir }}\channel
312+
313+
- name: Dump mkl_umath version info from created channel to STDOUT
314+
shell: cmd /C CALL {0}
315+
run: |
316+
conda search ${{ env.PACKAGE_NAME }} -c ${{ env.workdir }}/channel --override-channels --info --json
317+
318+
- name: Dump mkl_umath version info from created channel into ver.json
319+
shell: cmd /C CALL {0}
320+
run: |
321+
conda search ${{ env.PACKAGE_NAME }} -c ${{ env.workdir }}/channel --override-channels --info --json > ${{ env.workdir }}\ver.json
322+
323+
- name: Output content of workdir
324+
shell: pwsh
325+
run: Get-ChildItem -Path ${{ env.workdir }}
326+
327+
- name: Output content of produced ver.json
328+
shell: pwsh
329+
run: Get-Content -Path ${{ env.workdir }}\ver.json
330+
331+
- name: Collect dependencies
332+
shell: cmd /C CALL {0}
333+
run: |
334+
@ECHO ON
335+
IF NOT EXIST ver.json (
336+
copy /Y ${{ env.workdir }}\ver.json .
337+
)
338+
SET "SCRIPT=%VER_SCRIPT1% %VER_SCRIPT2%"
339+
FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "%SCRIPT%"`) DO (
340+
SET PACKAGE_VERSION=%%F
341+
)
342+
conda install -n ${{ env.TEST_ENV_NAME }} ${{ env.PACKAGE_NAME }}=%PACKAGE_VERSION% python=${{ matrix.python }} ${{ matrix.numpy }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }} --only-deps --dry-run > lockfile
343+
344+
- name: Display lockfile content
345+
shell: pwsh
346+
run: Get-Content -Path .\lockfile
347+
348+
- name: Cache conda packages
349+
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
350+
env:
351+
CACHE_NUMBER: 0 # Increase to reset cache
352+
with:
353+
path: /home/runner/conda_pkgs_dir
354+
key:
355+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-${{hashFiles('lockfile') }}
356+
restore-keys: |
357+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-python-${{ matrix.python }}-
358+
${{ runner.os }}-conda-${{ env.CACHE_NUMBER }}-
359+
360+
# add intel-openmp as an explicit dependency
361+
# to avoid it being missed when package version is specified exactly
362+
- name: Install mkl_umath
363+
shell: cmd /C CALL {0}
364+
run: |
365+
@ECHO ON
366+
IF NOT EXIST ver.json (
367+
copy /Y ${{ env.workdir }}\ver.json .
368+
)
369+
set "SCRIPT=%VER_SCRIPT1% %VER_SCRIPT2%"
370+
FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "%SCRIPT%"`) DO (
371+
SET PACKAGE_VERSION=%%F
372+
)
373+
SET "TEST_DEPENDENCIES=pytest pytest-cov"
374+
SET "WORKAROUND_DEPENDENCIES=intel-openmp"
375+
SET "DEPENDENCIES=%TEST_DEPENDENCIES% %WORKAROUND_DEPENDENCIES%"
376+
conda install -n ${{ env.TEST_ENV_NAME }} ${{ env.PACKAGE_NAME }}=%PACKAGE_VERSION% %DEPENDENCIES% python=${{ matrix.python }} ${{ matrix.numpy }} -c ${{ env.workdir }}/channel ${{ env.CHANNELS }}
377+
378+
- name: Report content of test environment
379+
shell: cmd /C CALL {0}
380+
run: |
381+
conda activate
382+
echo "Value of CONDA environment variable was: " %CONDA%
383+
echo "Value of CONDA_PREFIX environment variable was: " %CONDA_PREFIX%
384+
conda info && conda list -n ${{ env.TEST_ENV_NAME }}
385+
386+
- name: Smoke test
387+
shell: cmd /C CALL {0}
388+
run: |
389+
@ECHO ON
390+
conda activate ${{ env.TEST_ENV_NAME }}
391+
python -c "import mkl_umath, numpy as np; mkl_umath.patch_numpy_umath(); np.sin(np.linspace(0, 1, num=10**6));"
392+
393+
- name: Run tests
394+
shell: cmd /C CALL {0}
395+
run: |
396+
conda activate ${{ env.TEST_ENV_NAME }}
397+
python -m pytest -v -s --pyargs ${{ env.MODULE_NAME }}

0 commit comments

Comments
 (0)