Skip to content

Commit 3a0341f

Browse files
authored
Merge pull request #46 from nipreps/maint/optimize-circle
MAINT: Use a local docker registry instead of load/save
2 parents 563d330 + 98c5e80 commit 3a0341f

File tree

5 files changed

+112
-125
lines changed

5 files changed

+112
-125
lines changed

.circleci/config.yml

Lines changed: 104 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ version: 2
2525
jobs:
2626

2727
build:
28+
machine:
29+
image: circleci/classic:201711-01
30+
working_directory: /tmp/src/dmriprep
2831
environment:
2932
TZ: "/usr/share/zoneinfo/America/Los_Angeles"
3033
SCRATCH: "/scratch"
31-
docker:
32-
- image: docker:18.01.0-ce-git
33-
working_directory: /tmp/src/dmriprep
3434
steps:
3535
- checkout
3636
- run:
@@ -40,34 +40,46 @@ jobs:
4040
echo "Only docs build"
4141
circleci step halt
4242
fi
43-
44-
- run:
45-
name: Install parallel gzip and python3
46-
command: |
47-
apk add --no-cache pigz python3
4843
- restore_cache:
4944
keys:
50-
- docker-v0-{{ .Branch }}-{{ .Revision }}
51-
- docker-v0-{{ .Branch }}-
52-
- docker-v0-master-
53-
- docker-v0-
45+
- build-v1-{{ .Branch }}-{{ epoch }}
46+
- build-v1-{{ .Branch }}-
47+
- build-v1-master-
48+
- build-v1-
5449
paths:
55-
- /tmp/cache/docker.tar.gz
56-
- setup_remote_docker
50+
- /tmp/docker
5751
- run:
58-
name: Load Docker image layer cache
59-
no_output_timeout: 30m
52+
name: Set-up a Docker registry
6053
command: |
61-
docker info
62-
set +o pipefail
63-
if [ -f /tmp/cache/docker.tar.gz ]; then
64-
pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
65-
docker images
54+
docker run -d -p 5000:5000 --restart=always --name=registry \
55+
-v /tmp/docker:/var/lib/registry registry:2
56+
- run:
57+
name: Pull images
58+
command: |
59+
set +e
60+
docker pull localhost:5000/ubuntu
61+
success=$?
62+
set -e
63+
if [[ "$success" = "0" ]]; then
64+
echo "Pulling from local registry"
65+
docker tag localhost:5000/ubuntu ubuntu:xenial-20191010
66+
docker pull localhost:5000/dmriprep
67+
docker tag localhost:5000/dmriprep nipreps/dmriprep:latest
68+
docker tag localhost:5000/dmriprep nipreps/dmriprep
69+
else
70+
echo "Pulling from Docker Hub"
71+
docker pull ubuntu:xenial-20191010
72+
docker tag ubuntu:xenial-20191010 localhost:5000/ubuntu
73+
docker push localhost:5000/ubuntu
74+
docker pull nipreps/dmriprep:latest
6675
fi
6776
- run:
6877
name: Build Docker image
6978
no_output_timeout: 60m
7079
command: |
80+
export PY3=$(pyenv versions | grep '3\.' |
81+
sed -e 's/.* 3\./3./' -e 's/ .*//')
82+
pyenv local $PY3
7183
# Get version, update files.
7284
THISVERSION=$( python3 get_version.py )
7385
if [[ ${THISVERSION:0:2} == "0+" ]] ; then
@@ -78,54 +90,34 @@ jobs:
7890
fi
7991
# Build docker image
8092
e=1 && for i in {1..5}; do
81-
docker build \
93+
docker build --rm \
8294
--cache-from=nipreps/dmriprep \
83-
--rm=false \
8495
-t nipreps/dmriprep:latest \
8596
--build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` \
8697
--build-arg VCS_REF=`git rev-parse --short HEAD` \
8798
--build-arg VERSION="${CIRCLE_TAG:-$THISVERSION}" . \
8899
&& e=0 && break || sleep 15
89100
done && [ "$e" -eq "0" ]
90-
# test if development image should be built
91-
if [[ "$( git log --format=oneline -n 1 $CIRCLE_SHA1 | grep -i -E '\[build[ _]?devel\]' )" != "" ]]; then
92-
echo "building development container"
93-
docker tag nipreps/dmriprep nipreps/dmriprep:unstable
94-
docker build \
95-
--rm=false \
96-
-t nipreps/dmriprep_devel \
97-
-f Dockerfile_devel .
98-
fi
99-
100101
- run:
101-
name: Docker save
102+
name: Docker push to local registry
102103
no_output_timeout: 40m
103104
command: |
104-
mkdir -p /tmp/cache
105-
docker save ubuntu:xenial-20161213 nipreps/dmriprep:latest \
106-
| pigz -3 > /tmp/cache/docker.tar.gz
107-
- save_cache:
108-
key: docker-v0-{{ .Branch }}-{{ .Revision }}-{{ epoch }}
109-
paths:
110-
- /tmp/cache/docker.tar.gz
111-
105+
docker tag nipreps/dmriprep:latest localhost:5000/dmriprep
106+
docker push localhost:5000/dmriprep
112107
- run:
113-
name: Smoke test Docker image
108+
name: Docker registry garbage collection
114109
command: |
115-
THISVERSION=$( python3 get_version.py )
116-
THISVERSION=${THISVERSION%.dirty*}
117-
THISVERSION=${CIRCLE_TAG:-$THISVERSION}
118-
DOCKERVERSION=$(docker run --rm -it nipreps/dmriprep:latest --version)
119-
DOCKERVERSION=${DOCKERVERSION%$'\r'}
120-
DOCKERVERSION=${DOCKERVERSION#*"dmriprep v"}
121-
echo "VERSION: \"$THISVERSION\""
122-
echo "DOCKERVERSION: \"${DOCKERVERSION}\""
123-
test "$DOCKERVERSION" = "$THISVERSION"
124-
110+
docker exec -it registry /bin/registry garbage-collect --delete-untagged \
111+
/etc/docker/registry/config.yml
112+
- save_cache:
113+
key: build-v1-{{ .Branch }}-{{ epoch }}
114+
paths:
115+
- /tmp/docker
125116
- persist_to_workspace:
126117
root: /tmp
127118
paths:
128119
- src/dmriprep
120+
129121
get_data:
130122
machine:
131123
# Ubuntu 14.04 with Docker 17.10.0-ce
@@ -207,32 +199,30 @@ jobs:
207199
at: /tmp
208200
- restore_cache:
209201
keys:
210-
- docker-v0-{{ .Branch }}-{{ .Revision }}
202+
- data-v0-{{ .Revision }}
211203
- restore_cache:
212204
keys:
213-
- data-v0-{{ .Revision }}
205+
- build-v1-{{ .Branch }}-{{ epoch }}
206+
- build-v1-{{ .Branch }}-
207+
- build-v1-
208+
paths:
209+
- /tmp/docker
210+
- run:
211+
name: Set-up a Docker registry
212+
command: |
213+
docker run -d -p 5000:5000 --restart=always --name=registry \
214+
-v /tmp/docker:/var/lib/registry registry:2
215+
- run:
216+
name: Pull images from local registry
217+
command: |
218+
docker pull localhost:5000/dmriprep
219+
docker tag localhost:5000/dmriprep nipreps/dmriprep:latest
214220
- restore_cache:
215221
keys:
216222
- THP002-anat-v00-{{ .Branch }}-{{ .Revision }}
217223
- THP002-anat-v00-{{ .Branch }}
218224
- THP002-anat-v00-master
219225
- THP002-anat-v00-
220-
- run:
221-
name: Setting up test
222-
command: |
223-
mkdir -p /tmp/THP002/derivatives && sudo setfacl -d -m group:$(id -gn):rwx /tmp/THP002/derivatives && sudo setfacl -m group:$(id -gn):rwx /tmp/THP002/derivatives
224-
pip install --upgrade pip setuptools
225-
- run:
226-
name: Load Docker image layer cache
227-
no_output_timeout: 30m
228-
command: |
229-
docker info
230-
set +o pipefail
231-
if [ -f /tmp/cache/docker.tar.gz ]; then
232-
sudo apt update && sudo apt -y install pigz
233-
pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
234-
docker images
235-
fi
236226
- run:
237227
name: Run anatomical workflow on THP002
238228
no_output_timeout: 2h
@@ -286,21 +276,40 @@ jobs:
286276
image: circleci/classic:201711-01
287277
working_directory: /tmp/src/dmriprep
288278
steps:
289-
279+
- run:
280+
name: Check whether image should be deployed to Docker Hub
281+
command: |
282+
if [[ "$CIRCLE_PROJECT_USERNAME" != "nipreps" ]]; then
283+
echo "Nothing to deploy for $CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME."
284+
circleci step halt
285+
fi
286+
- checkout:
287+
path: /home/circleci/src/dmriprep
288+
- run:
289+
name: Check whether build should be skipped
290+
command: |
291+
cd /home/circleci/src/dmriprep
292+
if [[ "$( git log --format='format:%s' -n 1 $CIRCLE_SHA1 | grep -i -E '^docs?(\(\w+\))?:' )" != "" ]]; then
293+
echo "Only docs build"
294+
circleci step halt
295+
fi
290296
- restore_cache:
291297
keys:
292-
- docker-v0-{{ .Branch }}-{{ .Revision }}
298+
- build-v1-{{ .Branch }}-{{ epoch }}
299+
- build-v1-{{ .Branch }}-
300+
- build-v1-
301+
paths:
302+
- /tmp/docker
293303
- run:
294-
name: Load Docker image layer cache
295-
no_output_timeout: 30m
304+
name: Set-up a Docker registry
296305
command: |
297-
docker info
298-
set +o pipefail
299-
if [ -f /tmp/cache/docker.tar.gz ]; then
300-
sudo apt update && sudo apt -y install pigz
301-
pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
302-
docker images
303-
fi
306+
docker run -d -p 5000:5000 --restart=always --name=registry \
307+
-v /tmp/docker:/var/lib/registry registry:2
308+
- run:
309+
name: Pull images from local registry
310+
command: |
311+
docker pull localhost:5000/dmriprep
312+
docker tag localhost:5000/dmriprep nipreps/dmriprep:latest
304313
- run:
305314
name: Deploy to Docker Hub
306315
no_output_timeout: 40m
@@ -335,18 +344,21 @@ jobs:
335344
fi
336345
- restore_cache:
337346
keys:
338-
- docker-v0-{{ .Branch }}-{{ .Revision }}
347+
- build-v1-{{ .Branch }}-{{ epoch }}
348+
- build-v1-{{ .Branch }}-
349+
- build-v1-
350+
paths:
351+
- /tmp/docker
339352
- run:
340-
name: Load Docker image layer cache
341-
no_output_timeout: 30m
353+
name: Set-up a Docker registry
342354
command: |
343-
docker info
344-
set +o pipefail
345-
if [ -f /tmp/cache/docker.tar.gz ]; then
346-
sudo apt update && sudo apt -y install pigz
347-
pigz -d --stdout /tmp/cache/docker.tar.gz | docker load
348-
docker images
349-
fi
355+
docker run -d -p 5000:5000 --restart=always --name=registry \
356+
-v /tmp/docker:/var/lib/registry registry:2
357+
- run:
358+
name: Pull images from local registry
359+
command: |
360+
docker pull localhost:5000/dmriprep
361+
docker tag localhost:5000/dmriprep nipreps/dmriprep:latest
350362
- run:
351363
name: Deploy to Docker Hub
352364
no_output_timeout: 40m

.circleci/pypi_wheel/build-wheels.sh

Lines changed: 0 additions & 22 deletions
This file was deleted.

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Use Ubuntu 16.04 LTS
2-
FROM ubuntu:xenial-20161213
2+
FROM ubuntu:xenial-20191010
33

44
# Pre-cache neurodebian key
55
COPY .docker/neurodebian.gpg /usr/local/etc/neurodebian.gpg

docs/requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
git+https://github.com/AleksandarPetrov/napoleon.git@0dc3f28a309ad602be5f44a9049785a1026451b3#egg=sphinxcontrib-napoleon
22
git+https://github.com/rwblair/sphinxcontrib-versioning.git@39b40b0b84bf872fc398feff05344051bbce0f63#egg=sphinxcontrib-versioning
33
nbsphinx
4-
nipype>=1.3.0rc1
5-
niworkflows ~= 1.0.1
4+
nipype ~= 1.3.1
5+
niworkflows ~= 1.1.0
66
packaging
77
pydot>=1.2.3
88
pydotplus

setup.cfg

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,16 @@ python_requires = >=3.5
2222
install_requires =
2323
dipy >= 1.0.0
2424
indexed_gzip >=0.8.8
25-
nibabel >=2.2.1
25+
nibabel ~= 3.0.0rc1
2626
nilearn !=0.5.0, !=0.5.1
27-
nipype >=1.2.0
28-
niworkflows ~= 1.0.1
27+
nipype ~= 1.3.1
28+
niworkflows ~= 1.1.0
2929
numpy
30-
pandas
3130
psutil >=5.4
3231
pybids ~= 0.9.2
3332
pyyaml
34-
scikit-image
35-
smriprep ~= 0.4.0
36-
statsmodels
37-
templateflow ~= 0.4.1
33+
smriprep ~= 0.4.1
34+
templateflow ~= 0.4.2rc
3835
test_requires =
3936
codecov
4037
coverage

0 commit comments

Comments
 (0)