Skip to content

Commit

Permalink
Merge pull request #105 from Ouranosinc/new-docker-build
Browse files Browse the repository at this point in the history
docker: new build for new XClim and to get Dask dashboard and Panel server app to work

# Overview

Still have to pin `dask` for performance and `shapely` for notebook error.

Dask dashboard and Panel server app work both by manually mapping `http://localhost:<PORT>` to `https://pavics.ouranos.ca/jupyter/user/<USER>/proxy/<PORT>` as seen in screenshots below:

![Screenshot from 2022-04-12 15-20-58](https://user-images.githubusercontent.com/11966697/163259294-97337abd-91e6-4832-b639-d7d2e89c353d.png) 

![Screenshot from 2022-04-12 16-29-06](https://user-images.githubusercontent.com/11966697/163264000-c2d0f993-8d4d-4eeb-8fa7-0cdce454c2f4.png)

The "Render with Panel" green button also works and avoid having to deal with manual URL rewrite:
![Screenshot from 2022-05-04 15-18-03](https://user-images.githubusercontent.com/11966697/166810160-f6989da4-6e8f-4407-8fd5-4ef71770e1f2.png)


## Relevant Changes

```diff
# new
>   - dask-labextension=5.2.0=pyhd8ed1ab_0
>   - jupyter-panel-proxy=0.2.0a2=py_0
>   - jupyter-server-proxy=3.2.1=pyhd8ed1ab_0

# removed, interfere with panel
<     - handcalcs==1.4.1

<   - xclim=0.34.0=pyhd8ed1ab_0
>   - xclim=0.36.0=pyhd8ed1ab_0

<   - cf_xarray=0.6.3=pyhd8ed1ab_0
>   - cf_xarray=0.7.2=pyhd8ed1ab_0

<   - clisops=0.8.0=pyh6c4a22f_0
>   - clisops=0.9.0=pyh6c4a22f_0

# downgrade by clisops
<   - pandas=1.4.1=py38h43a58ef_0
>   - pandas=1.3.5=py38h43a58ef_0

<   - rioxarray=0.10.3=pyhd8ed1ab_0
>   - rioxarray=0.11.1=pyhd8ed1ab_0

<   - nc-time-axis=1.4.0=pyhd8ed1ab_0
>   - nc-time-axis=1.4.1=pyhd8ed1ab_0

<   - roocs-utils=0.5.0=pyh6c4a22f_0
>   - roocs-utils=0.6.1=pyh6c4a22f_0

<   - panel=0.12.7=pyhd8ed1ab_0
>   - panel=0.13.1a2=py_0

<   - plotly=5.6.0=pyhd8ed1ab_0
>   - plotly=5.7.0=pyhd8ed1ab_0
```

## Related Issue / Discussion

- #99
- #100
- PR to deploy this new Jupyter env to PAVICS: bird-house/birdhouse-deploy#241
- bokeh/bokeh#12090
- holoviz/jupyter-panel-proxy#21
- holoviz/panel#3469
- holoviz/panel#3440

## Test

* Deployed as "beta" image in production for bokeh visualization performance regression testing.

* Manual test notebook https://github.com/Ouranosinc/PAVICS-landing/blob/master/content/notebooks/climate_indicators/PAVICStutorial_ClimateDataAnalysis-5Visualization.ipynb for bokeh visualization performance and it looks fine.

* Jenkins builds: only known subset-user-input.ipynb: ​RemoteDisconnected, `pavics/workflow-tests:220412`: 
  [job-PAVICS-e2e-workflow-tests-new-docker-build-17-consoleText.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8484558/job-PAVICS-e2e-workflow-tests-new-docker-build-17-consoleText.txt)
  [job-PAVICS-e2e-workflow-tests-new-docker-build-16-consoleText.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8484559/job-PAVICS-e2e-workflow-tests-new-docker-build-16-consoleText.txt)
  [job-PAVICS-e2e-workflow-tests-new-docker-build-15-consoleText.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8484560/job-PAVICS-e2e-workflow-tests-new-docker-build-15-consoleText.txt)

* Jenkins build: all passed, `pavics/workflow-tests:220522`:
climex.ipynb 2.5 mins, OK [job-PAVICS-e2e-workflow-tests-new-docker-build-39-consoleText.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8627256/job-PAVICS-e2e-workflow-tests-new-docker-build-39-consoleText.txt)
climex.ipynb 5 mins, Slow [job-PAVICS-e2e-workflow-tests-new-docker-build-41-consoleText.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8627258/job-PAVICS-e2e-workflow-tests-new-docker-build-41-consoleText.txt)
climex.ipynb 14 mins, VERY Slow [job-PAVICS-e2e-workflow-tests-new-docker-build-42-consoleText.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8627789/job-PAVICS-e2e-workflow-tests-new-docker-build-42-consoleText.txt)





## Additional Information

* Full diff `conda env export`:
[220401-220412-conda-env-export.diff.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8484573/220401-220412-conda-env-export.diff.txt)

  [220401-220502-conda-env-export.diff.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8627790/220401-220502-conda-env-export.diff.txt)

```
2a3
>   - pyviz/label/dev
8c9
<   - _openmp_mutex=4.5=1_gnu
---
>   - _openmp_mutex=4.5=2_gnu
10,11c11,12
<   - aiobotocore=2.1.2=pyhd8ed1ab_0
<   - aiohttp=3.8.1=py38h497a2fe_0
---
>   - aiobotocore=2.2.0=pyhd8ed1ab_0
>   - aiohttp=3.8.1=py38h0a891b7_1
15,16c16,17
<   - alsa-lib=1.2.3=h516909a_0
<   - ansi2html=1.7.0=py38h578d9bd_0
---
>   - alsa-lib=1.2.3.2=h166bdaf_0
>   - ansi2html=1.7.0=py38h578d9bd_1
20c21
<   - argon2-cffi-bindings=21.2.0=py38h497a2fe_1
---
>   - argon2-cffi-bindings=21.2.0=py38h0a891b7_2
30,31c31,32
<   - bcrypt=3.2.0=py38h497a2fe_2
<   - beautifulsoup4=4.10.0=pyha770c72_0
---
>   - bcrypt=3.2.2=py38h0a891b7_0
>   - beautifulsoup4=4.11.1=pyha770c72_0
34c35
<   - bleach=4.1.0=pyhd8ed1ab_0
---
>   - bleach=5.0.0=pyhd8ed1ab_0
36,37c37,38
<   - blosc=1.21.0=h9c3ff4c_0
<   - bokeh=2.4.2=py38h578d9bd_0
---
>   - blosc=1.21.1=hd32f23e_0
>   - bokeh=2.4.2=py38h578d9bd_1
40,41c41,42
<   - botocore=1.23.24=pyhd8ed1ab_0
<   - bottleneck=1.3.4=py38h3ec907f_0
---
>   - botocore=1.24.21=pyhd8ed1ab_1
>   - bottleneck=1.3.4=py38h71d37f0_1
43,46c44,47
<   - brotli=1.0.9=h7f98852_6
<   - brotli-bin=1.0.9=h7f98852_6
<   - brotli-python=1.0.9=py38h709712a_6
<   - brotlipy=0.7.0=py38h497a2fe_1003
---
>   - brotli=1.0.9=h166bdaf_7
>   - brotli-bin=1.0.9=h166bdaf_7
>   - brotli-python=1.0.9=py38hfa26641_7
>   - brotlipy=0.7.0=py38h0a891b7_1004
60c61
<   - cf_xarray=0.6.3=pyhd8ed1ab_0
---
>   - cf_xarray=0.7.2=pyhd8ed1ab_0
65c66
<   - cftime=1.6.0=py38h3ec907f_0
---
>   - cftime=1.6.0=py38h71d37f0_1
67c68
<   - click=8.1.2=py38h578d9bd_0
---
>   - click=8.1.3=py38h578d9bd_0
71c72
<   - clisops=0.8.0=pyh6c4a22f_0
---
>   - clisops=0.9.0=pyh6c4a22f_0
77,78c78,79
<   - cryptography=36.0.2=py38h2b5fc30_0
<   - curl=7.82.0=h7bff187_0
---
>   - cryptography=36.0.2=py38h2b5fc30_1
>   - curl=7.83.0=h7bff187_0
80c81
<   - cytoolz=0.11.2=py38h497a2fe_1
---
>   - cytoolz=0.11.2=py38h0a891b7_2
84c85,86
<   - datashader=0.13.0=pyh6c4a22f_0
---
>   - dask-labextension=5.2.0=pyhd8ed1ab_0
>   - datashader=0.14.0=pyh6c4a22f_0
87c89
<   - debugpy=1.5.1=py38h709712a_0
---
>   - debugpy=1.6.0=py38hfa26641_0
110,111c112,113
<   - flask=2.1.1=pyhd8ed1ab_0
<   - flask-compress=1.11=pyhd8ed1ab_0
---
>   - flask=2.1.2=pyhd8ed1ab_0
>   - flask-compress=1.12=pyhd8ed1ab_0
118c120
<   - fontconfig=2.13.96=h8e229c2_2
---
>   - fontconfig=2.14.0=h8e229c2_0
121c123
<   - fonttools=4.31.2=py38h0a891b7_0
---
>   - fonttools=4.33.3=py38h0a891b7_0
126c128
<   - fsspec=2022.2.0=pyhd8ed1ab_0
---
>   - fsspec=2022.3.0=pyhd8ed1ab_0
128c130
<   - future=0.18.2=py38h578d9bd_4
---
>   - future=0.18.2=py38h578d9bd_5
130c132
<   - gcsfs=2022.2.0=pyhd8ed1ab_0
---
>   - gcsfs=2022.3.0=pyhd8ed1ab_0
145c147
<   - google-auth=2.6.2=pyh6c4a22f_0
---
>   - google-auth=2.6.6=pyh6c4a22f_0
149c151
<   - google-crc32c=1.1.2=py38h8838a9a_2
---
>   - google-crc32c=1.1.2=py38h57c428a_3
152c154
<   - greenlet=1.1.2=py38h709712a_1
---
>   - greenlet=1.1.2=py38hfa26641_2
166c168
<   - identify=2.4.12=pyhd8ed1ab_0
---
>   - identify=2.5.0=pyhd8ed1ab_0
168,169c170,171
<   - imagecodecs-lite=2019.12.3=py38h6c62de6_4
<   - imageio=2.16.1=pyhcf75d05_0
---
>   - imagecodecs-lite=2019.12.3=py38h71d37f0_5
>   - imageio=2.18.0=pyhcf75d05_0
172c174
<   - importlib_resources=5.6.0=pyhd8ed1ab_0
---
>   - importlib_resources=5.7.1=pyhd8ed1ab_0
179,181c181,183
<   - ipykernel=6.11.0=py38h7f3c49e_0
<   - ipyleaflet=0.15.0=pyhd8ed1ab_3
<   - ipython=8.2.0=py38h578d9bd_0
---
>   - ipykernel=6.13.0=py38h7f3c49e_0
>   - ipyleaflet=0.16.0=pyhd8ed1ab_3
>   - ipython=8.3.0=py38h578d9bd_0
187c189
<   - jedi=0.18.1=py38h578d9bd_0
---
>   - jedi=0.18.1=py38h578d9bd_1
189c191
<   - jmespath=0.10.0=pyh9f0ad1d_0
---
>   - jmespath=1.0.0=pyhd8ed1ab_0
191c193
<   - jpeg=9e=h7f98852_0
---
>   - jpeg=9e=h166bdaf_1
197,198c199,201
<   - jupyter-archive=3.3.0=pyhd8ed1ab_1
<   - jupyter-dash=0.4.1=pyhd8ed1ab_2
---
>   - jupyter-archive=3.3.1=pyhd8ed1ab_0
>   - jupyter-dash=0.4.2=pyhd8ed1ab_1
>   - jupyter-panel-proxy=0.2.0a2=py_0
200a204
>   - jupyter-server-proxy=3.2.1=pyhd8ed1ab_0
202c206
<   - jupyter_client=7.2.1=pyhd8ed1ab_0
---
>   - jupyter_client=7.3.0=pyhd8ed1ab_0
205c209
<   - jupyter_server=1.16.0=pyhd8ed1ab_1
---
>   - jupyter_server=1.17.0=pyhd8ed1ab_0
207,210c211,214
<   - jupyterhub=2.2.2=hd8ed1ab_0
<   - jupyterhub-base=2.2.2=pyhd8ed1ab_0
<   - jupyterlab=3.3.2=pyhd8ed1ab_0
<   - jupyterlab-git=0.36.0=pyhd8ed1ab_0
---
>   - jupyterhub=2.2.2=pyhd8ed1ab_1
>   - jupyterhub-base=2.2.2=pyhd8ed1ab_1
>   - jupyterlab=3.3.4=pyhd8ed1ab_0
>   - jupyterlab-git=0.37.1=pyhd8ed1ab_0
213,214c217,218
<   - jupyterlab_pygments=0.1.2=pyh9f0ad1d_0
<   - jupyterlab_server=2.12.0=pyhd8ed1ab_0
---
>   - jupyterlab_pygments=0.2.2=pyhd8ed1ab_0
>   - jupyterlab_server=2.13.0=pyhd8ed1ab_1
216c220
<   - jupytext=1.13.7=pyhd0ecf6b_0
---
>   - jupytext=1.13.8=pyh4b9bcc7_0
219c223
<   - kiwisolver=1.4.2=py38h43d8883_0
---
>   - kiwisolver=1.4.2=py38h43d8883_1
221c225
<   - lazy-object-proxy=1.7.1=py38h497a2fe_0
---
>   - lazy-object-proxy=1.7.1=py38h0a891b7_1
227,231c231,235
<   - libblas=3.9.0=13_linux64_openblas
<   - libbrotlicommon=1.0.9=h7f98852_6
<   - libbrotlidec=1.0.9=h7f98852_6
<   - libbrotlienc=1.0.9=h7f98852_6
<   - libcblas=3.9.0=13_linux64_openblas
---
>   - libblas=3.9.0=14_linux64_openblas
>   - libbrotlicommon=1.0.9=h166bdaf_7
>   - libbrotlidec=1.0.9=h166bdaf_7
>   - libbrotlienc=1.0.9=h166bdaf_7
>   - libcblas=3.9.0=14_linux64_openblas
233c237
<   - libcf=1.0.3=py38h80f51ce_113
---
>   - libcf=1.0.3=py38h0c3d773_114
236c240
<   - libcurl=7.82.0=h7bff187_0
---
>   - libcurl=7.83.0=h7bff187_0
246c250
<   - libgcc-ng=11.2.0=h1d223b6_14
---
>   - libgcc-ng=11.2.0=h1d223b6_16
248,249c252,253
<   - libgfortran-ng=11.2.0=h69a702a_14
<   - libgfortran5=11.2.0=h5c6108e_14
---
>   - libgfortran-ng=11.2.0=h69a702a_16
>   - libgfortran5=11.2.0=h5c6108e_16
252c256
<   - libgomp=11.2.0=h1d223b6_14
---
>   - libgomp=11.2.0=h1d223b6_16
256c260
<   - liblapack=3.9.0=13_linux64_openblas
---
>   - liblapack=3.9.0=14_linux64_openblas
259c263
<   - libnetcdf=4.8.1=mpi_mpich_h319fa22_1
---
>   - libnetcdf=4.8.1=mpi_mpich_hcdf9059_2
263c267
<   - libopenblas=0.3.18=pthreads_h8fe5266_0
---
>   - libopenblas=0.3.20=pthreads_h78a6416_0
274c278
<   - libstdcxx-ng=11.2.0=he4da1e4_14
---
>   - libstdcxx-ng=11.2.0=he4da1e4_16
288,291c292,296
<   - llvmlite=0.38.0=py38h4630a5e_0
<   - locket=0.2.0=py_2
<   - lxml=4.8.0=py38h0a891b7_1
<   - lz4=3.1.10=py38hebdc3cf_0
---
>   - llvmlite=0.38.0=py38h38d86a4_1
>   - locket=1.0.0=pyhd8ed1ab_0
>   - loguru=0.6.0=py38h578d9bd_1
>   - lxml=4.8.0=py38h0a891b7_2
>   - lz4=4.0.0=py38h1bf946c_1
294c299
<   - mako=1.2.0=pyhd8ed1ab_0
---
>   - mako=1.2.0=pyhd8ed1ab_1
298c303
<   - markdown-it-py=1.1.0=pyhd8ed1ab_0
---
>   - markdown-it-py=2.1.0=pyhd8ed1ab_0
303a309
>   - mdurl=0.1.0=pyhd8ed1ab_0
308,309c314,315
<   - mpi4py=3.1.3=py38he865349_0
<   - mpich=4.0.1=h846660c_100
---
>   - mpi4py=3.1.3=py38h97ac3a3_1
>   - mpich=4.0.2=h846660c_100
311c317
<   - multidict=6.0.2=py38h497a2fe_0
---
>   - multidict=6.0.2=py38h0a891b7_1
315,316c321,322
<   - mysql-common=8.0.28=haf5c9bc_2
<   - mysql-libs=8.0.28=h28c427c_2
---
>   - mysql-common=8.0.29=haf5c9bc_0
>   - mysql-libs=8.0.29=h28c427c_0
319,320c325,327
<   - nbconvert=6.4.5=py38h578d9bd_0
<   - nbconvert-core=6.4.5=pyhd8ed1ab_1
---
>   - nbconvert=6.5.0=pyhd8ed1ab_0
>   - nbconvert-core=6.5.0=pyhd8ed1ab_0
>   - nbconvert-pandoc=6.5.0=pyhd8ed1ab_0
322c329
<   - nbformat=5.2.0=pyhd8ed1ab_0
---
>   - nbformat=5.3.0=pyhd8ed1ab_0
325,327c332,334
<   - nc-time-axis=1.4.0=pyhd8ed1ab_0
<   - ncurses=6.3=h9c3ff4c_0
<   - nest-asyncio=1.5.4=pyhd8ed1ab_0
---
>   - nc-time-axis=1.4.1=pyhd8ed1ab_0
>   - ncurses=6.3=h27087fc_1
>   - nest-asyncio=1.5.5=pyhd8ed1ab_0
332c339
<   - networkx=2.7.1=pyhd8ed1ab_1
---
>   - networkx=2.8=pyhd8ed1ab_0
335c342
<   - notebook=6.4.10=pyha770c72_0
---
>   - notebook=6.4.11=pyha770c72_0
341c348
<   - numpy=1.21.5=py38h87f13fb_0
---
>   - numpy=1.21.6=py38h1d589f8_0
343c350
<   - openblas=0.3.18=pthreads_h4748800_0
---
>   - openblas=0.3.20=pthreads_h320a7e8_0
351,352c358,359
<   - pandas=1.4.1=py38h43a58ef_0
<   - pandoc=2.17.1.1=ha770c72_0
---
>   - pandas=1.3.5=py38h43a58ef_0
>   - pandoc=2.18=ha770c72_0
354c361
<   - panel=0.12.7=pyhd8ed1ab_0
---
>   - panel=0.13.1a2=py_0
356c363
<   - paramiko=2.10.3=pyhd8ed1ab_0
---
>   - paramiko=2.10.4=pyhd8ed1ab_0
363,364c370,371
<   - pillow=9.0.1=py38h0ee0e06_2
<   - pint=0.18=pyhd8ed1ab_0
---
>   - pillow=9.1.0=py38h0ee0e06_2
>   - pint=0.19.2=pyhd8ed1ab_0
368c375
<   - plotly=5.6.0=pyhd8ed1ab_0
---
>   - plotly=5.7.0=pyhd8ed1ab_0
374c381
<   - pre-commit=2.17.0=py38h578d9bd_0
---
>   - pre-commit=2.18.1=py38h578d9bd_1
376,378c383,385
<   - prometheus_client=0.13.1=pyhd8ed1ab_0
<   - prompt-toolkit=3.0.27=pyha770c72_0
<   - prompt_toolkit=3.0.27=hd8ed1ab_0
---
>   - prometheus_client=0.14.1=pyhd8ed1ab_0
>   - prompt-toolkit=3.0.29=pyha770c72_0
>   - prompt_toolkit=3.0.29=hd8ed1ab_0
380c387
<   - protobuf=3.20.0=py38hfa26641_0
---
>   - protobuf=3.20.0=py38hfa26641_4
382c389
<   - psutil=5.9.0=py38h497a2fe_0
---
>   - psutil=5.9.0=py38h0a891b7_1
392,393c399,400
<   - pycurl=7.45.1=py38h61f0cdf_0
<   - pydantic=1.9.0=py38h497a2fe_0
---
>   - pycurl=7.45.1=py38h61f0cdf_1
>   - pydantic=1.9.0=py38h0a891b7_1
396c403
<   - pygments=2.11.2=pyhd8ed1ab_0
---
>   - pygments=2.12.0=pyhd8ed1ab_0
398c405
<   - pynacl=1.5.0=py38h497a2fe_0
---
>   - pynacl=1.5.0=py38h0a891b7_1
400c407
<   - pyparsing=3.0.7=pyhd8ed1ab_0
---
>   - pyparsing=3.0.8=pyhd8ed1ab_0
407,410c414,417
<   - pyrsistent=0.18.1=py38h497a2fe_0
<   - pyshp=2.2.0=pyhd8ed1ab_0
<   - pysocks=1.7.1=py38h578d9bd_4
<   - pytest=7.1.1=py38h578d9bd_1
---
>   - pyrsistent=0.18.1=py38h0a891b7_1
>   - pyshp=2.3.0=pyhd8ed1ab_0
>   - pysocks=1.7.1=py38h578d9bd_5
>   - pytest=7.1.2=py38h578d9bd_0
413c420,421
<   - python-eccodes=1.4.0=py38h71d37f0_0
---
>   - python-eccodes=1.4.0=py38h71d37f0_1
>   - python-fastjsonschema=2.15.3=pyhd8ed1ab_0
419c427
<   - pywavelets=1.3.0=py38h3ec907f_0
---
>   - pywavelets=1.3.0=py38h71d37f0_1
421c429
<   - pyzmq=22.3.0=py38h2035c66_1
---
>   - pyzmq=22.3.0=py38hfc09fa9_2
425c433
<   - qtpy=2.0.1=pyhd8ed1ab_0
---
>   - qtpy=2.1.0=pyhd8ed1ab_0
434,435c442,443
<   - rioxarray=0.10.3=pyhd8ed1ab_0
<   - roocs-utils=0.5.0=pyh6c4a22f_0
---
>   - rioxarray=0.11.1=pyhd8ed1ab_0
>   - roocs-utils=0.6.1=pyh6c4a22f_0
437,440c445,448
<   - rtree=0.9.7=py38h02d302b_3
<   - ruamel.yaml=0.17.21=py38h497a2fe_0
<   - ruamel.yaml.clib=0.2.6=py38h497a2fe_0
<   - s3fs=2022.2.0=pyhd8ed1ab_1
---
>   - rtree=1.0.0=py38h02d302b_1
>   - ruamel.yaml=0.17.21=py38h0a891b7_1
>   - ruamel.yaml.clib=0.2.6=py38h0a891b7_1
>   - s3fs=2022.3.0=pyhd8ed1ab_0
446a455
>   - setuptools=59.8.0=py38h578d9bd_1
447a457
>   - simpervisor=0.4=pyhd8ed1ab_0
450a461
>   - snappy=1.1.8=he1b5a44_3
456,457c467,468
<   - sqlalchemy=1.4.33=py38h0a891b7_0
<   - sqlite=3.37.1=h4ff8645_0
---
>   - sqlalchemy=1.4.36=py38h0a891b7_0
>   - sqlite=3.38.3=h4ff8645_0
462,463c473
<   - terminado=0.13.3=py38h578d9bd_0
<   - testpath=0.6.0=pyhd8ed1ab_0
---
>   - terminado=0.13.3=py38h578d9bd_1
467a478
>   - tinycss2=1.1.1=pyhd8ed1ab_0
473c484
<   - tqdm=4.63.1=pyhd8ed1ab_0
---
>   - tqdm=4.64.0=pyhd8ed1ab_0
476c487
<   - trio=0.20.0=py38h578d9bd_0
---
>   - trio=0.20.0=py38h578d9bd_1
478,479c489,490
<   - typing-extensions=4.1.1=hd8ed1ab_0
<   - typing_extensions=4.1.1=pyha770c72_0
---
>   - typing-extensions=4.2.0=hd8ed1ab_1
>   - typing_extensions=4.2.0=pyha770c72_1
482,483c493,494
<   - ukkonen=1.0.1=py38h1fd1430_1
<   - unicodedata2=14.0.0=py38h497a2fe_0
---
>   - ukkonen=1.0.1=py38h43d8883_2
>   - unicodedata2=14.0.0=py38h0a891b7_1
485c496
<   - virtualenv=20.14.0=py38h578d9bd_1
---
>   - virtualenv=20.14.1=py38h578d9bd_0
491,492c502,503
<   - websockets=10.2=py38h0a891b7_0
<   - werkzeug=2.1.0=pyhd8ed1ab_0
---
>   - websockets=10.3=py38h0a891b7_0
>   - werkzeug=2.1.2=pyhd8ed1ab_0
496c507
<   - wrapt=1.14.0=py38h0a891b7_0
---
>   - wrapt=1.14.1=py38h0a891b7_0
499c510
<   - xclim=0.34.0=pyhd8ed1ab_0
---
>   - xclim=0.36.0=pyhd8ed1ab_0
502,503c513,514
<   - xeus=2.4.0=hab3612f_0
<   - xeus-python=0.13.6=py38h9f61dbb_2
---
>   - xeus=2.4.1=h70bab47_0
>   - xeus-python=0.13.7=py38h9f61dbb_0
531c542
<   - xyzservices=2022.3.0=pyhd8ed1ab_0
---
>   - xyzservices=2022.4.0=pyhd8ed1ab_0
534,535c545,546
<   - yarl=1.7.2=py38h497a2fe_1
<   - zarr=2.11.1=pyhd8ed1ab_0
---
>   - yarl=1.7.2=py38h0a891b7_2
>   - zarr=2.11.3=pyhd8ed1ab_0
537,538c548,549
<   - zict=2.1.0=pyhd8ed1ab_0
<   - zipp=3.7.0=pyhd8ed1ab_1
---
>   - zict=2.2.0=pyhd8ed1ab_0
>   - zipp=3.8.0=pyhd8ed1ab_0
545,546d555
<     - handcalcs==1.4.1
<     - innerscope==0.5.1
550d558
<     - more-itertools==8.12.0
555d562
<     - setuptools==61.3.0
```


* Full new `conda env export`:
[220412-conda-env-export.yml.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8484577/220412-conda-env-export.yml.txt)

  [220502-conda-env-export.yml.txt](https://github.com/Ouranosinc/PAVICS-e2e-workflow-tests/files/8627792/220502-conda-env-export.yml.txt)

```
name: birdy
channels:
  - pyviz/label/dev
  - cdat
  - conda-forge
  - defaults
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=2_gnu
  - affine=2.3.1=pyhd8ed1ab_0
  - aiobotocore=2.2.0=pyhd8ed1ab_0
  - aiohttp=3.8.1=py38h0a891b7_1
  - aioitertools=0.10.0=pyhd8ed1ab_0
  - aiosignal=1.2.0=pyhd8ed1ab_0
  - alembic=1.7.7=pyhd8ed1ab_0
  - alsa-lib=1.2.3.2=h166bdaf_0
  - ansi2html=1.7.0=py38h578d9bd_1
  - anyio=3.5.0=py38h578d9bd_0
  - appdirs=1.4.4=pyh9f0ad1d_0
  - argon2-cffi=21.3.0=pyhd8ed1ab_0
  - argon2-cffi-bindings=21.2.0=py38h0a891b7_2
  - asciitree=0.3.3=py_2
  - asttokens=2.0.5=pyhd8ed1ab_0
  - async-timeout=4.0.2=pyhd8ed1ab_0
  - async_generator=1.10=py_0
  - attrs=21.4.0=pyhd8ed1ab_0
  - babel=2.9.1=pyh44b312d_0
  - backcall=0.2.0=pyh9f0ad1d_0
  - backports=1.0=py_2
  - backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0
  - bcrypt=3.2.2=py38h0a891b7_0
  - beautifulsoup4=4.11.1=pyha770c72_0
  - bias_correction=0.4=pyhd8ed1ab_0
  - birdy=0.8.1=pyh6c4a22f_1
  - bleach=5.0.0=pyhd8ed1ab_0
  - blinker=1.4=py_1
  - blosc=1.21.1=hd32f23e_0
  - bokeh=2.4.2=py38h578d9bd_1
  - boltons=21.0.0=pyhd8ed1ab_0
  - boost-cpp=1.74.0=h312852a_4
  - botocore=1.24.21=pyhd8ed1ab_1
  - bottleneck=1.3.4=py38h71d37f0_1
  - branca=0.4.2=pyhd8ed1ab_0
  - brotli=1.0.9=h166bdaf_7
  - brotli-bin=1.0.9=h166bdaf_7
  - brotli-python=1.0.9=py38hfa26641_7
  - brotlipy=0.7.0=py38h0a891b7_1004
  - bzip2=1.0.8=h7f98852_4
  - c-ares=1.18.1=h7f98852_0
  - ca-certificates=2021.10.8=ha878542_0
  - cached-property=1.5.2=hd8ed1ab_1
  - cached_property=1.5.2=pyha770c72_1
  - cachetools=5.0.0=pyhd8ed1ab_0
  - cairo=1.16.0=h6cf1ce9_1008
  - cartopy=0.20.1=py38hf9a4893_1
  - cdat_info=8.2.1=pyhd8ed1ab_2
  - cdms2=3.1.5=py38hc1ef740_14
  - cdtime=3.1.4=py38hc54c017_7
  - certifi=2021.10.8=py38h578d9bd_2
  - certipy=0.1.3=py_0
  - cf_xarray=0.7.2=pyhd8ed1ab_0
  - cffi=1.15.0=py38h3931269_0
  - cfgrib=0.9.10.1=pyhd8ed1ab_0
  - cfgv=3.3.1=pyhd8ed1ab_0
  - cfitsio=3.470=hb418390_7
  - cftime=1.6.0=py38h71d37f0_1
  - charset-normalizer=2.0.12=pyhd8ed1ab_0
  - click=8.1.3=py38h578d9bd_0
  - click-plugins=1.1.1=py_0
  - cligj=0.7.2=pyhd8ed1ab_1
  - climpred=2.2.0=pyhd8ed1ab_0
  - clisops=0.9.0=pyh6c4a22f_0
  - cloudpickle=2.0.0=pyhd8ed1ab_0
  - colorama=0.4.4=pyh9f0ad1d_0
  - colorcet=3.0.0=pyhd8ed1ab_0
  - configurable-http-proxy=4.5.0=node16_h3b247e2_2
  - coverage=6.3.2=py38h0a891b7_2
  - cryptography=36.0.2=py38h2b5fc30_1
  - curl=7.83.0=h7bff187_0
  - cycler=0.11.0=pyhd8ed1ab_0
  - cytoolz=0.11.2=py38h0a891b7_2
  - dash=2.3.1=pyhd8ed1ab_0
  - dask=2022.1.0=pyhd8ed1ab_0
  - dask-core=2022.1.0=pyhd8ed1ab_0
  - dask-labextension=5.2.0=pyhd8ed1ab_0
  - datashader=0.14.0=pyh6c4a22f_0
  - datashape=0.5.4=py_1
  - dbus=1.13.6=h5008d03_3
  - debugpy=1.6.0=py38hfa26641_0
  - decorator=5.1.1=pyhd8ed1ab_0
  - defusedxml=0.7.1=pyhd8ed1ab_0
  - descartes=1.1.0=py_4
  - distarray=2.12.2=pyhd8ed1ab_2
  - distlib=0.3.4=pyhd8ed1ab_0
  - distributed=2022.1.0=py38h578d9bd_0
  - docopt=0.6.2=py_1
  - docrep=0.3.2=pyh44b312d_0
  - eccodes=2.25.0=hc08acdf_0
  - elfutils=0.186=he364ef2_0
  - entrypoints=0.4=pyhd8ed1ab_0
  - eofs=1.4.0=py_0
  - esgf-compute-api=2.3.9=0_h1234567_
  - esmf=8.2.0=mpi_mpich_h4975321_100
  - esmpy=8.2.0=mpi_mpich_py38h9147699_101
  - executing=0.8.3=pyhd8ed1ab_0
  - expat=2.4.8=h27087fc_0
  - fasteners=0.17.3=pyhd8ed1ab_0
  - fastprogress=1.0.2=pyhd8ed1ab_0
  - filelock=3.6.0=pyhd8ed1ab_0
  - findlibs=0.0.2=pyhd8ed1ab_0
  - fiona=1.8.20=py38hbb147eb_2
  - flask=2.1.2=pyhd8ed1ab_0
  - flask-compress=1.12=pyhd8ed1ab_0
  - flit-core=3.7.1=pyhd8ed1ab_0
  - folium=0.12.1.post1=pyhd8ed1ab_1
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=hab24e00_0
  - fontconfig=2.14.0=h8e229c2_0
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - fonttools=4.33.3=py38h0a891b7_0
  - freeglut=3.2.2=h9c3ff4c_1
  - freetype=2.10.4=h0708190_1
  - freexl=1.0.6=h7f98852_0
  - frozenlist=1.3.0=py38h0a891b7_1
  - fsspec=2022.3.0=pyhd8ed1ab_0
  - funcsigs=1.0.2=py_3
  - future=0.18.2=py38h578d9bd_5
  - g2clib=1.6.3=heb9ad7a_1
  - gcsfs=2022.3.0=pyhd8ed1ab_0
  - gdal=3.3.3=py38hcf2042a_0
  - geckodriver=0.30.0=h3146498_0
  - geopandas=0.10.2=pyhd8ed1ab_1
  - geopandas-base=0.10.2=pyha770c72_1
  - geos=3.9.1=h9c3ff4c_2
  - geotiff=1.7.0=hcfb7246_3
  - geoviews=1.9.5=pyhd8ed1ab_0
  - geoviews-core=1.9.5=pyha770c72_0
  - gettext=0.19.8.1=h73d1719_1008
  - giflib=5.2.1=h36c2ea0_2
  - gitdb=4.0.9=pyhd8ed1ab_0
  - gitpython=3.1.27=pyhd8ed1ab_0
  - gnutls=3.6.13=h85f3911_1
  - google-api-core=2.5.0=pyhd8ed1ab_0
  - google-auth=2.6.6=pyh6c4a22f_0
  - google-auth-oauthlib=0.5.1=pyhd8ed1ab_0
  - google-cloud-core=2.2.2=pyh6c4a22f_0
  - google-cloud-storage=2.1.0=pyh6c4a22f_0
  - google-crc32c=1.1.2=py38h57c428a_3
  - google-resumable-media=2.1.0=pyh6c4a22f_0
  - googleapis-common-protos=1.56.0=py38h578d9bd_0
  - greenlet=1.1.2=py38hfa26641_2
  - grpcio=1.45.0=py38ha0cdfde_0
  - gst-plugins-base=1.18.5=hf529b03_3
  - gstreamer=1.18.5=h9f60fe5_3
  - h11=0.13.0=pyhd8ed1ab_0
  - h5netcdf=1.0.0=pyhd8ed1ab_0
  - h5py=3.6.0=nompi_py38hfbb2109_100
  - haversine=2.5.1=pyhd8ed1ab_0
  - hdf4=4.2.15=h10796ff_3
  - hdf5=1.12.1=mpi_mpich_h08b82f9_4
  - heapdict=1.0.1=py_0
  - holoviews=1.14.8=pyhd8ed1ab_0
  - hvplot=0.7.3=pyh6c4a22f_0
  - icu=68.2=h9c3ff4c_0
  - identify=2.5.0=pyhd8ed1ab_0
  - idna=3.3=pyhd8ed1ab_0
  - imagecodecs-lite=2019.12.3=py38h71d37f0_5
  - imageio=2.18.0=pyhcf75d05_0
  - importlib-metadata=4.11.3=py38h578d9bd_1
  - importlib_metadata=4.11.3=hd8ed1ab_1
  - importlib_resources=5.7.1=pyhd8ed1ab_0
  - iniconfig=1.1.1=pyh9f0ad1d_0
  - intake=0.6.5=pyhd8ed1ab_0
  - intake-esm=2021.8.17=pyhd8ed1ab_0
  - intake-geopandas=0.4.0=pyhd8ed1ab_0
  - intake-thredds=2021.6.16=pyhd8ed1ab_0
  - intake-xarray=0.6.0=pyhd8ed1ab_0
  - ipykernel=6.13.0=py38h7f3c49e_0
  - ipyleaflet=0.16.0=pyhd8ed1ab_3
  - ipython=8.3.0=py38h578d9bd_0
  - ipython_genutils=0.2.0=py_1
  - ipywidgets=7.7.0=pyhd8ed1ab_0
  - itsdangerous=2.1.2=pyhd8ed1ab_0
  - jasper=2.0.33=ha77e612_0
  - jbig=2.1=h7f98852_2003
  - jedi=0.18.1=py38h578d9bd_1
  - jinja2=3.1.1=pyhd8ed1ab_0
  - jmespath=1.0.0=pyhd8ed1ab_0
  - joblib=1.1.0=pyhd8ed1ab_0
  - jpeg=9e=h166bdaf_1
  - json-c=0.15=h98cffda_0
  - json5=0.9.5=pyh9f0ad1d_0
  - jsonpickle=2.1.0=pyhd8ed1ab_0
  - jsonschema=4.4.0=pyhd8ed1ab_0
  - jupyter=1.0.0=py38h578d9bd_7
  - jupyter-archive=3.3.1=pyhd8ed1ab_0
  - jupyter-dash=0.4.2=pyhd8ed1ab_1
  - jupyter-panel-proxy=0.2.0a2=py_0
  - jupyter-resource-usage=0.5.1=pyhd8ed1ab_0
  - jupyter-server-mathjax=0.2.5=pyhc268e32_0
  - jupyter-server-proxy=3.2.1=pyhd8ed1ab_0
  - jupyter_bokeh=3.0.4=pyhd8ed1ab_0
  - jupyter_client=7.3.0=pyhd8ed1ab_0
  - jupyter_console=6.4.3=pyhd8ed1ab_0
  - jupyter_core=4.9.2=py38h578d9bd_0
  - jupyter_server=1.17.0=pyhd8ed1ab_0
  - jupyter_telemetry=0.1.0=pyhd8ed1ab_1
  - jupyterhub=2.2.2=pyhd8ed1ab_1
  - jupyterhub-base=2.2.2=pyhd8ed1ab_1
  - jupyterlab=3.3.4=pyhd8ed1ab_0
  - jupyterlab-git=0.37.1=pyhd8ed1ab_0
  - jupyterlab-system-monitor=0.8.0=pyhd8ed1ab_1
  - jupyterlab-topbar=0.6.1=pyhd8ed1ab_2
  - jupyterlab_pygments=0.2.2=pyhd8ed1ab_0
  - jupyterlab_server=2.13.0=pyhd8ed1ab_1
  - jupyterlab_widgets=1.1.0=pyhd8ed1ab_0
  - jupytext=1.13.8=pyh4b9bcc7_0
  - kealib=1.4.14=h87e4c3c_3
  - keyutils=1.6.1=h166bdaf_0
  - kiwisolver=1.4.2=py38h43d8883_1
  - krb5=1.19.3=h3790be6_0
  - lazy-object-proxy=1.7.1=py38h0a891b7_1
  - lcms2=2.12=hddcbb42_0
  - ld_impl_linux-64=2.36.1=hea4e1c9_2
  - lerc=3.0=h9c3ff4c_0
  - libaec=1.0.6=h9c3ff4c_0
  - libarchive=3.5.2=hccf745f_1
  - libblas=3.9.0=14_linux64_openblas
  - libbrotlicommon=1.0.9=h166bdaf_7
  - libbrotlidec=1.0.9=h166bdaf_7
  - libbrotlienc=1.0.9=h166bdaf_7
  - libcblas=3.9.0=14_linux64_openblas
  - libcdms=3.1.2=h3bdf4ba_117
  - libcf=1.0.3=py38h0c3d773_114
  - libclang=11.1.0=default_ha53f305_1
  - libcrc32c=1.1.2=h9c3ff4c_0
  - libcurl=7.83.0=h7bff187_0
  - libdap4=3.20.6=hd7c4107_2
  - libdeflate=1.10=h7f98852_0
  - libdrm=2.4.109=h7f98852_0
  - libdrs=3.1.2=hf593df3_118
  - libdrs_f=3.1.2=h7e76ec7_114
  - libedit=3.1.20191231=he28a2e2_2
  - libev=4.33=h516909a_1
  - libevent=2.1.10=h9b69904_4
  - libffi=3.4.2=h7f98852_5
  - libgcc-ng=11.2.0=h1d223b6_16
  - libgdal=3.3.3=h356f897_0
  - libgfortran-ng=11.2.0=h69a702a_16
  - libgfortran5=11.2.0=h5c6108e_16
  - libglib=2.70.2=h174f98d_4
  - libglu=9.0.0=he1b5a44_1001
  - libgomp=11.2.0=h1d223b6_16
  - libiconv=1.16=h516909a_0
  - libidn2=2.3.2=h7f98852_0
  - libkml=1.3.0=h238a007_1014
  - liblapack=3.9.0=14_linux64_openblas
  - libllvm11=11.1.0=hf817b99_3
  - libmicrohttpd=0.9.75=h7f98852_0
  - libnetcdf=4.8.1=mpi_mpich_hcdf9059_2
  - libnghttp2=1.47.0=h727a467_0
  - libnsl=2.0.0=h7f98852_0
  - libogg=1.3.4=h7f98852_1
  - libopenblas=0.3.20=pthreads_h78a6416_0
  - libopus=1.3.1=h7f98852_1
  - libpciaccess=0.16=h516909a_0
  - libpng=1.6.37=h21135ba_2
  - libpq=13.5=hd57d9b9_1
  - libprotobuf=3.20.0=h6239696_0
  - librttopo=1.1.0=h1185371_6
  - libsodium=1.0.18=h36c2ea0_1
  - libspatialindex=1.9.3=h9c3ff4c_4
  - libspatialite=5.0.1=h8796b1e_9
  - libssh2=1.10.0=ha56f1ee_2
  - libstdcxx-ng=11.2.0=he4da1e4_16
  - libtiff=4.3.0=h542a066_3
  - libunistring=0.9.10=h7f98852_0
  - libuuid=2.32.1=h7f98852_1000
  - libuv=1.40.0=h7f98852_0
  - libvorbis=1.3.7=h9c3ff4c_0
  - libwebp=1.2.2=h3452ae3_0
  - libwebp-base=1.2.2=h7f98852_1
  - libxcb=1.13=h7f98852_1004
  - libxkbcommon=1.0.3=he3ba5ed_0
  - libxml2=2.9.12=h72842e0_0
  - libxslt=1.1.33=h15afd5d_2
  - libzip=1.8.0=h4de3113_1
  - libzlib=1.2.11=h166bdaf_1014
  - llvmlite=0.38.0=py38h38d86a4_1
  - locket=1.0.0=pyhd8ed1ab_0
  - loguru=0.6.0=py38h578d9bd_1
  - lxml=4.8.0=py38h0a891b7_2
  - lz4=4.0.0=py38h1bf946c_1
  - lz4-c=1.9.3=h9c3ff4c_1
  - lzo=2.10=h516909a_1000
  - mako=1.2.0=pyhd8ed1ab_1
  - mamba_gator=5.1.2=pyhd8ed1ab_0
  - mapclassify=2.4.3=pyhd8ed1ab_0
  - markdown=3.3.6=pyhd8ed1ab_0
  - markdown-it-py=2.1.0=pyhd8ed1ab_0
  - markupsafe=2.1.1=py38h0a891b7_1
  - matplotlib=3.5.1=py38h578d9bd_0
  - matplotlib-base=3.5.1=py38hf4fb855_0
  - matplotlib-inline=0.1.3=pyhd8ed1ab_0
  - mdit-py-plugins=0.3.0=pyhd8ed1ab_0
  - mdurl=0.1.0=pyhd8ed1ab_0
  - memory_profiler=0.60.0=pyhd8ed1ab_0
  - mesalib=21.2.5=h0e4506f_3
  - mistune=0.8.4=py38h497a2fe_1005
  - mpi=1.0=mpich
  - mpi4py=3.1.3=py38h97ac3a3_1
  - mpich=4.0.2=h846660c_100
  - msgpack-python=1.0.3=py38h43d8883_1
  - multidict=6.0.2=py38h0a891b7_1
  - multipledispatch=0.6.0=py_0
  - munch=2.5.0=py_0
  - munkres=1.1.4=pyh9f0ad1d_0
  - mysql-common=8.0.29=haf5c9bc_0
  - mysql-libs=8.0.29=h28c427c_0
  - nbclassic=0.3.7=pyhd8ed1ab_0
  - nbclient=0.5.13=pyhd8ed1ab_0
  - nbconvert=6.5.0=pyhd8ed1ab_0
  - nbconvert-core=6.5.0=pyhd8ed1ab_0
  - nbconvert-pandoc=6.5.0=pyhd8ed1ab_0
  - nbdime=3.1.1=pyhd8ed1ab_0
  - nbformat=5.3.0=pyhd8ed1ab_0
  - nbresuse=0.4.0=pyhd8ed1ab_0
  - nbval=0.9.6=pyh9f0ad1d_0
  - nc-time-axis=1.4.1=pyhd8ed1ab_0
  - ncurses=6.3=h27087fc_1
  - nest-asyncio=1.5.5=pyhd8ed1ab_0
  - nested_dict=1.61=pyhd3deb0d_0
  - netcdf-fortran=4.5.4=mpi_mpich_h1364a43_0
  - netcdf4=1.5.8=nompi_py38h2823cc8_101
  - nettle=3.6=he412f7d_0
  - networkx=2.8=pyhd8ed1ab_0
  - nodeenv=1.6.0=pyhd8ed1ab_0
  - nodejs=16.13.1=hb931c9a_0
  - notebook=6.4.11=pyha770c72_0
  - notebook-shim=0.1.0=pyhd8ed1ab_0
  - nspr=4.32=h9c3ff4c_1
  - nss=3.77=h2350873_0
  - numba=0.55.1=py38h4bf6c61_0
  - numcodecs=0.9.1=py38h709712a_2
  - numpy=1.21.6=py38h1d589f8_0
  - oauthlib=3.2.0=pyhd8ed1ab_0
  - openblas=0.3.20=pthreads_h320a7e8_0
  - openjpeg=2.4.0=hb52868f_1
  - openssl=1.1.1n=h166bdaf_0
  - ostrich=21.03.16=h4bd325d_1
  - outcome=1.1.0=pyhd8ed1ab_0
  - owslib=0.25.0=pyhd8ed1ab_0
  - packaging=21.3=pyhd8ed1ab_0
  - pamela=1.0.0=py_0
  - pandas=1.3.5=py38h43a58ef_0
  - pandoc=2.18=ha770c72_0
  - pandocfilters=1.5.0=pyhd8ed1ab_0
  - panel=0.13.1a2=py_0
  - param=1.12.1=pyh6c4a22f_0
  - paramiko=2.10.4=pyhd8ed1ab_0
  - parso=0.8.3=pyhd8ed1ab_0
  - partd=1.2.0=pyhd8ed1ab_0
  - patsy=0.5.2=pyhd8ed1ab_0
  - pcre=8.45=h9c3ff4c_0
  - pexpect=4.8.0=py38h32f6830_1
  - pickleshare=0.7.5=py38h32f6830_1002
  - pillow=9.1.0=py38h0ee0e06_2
  - pint=0.19.2=pyhd8ed1ab_0
  - pip=22.0.4=pyhd8ed1ab_0
  - pixman=0.40.0=h36c2ea0_0
  - platformdirs=2.5.1=pyhd8ed1ab_0
  - plotly=5.7.0=pyhd8ed1ab_0
  - pluggy=1.0.0=py38h578d9bd_3
  - pooch=1.6.0=pyhd8ed1ab_0
  - poppler=21.09.0=ha39eefc_3
  - poppler-data=0.4.11=hd8ed1ab_0
  - postgresql=13.5=h2510834_1
  - pre-commit=2.18.1=py38h578d9bd_1
  - proj=8.1.1=h277dcde_2
  - prometheus_client=0.14.1=pyhd8ed1ab_0
  - prompt-toolkit=3.0.29=pyha770c72_0
  - prompt_toolkit=3.0.29=hd8ed1ab_0
  - properscoring=0.1=py_0
  - protobuf=3.20.0=py38hfa26641_4
  - pscript=0.7.5=pyhd3deb0d_0
  - psutil=5.9.0=py38h0a891b7_1
  - pthread-stubs=0.4=h36c2ea0_1001
  - ptyprocess=0.7.0=pyhd3deb0d_0
  - pure_eval=0.2.2=pyhd8ed1ab_0
  - py=1.11.0=pyh6c4a22f_0
  - pyasn1=0.4.8=py_0
  - pyasn1-modules=0.2.7=py_0
  - pycparser=2.21=pyhd8ed1ab_0
  - pyct=0.4.6=py_0
  - pyct-core=0.4.6=py_0
  - pycurl=7.45.1=py38h61f0cdf_1
  - pydantic=1.9.0=py38h0a891b7_1
  - pydap=3.3.0=pyhd8ed1ab_0
  - pygeos=0.10.2=py38hb7fe4a8_0
  - pygments=2.12.0=pyhd8ed1ab_0
  - pyjwt=2.3.0=pyhd8ed1ab_1
  - pynacl=1.5.0=py38h0a891b7_1
  - pyopenssl=22.0.0=pyhd8ed1ab_0
  - pyparsing=3.0.8=pyhd8ed1ab_0
  - pyproj=3.2.1=py38h80797bf_2
  - pyqt=5.12.3=py38h578d9bd_8
  - pyqt-impl=5.12.3=py38h0ffb2e6_8
  - pyqt5-sip=4.19.18=py38h709712a_8
  - pyqtchart=5.12=py38h7400c14_8
  - pyqtwebengine=5.12.1=py38h7400c14_8
  - pyrsistent=0.18.1=py38h0a891b7_1
  - pyshp=2.3.0=pyhd8ed1ab_0
  - pysocks=1.7.1=py38h578d9bd_5
  - pytest=7.1.2=py38h578d9bd_0
  - python=3.8.13=h582c2e5_0_cpython
  - python-dateutil=2.8.2=pyhd8ed1ab_0
  - python-eccodes=1.4.0=py38h71d37f0_1
  - python-fastjsonschema=2.15.3=pyhd8ed1ab_0
  - python-json-logger=2.0.1=pyh9f0ad1d_0
  - python_abi=3.8=2_cp38
  - pytz=2022.1=pyhd8ed1ab_0
  - pyu2f=0.1.5=pyhd8ed1ab_0
  - pyviz_comms=2.2.0=pyhd8ed1ab_0
  - pywavelets=1.3.0=py38h71d37f0_1
  - pyyaml=6.0=py38h0a891b7_4
  - pyzmq=22.3.0=py38hfc09fa9_2
  - qt=5.12.9=hda022c4_4
  - qtconsole=5.3.0=pyhd8ed1ab_0
  - qtconsole-base=5.3.0=pyhd8ed1ab_0
  - qtpy=2.1.0=pyhd8ed1ab_0
  - rasterio=1.2.10=py38hfd64e68_0
  - raven-hydro=3.0.4.322=ha46ed4c_2
  - ravenpy=0.7.8=pyh8a188c0_0
  - readline=8.1=h46c0cb4_0
  - regionmask=0.9.0=pyhd8ed1ab_0
  - requests=2.27.1=pyhd8ed1ab_0
  - requests-oauthlib=1.3.1=pyhd8ed1ab_0
  - retrying=1.3.3=py_2
  - rioxarray=0.11.1=pyhd8ed1ab_0
  - roocs-utils=0.6.1=pyh6c4a22f_0
  - rsa=4.8=pyhd8ed1ab_0
  - rtree=1.0.0=py38h02d302b_1
  - ruamel.yaml=0.17.21=py38h0a891b7_1
  - ruamel.yaml.clib=0.2.6=py38h0a891b7_1
  - s3fs=2022.3.0=pyhd8ed1ab_0
  - scikit-image=0.19.2=py38h43a58ef_0
  - scikit-learn=1.0.2=py38h1561384_0
  - scipy=1.8.0=py38h56a6a73_1
  - scp=0.14.4=pyhd8ed1ab_0
  - selenium=4.1.0=pyhd8ed1ab_0
  - send2trash=1.8.0=pyhd8ed1ab_0
  - setuptools=59.8.0=py38h578d9bd_1
  - shapely=1.7.1=py38hb7fe4a8_5
  - simpervisor=0.4=pyhd8ed1ab_0
  - siphon=0.9=py38h578d9bd_1
  - six=1.16.0=pyh6c4a22f_0
  - smmap=3.0.5=pyh44b312d_0
  - snappy=1.1.8=he1b5a44_3
  - sniffio=1.2.0=py38h578d9bd_3
  - snuggs=1.4.7=py_0
  - sortedcontainers=2.4.0=pyhd8ed1ab_0
  - soupsieve=2.3.1=pyhd8ed1ab_0
  - sparse=0.13.0=pyhd8ed1ab_0
  - sqlalchemy=1.4.36=py38h0a891b7_0
  - sqlite=3.38.3=h4ff8645_0
  - stack_data=0.2.0=pyhd8ed1ab_0
  - statsmodels=0.13.2=py38h6c62de6_0
  - tblib=1.7.0=pyhd8ed1ab_0
  - tenacity=8.0.1=pyhd8ed1ab_0
  - terminado=0.13.3=py38h578d9bd_1
  - threadpoolctl=3.1.0=pyh8a188c0_0
  - threddsclient=0.4.2=py_0
  - tifffile=2020.6.3=py_0
  - tiledb=2.3.4=he87e0bf_0
  - tinycss2=1.1.1=pyhd8ed1ab_0
  - tk=8.6.12=h27826a3_0
  - toml=0.10.2=pyhd8ed1ab_0
  - tomli=2.0.1=pyhd8ed1ab_0
  - toolz=0.11.2=pyhd8ed1ab_0
  - tornado=6.1=py38h0a891b7_3
  - tqdm=4.64.0=pyhd8ed1ab_0
  - traitlets=5.1.1=pyhd8ed1ab_0
  - traittypes=0.2.1=pyh9f0ad1d_2
  - trio=0.20.0=py38h578d9bd_1
  - trio-websocket=0.9.2=pyhd8ed1ab_0
  - typing-extensions=4.2.0=hd8ed1ab_1
  - typing_extensions=4.2.0=pyha770c72_1
  - tzcode=2022a=h166bdaf_0
  - tzdata=2022a=h191b570_0
  - ukkonen=1.0.1=py38h43d8883_2
  - unicodedata2=14.0.0=py38h0a891b7_1
  - urllib3=1.26.9=pyhd8ed1ab_0
  - virtualenv=20.14.1=py38h578d9bd_0
  - voila=0.3.5=pyhd8ed1ab_0
  - wcwidth=0.2.5=pyh9f0ad1d_2
  - webencodings=0.5.1=py_1
  - webob=1.8.7=pyhd8ed1ab_0
  - websocket-client=1.3.2=pyhd8ed1ab_0
  - websockets=10.3=py38h0a891b7_0
  - werkzeug=2.1.2=pyhd8ed1ab_0
  - wget=1.20.3=ha56f1ee_1
  - wheel=0.37.1=pyhd8ed1ab_0
  - widgetsnbextension=3.6.0=py38h578d9bd_0
  - wrapt=1.14.1=py38h0a891b7_0
  - wsproto=1.1.0=py38h578d9bd_0
  - xarray=2022.3.0=pyhd8ed1ab_0
  - xclim=0.36.0=pyhd8ed1ab_0
  - xerces-c=3.2.3=h9d8b166_3
  - xesmf=0.6.2=pyhd8ed1ab_0
  - xeus=2.4.1=h70bab47_0
  - xeus-python=0.13.7=py38h9f61dbb_0
  - xeus-python-shell=0.2.0=pyhd8ed1ab_0
  - xhistogram=0.3.1=pyhd8ed1ab_0
  - xlrd=2.0.1=pyhd8ed1ab_3
  - xorg-damageproto=1.2.1=h7f98852_1002
  - xorg-fixesproto=5.0=h7f98852_1002
  - xorg-glproto=1.4.17=h7f98852_1002
  - xorg-inputproto=2.3.2=h7f98852_1002
  - xorg-kbproto=1.0.7=h7f98852_1002
  - xorg-libice=1.0.10=h7f98852_0
  - xorg-libsm=1.2.3=hd9c2040_1000
  - xorg-libx11=1.7.2=h7f98852_0
  - xorg-libxau=1.0.9=h7f98852_0
  - xorg-libxdamage=1.1.5=h7f98852_1
  - xorg-libxdmcp=1.1.3=h7f98852_0
  - xorg-libxext=1.3.4=h7f98852_1
  - xorg-libxfixes=5.0.3=h7f98852_1004
  - xorg-libxi=1.7.10=h7f98852_0
  - xorg-libxrandr=1.5.2=h7f98852_1
  - xorg-libxrender=0.9.10=h7f98852_1003
  - xorg-randrproto=1.5.0=h7f98852_1001
  - xorg-renderproto=0.11.1=h7f98852_1002
  - xorg-util-macros=1.19.3=h7f98852_0
  - xorg-xextproto=7.3.0=h7f98852_1002
  - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002
  - xorg-xproto=7.0.31=h7f98852_1007
  - xrft=0.4.1=pyhd8ed1ab_0
  - xskillscore=0.0.24=pyhd8ed1ab_0
  - xyzservices=2022.4.0=pyhd8ed1ab_0
  - xz=5.2.5=h516909a_1
  - yaml=0.2.5=h7f98852_2
  - yarl=1.7.2=py38h0a891b7_2
  - zarr=2.11.3=pyhd8ed1ab_0
  - zeromq=4.3.4=h9c3ff4c_1
  - zict=2.2.0=pyhd8ed1ab_0
  - zipp=3.8.0=pyhd8ed1ab_0
  - zlib=1.2.11=h166bdaf_1014
  - zstd=1.5.2=ha95c52a_0
  - pip:
    - astunparse==1.6.3
    - colour==0.1.5
    - geojson==2.5.0
    - ipython-blocking==0.3.1
    - jupyterlab-logout==0.5.0
    - jupyternotify==0.1.15
    - pixiedust==1.1.19
    - pymetalink==6.4
    - pytest-tornasync==0.6.0.post2
    - requests-magpie==0.1.1
prefix: /opt/conda/envs/birdy
```
  • Loading branch information
tlvu committed May 5, 2022
2 parents c74ad1e + 0977f44 commit f8e5141
Show file tree
Hide file tree
Showing 8 changed files with 153 additions and 14 deletions.
2 changes: 1 addition & 1 deletion Jenkinsfile
Expand Up @@ -10,7 +10,7 @@ pipeline {
// https://jenkins.io/doc/book/pipeline/syntax/
agent {
docker {
image "pavics/workflow-tests:220401"
image "pavics/workflow-tests:220502"
label 'linux && docker'
}
}
Expand Down
10 changes: 8 additions & 2 deletions binder/Dockerfile
@@ -1,4 +1,4 @@
FROM pavics/workflow-tests:220401
FROM pavics/workflow-tests:220502

USER root

Expand All @@ -12,6 +12,12 @@ WORKDIR /notebooks

RUN ./downloadrepos; DEPLOY_PAVICS_LANDING_NB=1 ./reorg-notebooks; rm -rfv downloadrepos default_build_params reorg-notebooks; chown -R jenkins:jenkins .

RUN pip install https://github.com/Ouranosinc/xclim/archive/master.tar.gz
#COPY binder/test-notebooks /notebooks

#RUN mkdir -p subdir1/subdir2; cp TEST-panel-servable.ipynb subdir1/servable1.ipynb; cp TEST-panel-servable.ipynb subdir1/subdir2/servable2.ipynb; cp TEST-panel-servable.ipynb TEST-panel-servable-Copy.ipynb

#RUN chown jenkins:jenkins -R .

# RUN pip install https://github.com/Ouranosinc/xclim/archive/master.tar.gz

USER jenkins
85 changes: 85 additions & 0 deletions binder/test-notebooks/TEST-panel-binder.ipynb
@@ -0,0 +1,85 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "d79b1053-3144-47d4-824f-49a3666d68e6",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:bokeh.server.util:Host wildcard '*' will allow connections originating from multiple (or possibly all) hostnames or IPs. Use non-wildcard values to restrict access explicitly\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Launching server at http://localhost:5007\n"
]
}
],
"source": [
"import panel as pn\n",
"srv = pn.panel(\n",
" pn.widgets.FloatInput(name='an input')\n",
").show(port=5007, websocket_origin=\"*\")"
]
},
{
"cell_type": "markdown",
"id": "8f18de16-80bd-40dc-9438-ca176fc8c169",
"metadata": {},
"source": [
"Your current URL should look something like:\n",
"\n",
"https://hub.gke2.mybinder.org/user/ouranosinc-pavi--workflow-tests-9jerf8qk/lab/tree/TEST-panel-binder.ipynb\n",
"\n",
"Open a new browser tab, then to go to something like this URL (replace `lab/tree/TEST-panel-binder.ipynb` with `proxy/5007/`):\n",
"\n",
"https://hub.gke2.mybinder.org/user/ouranosinc-pavi--workflow-tests-9jerf8qk/proxy/5007/"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2d39a37c-8df6-4f27-9aeb-54181f35c295",
"metadata": {},
"outputs": [],
"source": [
"srv.stop() # To stop the server."
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "fb898f21-f543-40b4-8bf4-b701559b842f",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
36 changes: 36 additions & 0 deletions binder/test-notebooks/TEST-panel-servable.ipynb
@@ -0,0 +1,36 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "7acdd82a-bc2d-443c-8fa8-e432de9cfa30",
"metadata": {},
"outputs": [],
"source": [
"import panel as pn\n",
"pn.panel('# Ceci est un test').servable()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
12 changes: 9 additions & 3 deletions docker/Dockerfile
Expand Up @@ -17,7 +17,7 @@ RUN apt-get update && \
# Change /opt/conda folder permissions for jupyter-conda extension.
RUN groupadd --gid 1000 jenkins \
&& useradd --uid 1000 --gid jenkins --create-home jenkins && \
chmod -R a+rwx /opt/conda
chmod -R a+rwX /opt/conda

COPY environment.yml /environment.yml

Expand Down Expand Up @@ -70,7 +70,9 @@ RUN python -m ipykernel install --name birdy
# https://github.com/plotly/jupyter-dash/issues/49
RUN jupyter lab build

RUN jupyter serverextension enable voila --sys-prefix
RUN jupyter serverextension enable voila --sys-prefix \
&& jupyter serverextension enable panel.io.jupyter_server_extension --sys-prefix \
&& jupyter serverextension list
# && jupyter labextension install jupyterlab-clipboard

# This should be "master" but commit
Expand All @@ -94,7 +96,11 @@ RUN wget https://raw.githubusercontent.com/jupyter/docker-stacks/$DOCKER_STACKS_
chmod a+rx /usr/local/bin/start.sh /usr/local/bin/start-singleuser.sh /usr/local/bin/start-notebook.sh /usr/local/bin/fix-permissions && \
chmod a+r /etc/jupyter/jupyter_notebook_config.py && \
mkdir /notebook_dir && chown jenkins /notebook_dir && \
chmod a+rwX -R /opt/conda/envs/birdy/fonts
chmod a+rwX -R /opt/conda/envs/birdy/fonts && \
chmod a+rwX -R /opt/conda/pkgs/cache

# For jupyter-panel-proxy launcher.
ENV BOKEH_ALLOW_WS_ORIGIN "*"

# problem running start-notebook.sh when being root
# the jupyter/base-notebook image also do not default to root user so we do the same here
Expand Down
18 changes: 12 additions & 6 deletions docker/environment.yml
Expand Up @@ -5,6 +5,7 @@ channels:
- cdat
- bokeh
- plotly # for jupyter-dash
- pyviz/label/dev # for jupyter-panel-proxy, panel
- defaults

dependencies:
Expand All @@ -27,9 +28,6 @@ dependencies:
- dask <= 2022.1.0
- distributed <= 2022.1.0

# Pin cf_xarray for slow WPS_example.ipynb.
- cf_xarray<=0.6.3

- matplotlib
# - xarray # from xclim and ravenpy
# - numpy # from xclim and ravenpy
Expand Down Expand Up @@ -57,7 +55,7 @@ dependencies:
- jupyter_bokeh
- pscript
- h5netcdf
- panel
- panel >= 0.13.1a3
# https://github.com/holoviz/panel
- pyviz_comms # (was labextension pyviz/jupyterlab_pyviz in jupyterlab v2)
- holoviews
Expand Down Expand Up @@ -119,7 +117,7 @@ dependencies:
# warnings.warn(f'Downloading: {url}', DownloadWarning)
- shapely <= 1.7.1
# https://github.com/roocs/clisops
- clisops >= 0.8.0
- clisops >= 0.9.0
# Universal Regridder for Geospatial Data
# https://github.com/pangeo-data/xESMF
# xesmf-0.6.2 requires clisops>=0.8.0
Expand Down Expand Up @@ -170,6 +168,12 @@ dependencies:
# xeus-python: back-end kernel implementing the Jupyter Debug Protocol
- xeus-python
- jupyter-dash
# https:://github.com/jupyterhub/jupyter-server-proxy
- jupyter-server-proxy
# https://github.com/dask/dask-labextension
- dask-labextension
# https://github.com/holoviz/jupyter-panel-proxy
- jupyter-panel-proxy >= 0.2.0a2
# Force newer nodejs for 'jupyter lab build' issue
# https://github.com/jupyterlab/jupyterlab/issues/11726#issuecomment-998901247
# TODO: remove nodejs once all extensions move to prebuilt extensions, see comment
Expand Down Expand Up @@ -197,7 +201,9 @@ dependencies:
# Mimics how one might format their calculation if it were written with a
# pencil: write the symbolic formula, followed by numeric substitutions,
# and then the result.
- handcalcs
# DISABLE handcalcs, interfere with "Panel preview" button
# See comment https://github.com/holoviz/panel/issues/3440#issuecomment-1112182170
# - handcalcs
# https://github.com/ShopRunner/jupyter-notify
# Jupyter Magic For Browser Notifications of Cell Completion.
- jupyternotify
Expand Down
2 changes: 1 addition & 1 deletion launchcontainer
@@ -1,7 +1,7 @@
#!/bin/sh -x

if [ -z "$DOCKER_IMAGE" ]; then
DOCKER_IMAGE="pavics/workflow-tests:220401"
DOCKER_IMAGE="pavics/workflow-tests:220502"
fi

if [ -z "$CONTAINER_NAME" ]; then
Expand Down
2 changes: 1 addition & 1 deletion launchnotebook
Expand Up @@ -7,7 +7,7 @@ if [ -z "$PORT" ]; then
fi

if [ -z "$DOCKER_IMAGE" ]; then
DOCKER_IMAGE="pavics/workflow-tests:220401"
DOCKER_IMAGE="pavics/workflow-tests:220502"
fi

if [ -z "$CONTAINER_NAME" ]; then
Expand Down

0 comments on commit f8e5141

Please sign in to comment.