Skip to content

Commit a29400b

Browse files
author
jakubk
committed
enh: optimize + use nipype/nipype dockerhub repo
- use master branch for caching - replace kaczmarj/nipype with nipype/nipype - reset cache prefixes - use latest docker (v17.10.0-ce) containers and machine - use environment variable to determine whether to pull or build base image - save docker images to tar.gz if on master branch (deploying) - use fastest gzip compression (gives good ratio of speed/compression)
1 parent 637f033 commit a29400b

File tree

1 file changed

+47
-38
lines changed

1 file changed

+47
-38
lines changed

.circleci/config.yml

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ jobs:
33

44
compare_base_dockerfiles:
55
docker:
6-
- image: docker:17.09.0-ce-git
6+
- image: docker:17.10.0-ce-git
77
steps:
88
- checkout:
99
path: /home/circleci/nipype
@@ -15,32 +15,28 @@ jobs:
1515
# Use the sha256 sum of the pruned Dockerfile as the cache key.
1616
ash prune_dockerfile.sh Dockerfile.base > /tmp/docker/Dockerfile.base-pruned
1717
- restore_cache:
18-
# TODO: change this to 'master' after we are sure this works.
19-
key: dftest-v5-enh/circleci-neurodocker-{{ checksum "/tmp/docker/Dockerfile.base-pruned" }}
18+
key: dockerfile-cache-v1-master-{{ checksum "/tmp/docker/Dockerfile.base-pruned" }}
2019
- run:
2120
name: Determine how to get base image
2221
command: |
23-
GET_BASE="/tmp/docker/get_base_image.sh"
24-
25-
# This directory comes from the cache.
26-
if [ -d /cache/base-dockerfile ]; then
27-
echo "echo Pulling base image ..." > "$GET_BASE"
28-
echo "docker pull kaczmarj/nipype:base" >> "$GET_BASE"
22+
if [ -f /tmp/docker/cache/Dockerfile.base-pruned ]; then
23+
echo "Cache found. Will pull base image."
24+
echo 'export GET_BASE=PULL' > /tmp/docker/get_base_image.sh
2925
else
30-
echo "echo Building base image ..." > "$GET_BASE"
31-
echo "docker build -t kaczmarj/nipype:base - < /home/circleci/nipype/docker/Dockerfile.base" >> "$GET_BASE"
26+
echo "Cache not found. Will build base image."
27+
echo 'export GET_BASE=BUILD' > /tmp/docker/get_base_image.sh
3228
fi
3329
- persist_to_workspace:
3430
root: /tmp
3531
paths:
36-
- docker/*
32+
- docker/get_base_image.sh
3733

3834

3935
build_and_test:
4036
parallelism: 4
4137
machine:
42-
# Ubuntu 14.04 with Docker 17.03.0-ce
43-
image: circleci/classic:201703-01
38+
# Ubuntu 14.04 with Docker 17.10.0-ce
39+
image: circleci/classic:201710-02
4440
steps:
4541
- checkout:
4642
path: /home/circleci/nipype
@@ -60,10 +56,19 @@ jobs:
6056
- run:
6157
name: Get base image (pull or build)
6258
no_output_timeout: 60m
63-
# TODO: remove `docker pull` once once caching works.
59+
working_directory: /home/circleci/nipype
6460
command: |
65-
# bash /tmp/docker/get_base_image.sh
66-
docker pull kaczmarj/nipype:base
61+
source /tmp/docker/get_base_image.sh
62+
if [ "$GET_BASE" == "PULL" ]; then
63+
echo "Pulling base image ..."
64+
docker pull nipype/nipype:base
65+
elif [ "$GET_BASE" == "BUILD" ]; then
66+
echo "Building base image ..."
67+
docker build -t nipype/nipype:base - < docker/Dockerfile.base
68+
else
69+
echo "Error: method to get base image not understood"
70+
exit 1
71+
fi
6772
- run:
6873
name: Build main image (py36)
6974
no_output_timeout: 60m
@@ -72,8 +77,8 @@ jobs:
7277
e=1 && for i in {1..5}; do
7378
docker build \
7479
--rm=false \
75-
--tag kaczmarj/nipype:latest \
76-
--tag kaczmarj/nipype:py36 \
80+
--tag nipype/nipype:latest \
81+
--tag nipype/nipype:py36 \
7782
--build-arg BUILD_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
7883
--build-arg VCS_REF="$(git rev-parse --short HEAD)" \
7984
--build-arg VERSION="${CIRCLE_TAG}" /home/circleci/nipype \
@@ -87,7 +92,7 @@ jobs:
8792
e=1 && for i in {1..5}; do
8893
docker build \
8994
--rm=false \
90-
--tag kaczmarj/nipype:py27 \
95+
--tag nipype/nipype:py27 \
9196
--build-arg PYTHON_VERSION_MAJOR=2 \
9297
--build-arg PYTHON_VERSION_MINOR=7 \
9398
--build-arg BUILD_DATE="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" \
@@ -125,21 +130,26 @@ jobs:
125130
name: Save Docker images to workspace
126131
no_output_timeout: 60m
127132
command: |
128-
if [ "$CIRCLE_NODE_INDEX" -eq "0" ]; then
129-
docker save kaczmarj/nipype:base \
130-
kaczmarj/nipype:latest \
131-
kaczmarj/nipype:py36 \
132-
kaczmarj/nipype:py27 > /tmp/docker/nipype-base-latest-py36-py27.tar
133+
if [ "$CIRCLE_NODE_INDEX" -eq "0" ] && [ "$CIRCLE_BRANCH" == "master" ]; then
134+
docker save nipype/nipype:base \
135+
nipype/nipype:latest \
136+
nipype/nipype:py36 \
137+
nipype/nipype:py27 | gzip -1 > /tmp/docker/nipype-base-latest-py36-py27.tar.gz
138+
du -h /tmp/docker/nipype-base-latest-py36-py27.tar.gz
139+
else
140+
# Workaround for `persist_to_workspace` to succeed when we are
141+
# not deploying Docker images.
142+
touch /tmp/docker/nipype-base-latest-py36-py27.tar.gz
133143
fi
134144
- persist_to_workspace:
135145
root: /tmp
136146
paths:
137-
- docker/*
147+
- docker/nipype-base-latest-py36-py27.tar.gz
138148

139149

140150
deploy:
141151
docker:
142-
- image: docker:17.09.0-ce-git
152+
- image: docker:17.10.0-ce-git
143153
steps:
144154
- checkout:
145155
path: /home/circleci/nipype
@@ -150,27 +160,27 @@ jobs:
150160
name: Load saved Docker images.
151161
no_output_timeout: 60m
152162
command: |
153-
docker load < /tmp/docker/nipype-base-latest-py36-py27.tar
163+
docker load < /tmp/docker/nipype-base-latest-py36-py27.tar.gz
154164
- run:
155165
name: Push to DockerHub
156166
no_output_timeout: 120m
157167
command: |
158168
echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin
159-
docker push kaczmarj/nipype:base
160-
docker push kaczmarj/nipype:latest
161-
docker push kaczmarj/nipype:py36
162-
docker push kaczmarj/nipype:py27
169+
docker push nipype/nipype:base
170+
docker push nipype/nipype:latest
171+
docker push nipype/nipype:py36
172+
docker push nipype/nipype:py27
163173
- run:
164174
name: Prune base Dockerfile to update cache
165175
working_directory: /home/circleci/nipype/docker
166176
command: |
167-
mkdir -p /tmp/docker
177+
mkdir -p /tmp/docker/cache
168178
# Use the sha256 sum of the pruned Dockerfile as the cache key.
169-
ash prune_dockerfile.sh Dockerfile.base > /tmp/docker/Dockerfile.base-pruned
179+
ash prune_dockerfile.sh Dockerfile.base > /tmp/docker/cache/Dockerfile.base-pruned
170180
- save_cache:
171181
paths:
172-
- /tmp/docker/Dockerfile.base-pruned
173-
key: dftest-v5-{{ .Branch }}-{{ checksum "/tmp/docker/Dockerfile.base-pruned" }}
182+
- /tmp/docker/cache/Dockerfile.base-pruned
183+
key: dockerfile-cache-v1-{{ .Branch }}-{{ checksum "/tmp/docker/cache/Dockerfile.base-pruned" }}
174184

175185

176186
workflows:
@@ -184,7 +194,6 @@ workflows:
184194
- deploy:
185195
filters:
186196
branches:
187-
# TODO: change this to master after we are sure this works.
188-
only: enh/circleci-neurodocker
197+
only: master
189198
requires:
190199
- build_and_test

0 commit comments

Comments
 (0)