Skip to content

Commit b35978b

Browse files
effigiesoesteban
andauthored
[BACKPORT] CI: Use datalad-managed test data (#653) [test masks]
* MAINT: Move mask-regressions test-data to datalad + nipreps-data * fix: set TEMPLATEFLOW_AUTOUPDATE=off * fix: revise templateflow installation and set TEMPLATEFLOW_AUTOUPDATE=off * fix: test preamble, failing to discover data * fix: trigger run after reseting github's default branches * enh: precache all necessary templateflow resources * enh: various improvements to Docker image and Circle settings * maint: roll back config and sty [skip ci] * MAINT: Migrate ``ds003_downsampled`` to ``nipreps-data`` Finalizes the migration from zipfiles to datalad datasets. * maint: [test masks] now triggers regression tests too * fix: existing datalad datasets Co-authored-by: Oscar Esteban <[email protected]>
1 parent 45b9808 commit b35978b

File tree

7 files changed

+203
-151
lines changed

7 files changed

+203
-151
lines changed

.circleci/config.yml

Lines changed: 109 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ jobs:
9595
docker build --rm --cache-from=niworkflows:latest \
9696
-t niworkflows:latest \
9797
--build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
98-
--build-arg VCS_REF=`git rev-parse --short HEAD` . \
98+
--build-arg VCS_REF=`git rev-parse --short HEAD` \
99+
--build-arg VERSION=`python3 get_version.py` . \
99100
&& e=0 && break || sleep 15
100101
done && [ "$e" -eq "0" ]
101102
docker tag niworkflows:latest localhost:5000/niworkflows
@@ -112,26 +113,45 @@ jobs:
112113
- /tmp/images
113114

114115
get_data:
115-
machine:
116-
# Ubuntu 14.04 with Docker 17.10.0-ce
117-
image: ubuntu-1604:202007-01
118-
working_directory: /home/circleci/data
116+
docker:
117+
- image: continuumio/miniconda3:4.9.2-alpine
118+
working_directory: /tmp/data
119+
environment:
120+
- TEMPLATEFLOW_HOME: /tmp/templateflow
119121
steps:
120122
- restore_cache:
121123
keys:
122-
- data-v1-{{ epoch }}
123-
- data-v1-
124+
- env-v1-{{ .Branch }}-
125+
- env-v1-master-
126+
- env-v1-
127+
- run:
128+
name: Setup git-annex, DataLad & TemplateFlow
129+
command: |
130+
conda install -y -c anaconda -c conda-forge git-annex datalad wget
131+
python -m pip install --no-cache-dir -U datalad-osf
132+
git config --global user.name 'NiPreps Bot'
133+
git config --global user.email '[email protected]'
134+
python -m pip install --no-cache-dir -U templateflow
135+
- save_cache:
136+
key: env-v1-{{ .Branch }}-{{ .BuildNum }}
137+
paths:
138+
- /opt/conda
139+
140+
- restore_cache:
141+
keys:
142+
- data-v3-{{ .Branch }}-{{ epoch }}
143+
- data-v3-{{ .Branch }}-
144+
- data-v3-master-
145+
- data-v3-
124146
- run:
125147
name: Get test data from ds000003
126148
command: |
127-
mkdir -p /tmp/data
128-
if [[ ! -d /tmp/data/ds003_downsampled ]]; then
129-
wget --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 -t 0 -q \
130-
-O ds003_downsampled.tar.gz "https://files.osf.io/v1/resources/fvuh8/providers/osfstorage/57f328f6b83f6901ef94cf70"
131-
tar xvzf ds003_downsampled.tar.gz -C /tmp/data/
132-
else
133-
echo "Dataset ds000003 was cached"
149+
if [[ ! -d ds000003 ]]; then
150+
datalad install -r https://github.com/nipreps-data/ds000003.git
134151
fi
152+
datalad update -r --merge -d ds000003/
153+
datalad get -J 2 -r -d ds000003/ ds000003/*
154+
135155
- run:
136156
name: Get BIDS test data stub
137157
command: |
@@ -143,57 +163,67 @@ jobs:
143163
else
144164
echo "BIDS stub was cached"
145165
fi
166+
- save_cache:
167+
key: data-v3-{{ .Branch }}-{{ epoch }}
168+
paths:
169+
- /tmp/data/ds000003
170+
- /tmp/data/BIDS-examples-1-enh-ds054
146171
- run:
147172
name: Store FreeSurfer license file
148173
command: |
149174
mkdir -p /tmp/fslicense
150175
cd /tmp/fslicense
151176
echo "cHJpbnRmICJrcnp5c3p0b2YuZ29yZ29sZXdza2lAZ21haWwuY29tXG41MTcyXG4gKkN2dW12RVYzelRmZ1xuRlM1Si8yYzFhZ2c0RVxuIiA+IGxpY2Vuc2UudHh0Cg==" | base64 -d | sh
177+
178+
- checkout:
179+
path: /tmp/src/niworkflows
180+
152181
- persist_to_workspace:
153182
root: /tmp
154183
paths:
155-
- data
156184
- fslicense
157-
- save_cache:
158-
key: data-v1-{{ epoch }}
159-
paths:
160-
- /tmp/data
185+
- src/
186+
187+
- run:
188+
name: Check if regression data must be downloaded
189+
command: |
190+
cd /tmp/src/niworkflows
191+
set +e
192+
test_masks="$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[test[ _]?masks?\]' )$( echo $CIRCLE_BRANCH | grep -i -E '^masks?/' )"
193+
set -e
194+
if [[ "x${CIRCLE_TAG}" = "x" && "${CIRCLE_BRANCH}" != "master" && "x${test_masks}" = "x" ]]; then
195+
echo "Not a tag or master branch, not a ``masks?/`` branch, no ``[test_masks]`` label in commit message"
196+
echo "Skipping download of test data for mask regressions."
197+
circleci step halt
198+
fi
161199
162-
get_regression_data:
163-
machine:
164-
# Ubuntu 14.04 with Docker 17.10.0-ce
165-
image: ubuntu-1604:202007-01
166-
working_directory: /home/circleci/data
167-
steps:
168200
- restore_cache:
169201
keys:
170-
- regression-v5-{{ .Revision }}
171-
- regression-v5-
202+
- mask-regressions-v0-{{ .Branch }}-{{ .Revision }}-
203+
- mask-regressions-v0-{{ .Branch }}-
204+
- mask-regressions-v0-master-
205+
- mask-regressions-v0-
206+
- mask-regressions-
172207
- run:
173-
name: Get truncated BOLD series
208+
name: Setup TemplateFlow
174209
command: |
175-
mkdir -p /tmp/data
176-
if [[ ! -d /tmp/data/fmriprep_bold_truncated ]]; then
177-
wget --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 -t 0 -q \
178-
-O fmriprep_bold_truncated.tar.gz "https://osf.io/286yr/download"
179-
tar xvzf fmriprep_bold_truncated.tar.gz -C /tmp/data/
180-
else
181-
echo "Truncated BOLD series were cached"
182-
fi
210+
python -c "from templateflow import api as tfapi; \
211+
tfapi.get('MNI152NLin2009cAsym', resolution=1, label='brain', suffix='probseg'); \
212+
tfapi.get('MNI152NLin2009cAsym', resolution=2, desc='fMRIPrep', suffix='boldref'); \
213+
tfapi.get('MNI152NLin2009cAsym', resolution=2, desc='brain', suffix='mask'); "
183214
- run:
184-
name: Get pre-computed masks
215+
name: Install epi-references
185216
command: |
186-
if [[ ! -d /tmp/data/fmriprep_bold_mask ]]; then
187-
wget --retry-connrefused --waitretry=5 --read-timeout=20 --timeout=15 -t 0 -q \
188-
-O fmriprep_bold_mask.tar.gz "https://osf.io/s4f7b/download"
189-
tar xvzf fmriprep_bold_mask.tar.gz -C /tmp/data/
190-
else
191-
echo "Pre-computed masks were cached"
217+
if [[ ! -d epi-references ]]; then
218+
datalad install -r https://github.com/nipreps-data/epi-references.git
192219
fi
220+
datalad update -r --merge -d epi-references/
221+
datalad get -J 2 -r -d epi-references/ epi-references/*
193222
- save_cache:
194-
key: regression-v5-{{ .Revision }}-{{ epoch }}
195-
paths:
196-
- /tmp/data
223+
key: mask-regressions-v0-{{ .Branch }}-{{ .Revision }}-{{ epoch }}
224+
paths:
225+
- /tmp/templateflow
226+
- /tmp/data/epi-references
197227

198228
test_pytest:
199229
machine:
@@ -202,8 +232,6 @@ jobs:
202232
steps:
203233
- attach_workspace:
204234
at: /tmp
205-
- checkout:
206-
path: /tmp/src/niworkflows
207235
- run:
208236
name: Get codecov
209237
command: python -m pip install codecov
@@ -232,10 +260,18 @@ jobs:
232260
docker run -d -p 5000:5000 --restart=always --name=registry \
233261
-v /tmp/docker:/var/lib/registry registry:2
234262
- run:
235-
name: Pull images to registry
263+
name: Pull images from registry
236264
command: |
237265
docker pull localhost:5000/niworkflows
238266
docker tag localhost:5000/niworkflows niworkflows:latest
267+
268+
- restore_cache:
269+
keys:
270+
- data-v3-{{ .Branch }}-{{ epoch }}
271+
- data-v3-{{ .Branch }}-
272+
- data-v3-master-
273+
- data-v3-
274+
239275
- run:
240276
name: Run unit tests
241277
no_output_timeout: 2h
@@ -300,6 +336,25 @@ jobs:
300336
steps:
301337
- attach_workspace:
302338
at: /tmp
339+
340+
- run:
341+
name: Determine whether regression tests (masks) must be executed
342+
command: |
343+
cd /tmp/src/niworkflows
344+
set +e
345+
test_masks="$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[test[ _]?masks?\]' )$( echo $CIRCLE_BRANCH | grep -i -E '^masks?/' )"
346+
set -e
347+
if [[ "x${CIRCLE_TAG}" = "x" && "${CIRCLE_BRANCH}" != "master" && "x${test_masks}" = "x" ]]; then
348+
echo "Not a tag or master branch, not a ``masks?/`` branch, no ``[test_masks]`` label in commit message"
349+
echo "Skipping download of test data for mask regressions."
350+
circleci step halt
351+
fi
352+
353+
- restore_cache:
354+
keys:
355+
- mask-regressions-v0-{{ .Branch }}-{{ .Revision }}-
356+
- mask-regressions-v0-{{ .Branch }}-
357+
303358
- restore_cache:
304359
keys:
305360
- build-v1-{{ .Branch }}-{{ epoch }}
@@ -331,10 +386,6 @@ jobs:
331386
command: |
332387
docker pull localhost:5000/niworkflows
333388
docker tag localhost:5000/niworkflows niworkflows:latest
334-
335-
- restore_cache:
336-
keys:
337-
- regression-v5-{{ .Revision }}
338389
- restore_cache:
339390
keys:
340391
- masks-workdir-v3-{{ .Branch }}-{{epoch}}
@@ -347,10 +398,11 @@ jobs:
347398
command: |
348399
mkdir -p /tmp/masks/{reports,workdir} && \
349400
docker run -ti -u $(id -u) -w /src/niworkflows \
401+
-v /tmp/templateflow:/templateflow \
402+
-v /tmp/data/epi-references:/data -v /tmp/masks/reports:/tmp/masks/reports \
350403
-e COVERAGE_FILE=/tmp/masks/reports/.coverage \
351-
-v /tmp/data:/tmp/data -v /tmp/masks/reports:/tmp/masks/reports \
352-
-e FMRIPREP_REGRESSION_SOURCE=/tmp/data/fmriprep_bold_truncated \
353-
-e FMRIPREP_REGRESSION_TARGETS=/tmp/data/fmriprep_bold_mask \
404+
-e TEMPLATEFLOW_HOME=/templateflow -e TEMPLATEFLOW_AUTOUPDATE=off \
405+
-e FMRIPREP_REGRESSION_SOURCE=/data \
354406
-e FMRIPREP_REGRESSION_REPORTS=/tmp/masks/reports \
355407
-e CACHED_WORK_DIRECTORY=/tmp/work -v /tmp/masks/workdir:/tmp/work \
356408
niworkflows:latest \
@@ -385,8 +437,6 @@ jobs:
385437
-e COVERAGE_FILE=/tmp/masks/reports/.coverage \
386438
-v /tmp/masks/reports:/tmp/masks/reports \
387439
niworkflows:latest coverage xml -o coverage.xml
388-
- checkout:
389-
path: /tmp/src/niworkflows
390440
- run:
391441
name: Get codecov
392442
command: python -m pip install codecov
@@ -587,21 +637,9 @@ workflows:
587637
only: /.*/
588638
- get_data:
589639
filters:
590-
branches:
591-
ignore:
592-
- /masks?\/.*/
593640
tags:
594641
only: /.*/
595642

596-
- get_regression_data:
597-
filters:
598-
branches:
599-
only:
600-
- /master/
601-
- /masks?\/.*/
602-
tags:
603-
ignore: /.*/
604-
605643
- test_package:
606644
filters:
607645
branches:
@@ -625,12 +663,8 @@ workflows:
625663
- test_masks:
626664
requires:
627665
- build
628-
- get_regression_data
666+
- get_data
629667
filters:
630-
branches:
631-
only:
632-
- /master/
633-
- /masks?\/.*/
634668
tags:
635669
ignore: /.*/
636670

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ __pycache__
99
build/
1010
dist/
1111
docs/
12+
examples/
1213
niworkflows.egg-info/
1314
pip-wheel-metadata/
1415
src/
@@ -36,5 +37,6 @@ circle.yml
3637
codecov.yml
3738

3839
# other
40+
Makefile
3941
.zenodo.json
4042

Dockerfile

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -146,22 +146,12 @@ ENV MKL_NUM_THREADS=1 \
146146
RUN python -c "from matplotlib import font_manager" && \
147147
sed -i 's/\(backend *: \).*$/\1Agg/g' $( python -c "import matplotlib; print(matplotlib.matplotlib_fname())" )
148148

149-
# Installing dev requirements (packages that are not in pypi)
150-
# Precaching atlases
151-
RUN pip install --no-cache-dir "templateflow >= 0.6" && \
152-
rm -rf $HOME/.cache/pip && \
153-
python -c "from templateflow import api as tfapi; \
154-
tfapi.get(['MNI152Lin', 'MNI152NLin2009cAsym', 'OASIS30ANTs'], suffix='T1w'); \
155-
tfapi.get(['MNI152Lin', 'MNI152NLin2009cAsym', 'OASIS30ANTs'], desc='brain', suffix='mask'); \
156-
tfapi.get(['MNI152NLin2009cAsym'], desc='fMRIPrep', suffix='boldref'); \
157-
tfapi.get('OASIS30ANTs', resolution=1, desc='4', suffix='dseg'); \
158-
tfapi.get(['OASIS30ANTs', 'NKI'], resolution=1, label='brain', suffix='probseg'); \
159-
tfapi.get(['OASIS30ANTs', 'NKI'], resolution=1, desc='BrainCerebellumRegistration', suffix='mask'); "
160-
161-
WORKDIR /src/
162-
COPY . niworkflows/
163149
WORKDIR /src/niworkflows/
164-
RUN pip install --no-cache-dir -e .[all] && \
150+
COPY . /src/niworkflows/
151+
ARG VERSION
152+
RUN echo "${VERSION}" > /src/niworkflows/niworkflows/VERSION && \
153+
echo "include niworkflows/VERSION" >> /src/niworkflows/MANIFEST.in && \
154+
pip install --no-cache-dir -e .[all] && \
165155
rm -rf $HOME/.cache/pip
166156

167157
COPY docker/files/nipype.cfg /home/niworkflows/.nipype/nipype.cfg

Makefile

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
.PHONY: help docker
2+
.DEFAULT: help
3+
4+
tag="latest"
5+
6+
help:
7+
@echo "Premade recipes"
8+
@echo
9+
@echo "make docker [tag=TAG]"
10+
@echo "\tBuilds a docker image from source. Defaults to 'latest' tag."
11+
12+
13+
docker:
14+
docker build --rm -t nipreps/niworkflows:$(tag) \
15+
--build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
16+
--build-arg VCS_REF=`git rev-parse --short HEAD` \
17+
--build-arg VERSION=`python setup.py --version` .

0 commit comments

Comments
 (0)