Skip to content

Commit 84e3c72

Browse files
authored
Merge pull request #15 from BIDS-Apps/circleci2
Circleci2
2 parents 50d4bba + a3cf50f commit 84e3c72

File tree

3 files changed

+346
-64
lines changed

3 files changed

+346
-64
lines changed

.circleci/config.yml

Lines changed: 342 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,342 @@
1+
version: 2
2+
jobs:
3+
get_data:
4+
machine:
5+
image: circleci/classic:201711-01
6+
working_directory: /tmp/data
7+
steps:
8+
- restore_cache:
9+
keys:
10+
- data-v3-{{ .Revision }}
11+
- data-v3-
12+
- run:
13+
name: Get ds114_test1
14+
command: |
15+
mkdir -p /tmp/data
16+
if [[ ! -d /tmp/data/ds114_test1 ]]; then
17+
wget -c -O ~/ds114_test1.tar \
18+
"https://files.osf.io/v1/resources/9q7dv/providers/osfstorage/57e54a326c613b01d7d3ed90" && \
19+
tar xf ~/ds114_test1.tar -C /tmp/data && \
20+
rm ~/ds114_test1.tar;
21+
else
22+
echo "ds114_test1 was cached"
23+
fi
24+
- run:
25+
name: Get ds114_test2
26+
command: |
27+
mkdir -p /tmp/data
28+
if [[ ! -d /tmp/data/ds114_test2 ]]; then
29+
wget -c -O ~/ds114_test2.tar \
30+
"https://files.osf.io/v1/resources/9q7dv/providers/osfstorage/57e549f9b83f6901d457d162" && \
31+
tar xf ~/ds114_test2.tar -C /tmp/data && \
32+
rm ~/ds114_test2.tar;
33+
else
34+
echo "ds114_test2 was cached"
35+
fi
36+
- run:
37+
name: Get ds114_test1_freesurfer
38+
command: |
39+
mkdir -p /tmp/data
40+
if [[ ! -d /tmp/data/ds114_test1_freesurfer ]]; then
41+
wget -c -O ~/ds114_test1_freesurfer.tar \
42+
"https://files.osf.io/v1/resources/9q7dv/providers/osfstorage/5882adf3b83f6901f564da49" && \
43+
tar xf ~/ds114_test1_freesurfer.tar -C /tmp/data && \
44+
rm ~/ds114_test1_freesurfer.tar;
45+
else
46+
echo "ds114_test1_freesurfer was cached"
47+
fi
48+
- run:
49+
name: Get ds114_test2_freesurfer
50+
command: |
51+
mkdir -p /tmp/data
52+
if [[ ! -d /tmp/data/ds114_test2_freesurfer ]]; then
53+
wget -c -O ~/ds114_test2_freesurfer.tar \
54+
"https://files.osf.io/v1/resources/9q7dv/providers/osfstorage/5882b0e3b83f6901fb64da18" && \
55+
tar xf ~/ds114_test2_freesurfer.tar -C /tmp/data && \
56+
rm ~/ds114_test2_freesurfer.tar;
57+
else
58+
echo "ds114_test2_freesurfer was cached"
59+
fi
60+
- save_cache:
61+
key: data-v3-{{ .Revision }}-{{ epoch }}
62+
paths:
63+
- /tmp/data
64+
65+
build:
66+
docker:
67+
- image: docker:18.01.0-ce-git
68+
steps:
69+
- checkout
70+
- run:
71+
name: Install parallel gzip
72+
command: |
73+
apk add --no-cache pigz
74+
- restore_cache:
75+
keys:
76+
- docker-v2-{{ .Branch }}-{{ .Revision }}
77+
- docker-v2-{{ .Branch }}-
78+
- docker-v2-master-
79+
- docker-v2-
80+
paths:
81+
- /tmp/cache/docker.tar.gz
82+
- setup_remote_docker
83+
- run:
84+
name: Load Docker image layer cache
85+
no_output_timeout: 30m
86+
command: |
87+
docker info
88+
set +o pipefail
89+
if [ -f /tmp/cache/docker.tar.gz ]; then
90+
pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
91+
else
92+
echo "No docker cache found"
93+
fi
94+
docker images
95+
- run:
96+
name: get version
97+
command: |
98+
git describe --tags --always > version
99+
cat version
100+
- run:
101+
name: Build Docker image
102+
no_output_timeout: 60m
103+
command: |
104+
docker images
105+
set +o pipefail
106+
docker build --cache-from=bids/${CIRCLE_PROJECT_REPONAME} \
107+
-t bids/${CIRCLE_PROJECT_REPONAME}:latest .
108+
docker images
109+
- run:
110+
name: Docker save
111+
no_output_timeout: 40m
112+
command: |
113+
mkdir -p /tmp/cache
114+
set +o pipefail
115+
docker save bids/${CIRCLE_PROJECT_REPONAME}:latest \
116+
| pigz -2 -p 3 > /tmp/cache/docker.tar.gz
117+
- save_cache:
118+
key: docker-v2-{{ .Branch }}-{{ epoch }}
119+
paths:
120+
- /tmp/cache/docker.tar.gz
121+
# Usage and version
122+
- run:
123+
name: Usage BIDS
124+
command: docker run -ti --rm bids/${CIRCLE_PROJECT_REPONAME}:latest -h
125+
- run:
126+
name: Usage files
127+
command: docker run --rm -ti --entrypoint=run_brain_age_files.py bids/${CIRCLE_PROJECT_REPONAME}:latest -h
128+
- run:
129+
name: Version BIDS
130+
command: docker run -ti --rm bids/${CIRCLE_PROJECT_REPONAME}:latest -v
131+
- run:
132+
name: Version files
133+
command: docker run --rm -ti --entrypoint=run_brain_age_files.py bids/${CIRCLE_PROJECT_REPONAME}:latest -v
134+
- run:
135+
name: Python packages
136+
command: docker run --rm -ti --entrypoint=/bin/bash bids/${CIRCLE_PROJECT_REPONAME}:latest -c "pip freeze"
137+
138+
test:
139+
machine:
140+
image: circleci/classic:201711-01
141+
working_directory: /tmp/data
142+
environment:
143+
- DATADIR: '/tmp/data'
144+
- OUTDIR: '/tmp/outputs'
145+
steps:
146+
- run:
147+
name: Install parallel gzip
148+
command: |
149+
sudo apt-get update && sudo apt-get install -y pigz
150+
- restore_cache:
151+
keys:
152+
- docker-v2-{{ .Branch }}-{{ .Revision }}
153+
- docker-v2-{{ .Branch }}-
154+
- docker-v2-master-
155+
- docker-v2-
156+
paths:
157+
- /tmp/cache/docker.tar.gz
158+
- restore_cache:
159+
keys:
160+
- data-v3-{{ .Revision }}
161+
- data-v3-
162+
163+
# Load Docker
164+
- run:
165+
name: Load Docker
166+
no_output_timeout: 30m
167+
command: |
168+
docker info
169+
set +o pipefail
170+
pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
171+
docker images
172+
173+
- run:
174+
name: make output directory
175+
command: mkdir -p ${OUTDIR}
176+
177+
# Test 1: ds114_test1
178+
- run:
179+
name: Test 1 ds114_test1 - 1
180+
command: |
181+
docker run --rm -ti -v ${DATADIR}/ds114_test1:/data/in \
182+
-v ${DATADIR}/ds114_test1_freesurfer:/data/fs \
183+
-v ${OUTDIR}/ds114_test1:/data/out \
184+
bids/${CIRCLE_PROJECT_REPONAME}:latest \
185+
/data/in /data/out participant --freesurfer_dir /data/fs \
186+
--license_key="~/test.key"
187+
- run:
188+
name: Test 1 ds114_test1 - 2
189+
command: |
190+
docker run --rm -ti -v ${DATADIR}/ds114_test1:/data/in \
191+
-v ${DATADIR}/ds114_test1_freesurfer:/data/fs \
192+
-v ${OUTDIR}/ds114_test1:/data/out \
193+
bids/${CIRCLE_PROJECT_REPONAME}:latest \
194+
/data/in /data/out group --freesurfer_dir /data/fs \
195+
--license_key="~/test.key"
196+
- run:
197+
name: Test 1 ds114_test1 - 3
198+
command: |
199+
cat ${OUTDIR}/ds114_test1/baracus/00_group/group_predicted_age.tsv
200+
201+
202+
# Test2 : models
203+
- run:
204+
name: Test 2 models - 1
205+
command: |
206+
docker run --rm -ti -v ${DATADIR}/ds114_test1:/data/in \
207+
-v ${DATADIR}/ds114_test1_freesurfer:/data/fs \
208+
-v ${OUTDIR}/ds114_test1_models:/data/out \
209+
bids/${CIRCLE_PROJECT_REPONAME}:latest \
210+
/data/in /data/out participant --freesurfer_dir /data/fs \
211+
--license_key="~/test.key" \
212+
--models Liem2016__OCI_norm Liem2016__full_2samp_training
213+
- run:
214+
name: Test 2 models - 2
215+
command: |
216+
docker run --rm -ti -v ${DATADIR}/ds114_test1:/data/in \
217+
-v ${DATADIR}/ds114_test1_freesurfer:/data/fs \
218+
-v ${OUTDIR}/ds114_test1_models:/data/out \
219+
bids/${CIRCLE_PROJECT_REPONAME}:latest \
220+
/data/in /data/out group --freesurfer_dir /data/fs \
221+
--license_key="~/test.key"
222+
- run:
223+
name: Test 2 models - 3
224+
command: |
225+
cat ${OUTDIR}/ds114_test1_models/baracus/00_group/group_predicted_age.tsv
226+
227+
# Test3: file mode
228+
- run:
229+
name: Test 3 file mode - 1
230+
command: |
231+
docker run --rm -ti \
232+
-v ${OUTDIR}/ds114_test1/baracus/sub-01/data/:/data/in \
233+
-v ${OUTDIR}/ds114_test1_file_mode:/data/out \
234+
--entrypoint=run_brain_age_files.py \
235+
bids/${CIRCLE_PROJECT_REPONAME}:latest \
236+
/data/out \
237+
--lh_thickness_file /data/in/lh.thickness.mgh \
238+
--rh_thickness_file /data/in/rh.thickness.mgh \
239+
--lh_area_file /data/in/lh.area.mgh \
240+
--rh_area_file /data/in/rh.area.mgh \
241+
--aseg_file /data/in/aseg --participant_label sub-01
242+
- run:
243+
name: Test 3 file mode - 2
244+
command: |
245+
cat ${OUTDIR}/ds114_test1_file_mode/sub-01/sub-01_predicted_age.tsv
246+
247+
248+
# Test 4: ds114_test2
249+
- run:
250+
name: Test 1 ds114_test2 - 1
251+
command: |
252+
docker run --rm -ti -v ${DATADIR}/ds114_test2:/data/in \
253+
-v ${DATADIR}/ds114_test2_freesurfer:/data/fs \
254+
-v ${OUTDIR}/ds114_test2:/data/out \
255+
bids/${CIRCLE_PROJECT_REPONAME}:latest \
256+
/data/in /data/out participant --freesurfer_dir /data/fs \
257+
--license_key="~/test.key"
258+
- run:
259+
name: Test 1 ds114_test2 - 2
260+
command: |
261+
docker run --rm -ti -v ${DATADIR}/ds114_test2:/data/in \
262+
-v ${DATADIR}/ds114_test2_freesurfer:/data/fs \
263+
-v ${OUTDIR}/ds114_test2:/data/out \
264+
bids/${CIRCLE_PROJECT_REPONAME}:latest \
265+
/data/in /data/out group --freesurfer_dir /data/fs \
266+
--license_key="~/test.key"
267+
- run:
268+
name: Test 1 ds114_test2 - 3
269+
command: |
270+
cat ${OUTDIR}/ds114_test2/baracus/00_group/group_predicted_age.tsv
271+
272+
- store_artifacts:
273+
path: /tmp/outputs/
274+
275+
deploy:
276+
machine:
277+
image: circleci/classic:201711-01
278+
steps:
279+
- run:
280+
name: Install parallel gzip
281+
command: |
282+
sudo apt-get update && sudo apt-get install -y pigz
283+
- restore_cache:
284+
keys:
285+
- docker-v2-{{ .Branch }}-{{ .Revision }}
286+
- docker-v2-{{ .Branch }}-
287+
- docker-v2-master-
288+
- docker-v2-
289+
paths:
290+
- /tmp/cache/docker.tar.gz
291+
292+
# Load Docker
293+
- run:
294+
name: Load Docker
295+
no_output_timeout: 30m
296+
command: |
297+
docker info
298+
set +o pipefail
299+
pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
300+
docker images
301+
- run:
302+
name: Deploy to Docker Hub
303+
no_output_timeout: 40m
304+
command: |
305+
if [[ -n "$DOCKER_PASS" ]]; then
306+
docker login -u $DOCKER_USER -p $DOCKER_PASS
307+
docker tag bids/${CIRCLE_PROJECT_REPONAME} bids/${CIRCLE_PROJECT_REPONAME}:unstable
308+
docker push bids/${CIRCLE_PROJECT_REPONAME}:unstable
309+
if [[ -n "$CIRCLE_TAG" ]]; then
310+
docker push bids/${CIRCLE_PROJECT_REPONAME}:latest
311+
docker tag bids/${CIRCLE_PROJECT_REPONAME} bids/${CIRCLE_PROJECT_REPONAME}:$CIRCLE_TAG
312+
docker push bids/${CIRCLE_PROJECT_REPONAME}:$CIRCLE_TAG
313+
fi
314+
fi
315+
316+
workflows:
317+
version: 2
318+
build_test_deploy:
319+
jobs:
320+
- get_data:
321+
filters:
322+
tags:
323+
only: /.*/
324+
- build:
325+
filters:
326+
tags:
327+
only: /.*/
328+
- test:
329+
requires:
330+
- get_data
331+
- build
332+
filters:
333+
tags:
334+
only: /.*/
335+
- deploy:
336+
requires:
337+
- test
338+
filters:
339+
branches:
340+
only: master
341+
tags:
342+
only: /.*/

Dockerfile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ ENV LANG=C.UTF-8
7777
ENV LC_ALL=C.UTF-8
7878

7979

80-
RUN pip install nibabel
81-
RUN pip install pybids
82-
RUN pip install duecredit
83-
80+
RUN pip install nibabel==2.2.0
81+
RUN pip install pybids==0.3 grabbit==0.0.8
82+
RUN pip install duecredit==0.6.3
83+
RUN pip install scikit-learn==0.17.1
8484

8585
COPY . /code/
8686
RUN cd /code && ls && pip install -e .

0 commit comments

Comments
 (0)