Skip to content

Commit 22ca05c

Browse files
authored
Merge pull request #1888 from oesteban/fix/CircleTests
[FIX] CircleCI tests
2 parents 852e09a + 2a4f157 commit 22ca05c

File tree

14 files changed

+113
-123
lines changed

14 files changed

+113
-123
lines changed

.circle/codecov.sh

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,8 @@ set -x # Print command traces before executing command.
1313
curl -so codecov.io https://codecov.io/bash
1414
chmod 755 codecov.io
1515

16-
find "${WORKDIR}/" -name 'coverage*.xml' -maxdepth 1 -print0 | \
16+
find "${WORKDIR}/tests/" -name 'coverage*.xml' -maxdepth 1 -print0 | \
1717
xargs -0 -I file ./codecov.io -f file -t "${CODECOV_TOKEN}" -F unittests
18-
find "${WORKDIR}/" -name 'smoketest*.xml' -maxdepth 1 -print0 | \
18+
find "${WORKDIR}/tests/" -name 'smoketest*.xml' -maxdepth 1 -print0 | \
1919
xargs -0 -I file ./codecov.io -f file -t "${CODECOV_TOKEN}" -F smoketests
2020

21-
# Place test and coverage in the tests folder
22-
mkdir -p ${CIRCLE_TEST_REPORTS}/tests/
23-
cp ${WORKDIR}/pytest*.xml ${CIRCLE_TEST_REPORTS}/tests/ || true
24-
cp ${WORKDIR}/coverage*.xml ${CIRCLE_TEST_REPORTS}/tests/ || true
25-
cp ${WORKDIR}/smoketest*.xml ${CIRCLE_TEST_REPORTS}/tests/ || true

.circle/tests.sh

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,23 @@ fi
1717
# They may need to be rebalanced in the future.
1818
case ${CIRCLE_NODE_INDEX} in
1919
0)
20-
docker run --rm -it -e FSL_COURSE_DATA="/data/examples/nipype-fsl_course_data" -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /src/nipype nipype/nipype:py27 /usr/bin/run_pytests.sh py27 && \
21-
docker run --rm -it -e FSL_COURSE_DATA="/data/examples/nipype-fsl_course_data" -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /src/nipype nipype/nipype:py35 /usr/bin/run_pytests.sh py35 && \
22-
docker run --rm -it -v $WORKDIR:/work -w /src/nipype/doc nipype/nipype:py35 /usr/bin/run_builddocs.sh && \
23-
docker run --rm -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh test_spm Linear /data/examples/ workflow3d && \
24-
docker run --rm -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh test_spm Linear /data/examples/ workflow4d
20+
docker run --rm=false -it -e FSL_COURSE_DATA="/data/examples/nipype-fsl_course_data" -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_pytests.sh && \
21+
docker run --rm=false -it -e FSL_COURSE_DATA="/data/examples/nipype-fsl_course_data" -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py27 /usr/bin/run_pytests.sh && \
22+
docker run --rm=false -it -v $WORKDIR:/work -w /src/nipype/doc nipype/nipype:py35 /usr/bin/run_builddocs.sh && \
23+
docker run --rm=false -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh test_spm Linear /data/examples/ workflow3d && \
24+
docker run --rm=false -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh test_spm Linear /data/examples/ workflow4d
2525
;;
2626
1)
27-
docker run --rm -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_dartel Linear /data/examples/ level1 && \
28-
docker run --rm -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_dartel Linear /data/examples/ l2pipeline
27+
docker run --rm=false -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_dartel Linear /data/examples/ level1 && \
28+
docker run --rm=false -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_dartel Linear /data/examples/ l2pipeline
2929
;;
3030
2)
31-
docker run --rm -it -e NIPYPE_NUMBER_OF_CPUS=4 -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py27 /usr/bin/run_examples.sh fmri_spm_nested MultiProc /data/examples/ level1 && \
32-
docker run --rm -it -e NIPYPE_NUMBER_OF_CPUS=4 -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_nested MultiProc /data/examples/ l2pipeline
31+
docker run --rm=false -it -e NIPYPE_NUMBER_OF_CPUS=4 -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py27 /usr/bin/run_examples.sh fmri_spm_nested MultiProc /data/examples/ level1 && \
32+
docker run --rm=false -it -e NIPYPE_NUMBER_OF_CPUS=4 -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_nested MultiProc /data/examples/ l2pipeline
3333
;;
3434
3)
35-
docker run --rm -it -e NIPYPE_NUMBER_OF_CPUS=4 -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_nested MultiProc /data/examples/ level1 && \
36-
docker run --rm -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_fsl_feeds Linear /data/examples/ l1pipeline && \
37-
docker run --rm -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_fsl_reuse Linear /data/examples/ level1_workflow
35+
docker run --rm=false -it -e NIPYPE_NUMBER_OF_CPUS=4 -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_spm_nested MultiProc /data/examples/ level1 && \
36+
docker run --rm=false -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_fsl_feeds Linear /data/examples/ l1pipeline && \
37+
docker run --rm=false -it -v $HOME/examples:/data/examples:ro -v $WORKDIR:/work -w /work nipype/nipype:py35 /usr/bin/run_examples.sh fmri_fsl_reuse Linear /data/examples/ level1_workflow
3838
;;
3939
esac

.coveragerc

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,2 @@
11
[run]
22
branch = True
3-
include = */nipype/*
4-
omit =
5-
*/nipype/external/*
6-
*/nipype/fixes/*
7-
*/setup.py

.dockerignore

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# python cache
2-
__pycache__/**/*
32
__pycache__
3+
**/__pycache__
4+
**/*.pyc
45
*.pyc
56

67
# python distribution
@@ -23,14 +24,14 @@ src/
2324
# other
2425
docs/**/*
2526
docs/
27+
.cache/
2628
.circle/**/*
2729
.circle/
2830
circle.yml
29-
.coverage
30-
.coveragerc
31-
codecov.yml
3231
rtd_requirements.txt
3332
Vagrantfile
3433
.travis.yml
35-
.noserc
34+
.mailmap
3635

36+
# Previous coverage results
37+
.coverage

.noserc

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

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ before_install:
4242
install:
4343
- travis_retry pip install -e .[$NIPYPE_EXTRAS]
4444
script:
45-
- py.test --doctest-modules nipype
45+
- py.test -v --doctest-modules nipype
4646
deploy:
4747
provider: pypi
4848
user: satra

circle.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,17 @@ test:
4949
timeout: 7200
5050
parallel: true
5151
post:
52+
# Place reports in the appropriate folder
53+
- mkdir -p ${CIRCLE_TEST_REPORTS}/tests/ && cp ${WORKDIR}/tests/*.xml ${CIRCLE_TEST_REPORTS}/tests/
5254
# Send coverage data to codecov.io
5355
- bash .circle/codecov.sh
5456

5557
general:
5658
artifacts:
5759
- "~/work/docs"
5860
- "~/work/logs"
61+
- "~/work/tests"
62+
- "~/work/crashfiles"
5963

6064
deployment:
6165
production:

codecov.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,7 @@ coverage:
2222
threshold: 100
2323
flags:
2424
- "smoketests"
25+
ignore: # files and folders that will be removed during processing
26+
- "nipype/external/*"
27+
- "tools/*"
28+
- "doc/*"

docker/files/run_examples.sh

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ arr=$@
88
tmp_var=$( IFS=$' '; echo "${arr[*]}" )
99
example_id=${tmp_var//[^A-Za-z0-9_-]/_}
1010

11-
mkdir -p ${HOME}/.nipype ${WORKDIR}/logs/example_${example_id}
11+
mkdir -p ${HOME}/.nipype ${WORKDIR}/logs/example_${example_id} ${WORKDIR}/tests ${WORKDIR}/crashfiles
1212
echo "[logging]" > ${HOME}/.nipype/nipype.cfg
1313
echo "workflow_level = DEBUG" >> ${HOME}/.nipype/nipype.cfg
1414
echo "interface_level = DEBUG" >> ${HOME}/.nipype/nipype.cfg
@@ -17,23 +17,16 @@ echo "log_to_file = true" >> ${HOME}/.nipype/nipype.cfg
1717
echo "log_directory = ${WORKDIR}/logs/example_${example_id}" >> ${HOME}/.nipype/nipype.cfg
1818

1919
# Set up coverage
20-
echo "[run]" >> .coveragerc
21-
echo "branch = True" >> .coveragerc
22-
echo "source = /src/nipype" >> .coveragerc
23-
echo "include = */nipype/*" >> .coveragerc
24-
echo "omit =" >> .coveragerc
25-
echo " */nipype/external/*" >> .coveragerc
26-
echo " */nipype/fixes/*" >> .coveragerc
27-
echo " */setup.py" >> .coveragerc
28-
29-
30-
parallel=""
20+
export COVERAGE_FILE=${WORKDIR}/tests/.coverage.${example_id}
3121
if [ "$2" == "MultiProc" ]; then
32-
parallel="--concurrency=multiprocessing"
22+
echo "concurrency = multiprocessing" >> /src/nipype/.coveragerc
3323
fi
3424

35-
coverage run ${parallel} /src/nipype/tools/run_examples.py $@
36-
test_exit=$?
37-
coverage xml -o "${WORKDIR}/smoketest_${example_id}.xml"
25+
coverage run /src/nipype/tools/run_examples.py $@
26+
exit_code=$?
27+
28+
# Collect crashfiles and generate xml report
29+
coverage xml -o ${WORKDIR}/tests/smoketest_${example_id}.xml
30+
find /work -name "crash-*" -maxdepth 1 -exec mv {} ${WORKDIR}/crashfiles/ \;
31+
exit $exit_code
3832

39-
exit $test_exit

docker/files/run_pytests.sh

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ set -e
33
set -x
44
set -u
55

6+
7+
TESTPATH=${1:-/src/nipype/}
68
WORKDIR=${WORK:-/work}
79
PYTHON_VERSION=$( python -c "import sys; print('{}{}'.format(sys.version_info[0], sys.version_info[1]))" )
810

911
# Create necessary directories
10-
mkdir -p ${WORKDIR}/crashfiles ${WORKDIR}/logs/py${PYTHON_VERSION}
12+
mkdir -p ${WORKDIR}/tests ${WORKDIR}/crashfiles ${WORKDIR}/logs/py${PYTHON_VERSION}
1113

1214
# Create a nipype config file
1315
mkdir -p ${HOME}/.nipype
@@ -21,19 +23,22 @@ if [[ "${PYTHON_VERSION}" -lt "30" ]]; then
2123
echo 'profile_runtime = true' >> ${HOME}/.nipype/nipype.cfg
2224
fi
2325

24-
cd /src/nipype/
25-
make clean
2626
# Run tests using pytest
27-
py.test -n ${CIRCLE_NCPUS:-4} --doctest-modules --junitxml=${WORKDIR}/pytests_py${PYTHON_VERSION}.xml --cov-report xml:${WORKDIR}/coverage_py${PYTHON_VERSION}.xml --cov=nipype nipype
28-
27+
export COVERAGE_FILE=${WORKDIR}/tests/.coverage.py${PYTHON_VERSION}
28+
py.test -v --junitxml=${WORKDIR}/tests/pytests_py${PYTHON_VERSION}.xml --cov nipype --cov-config /src/nipype/.coveragerc --cov-report xml:${WORKDIR}/tests/coverage_py${PYTHON_VERSION}.xml ${TESTPATH}
29+
exit_code=$?
2930

3031
# Workaround: run here the profiler tests in python 3
3132
if [[ "${PYTHON_VERSION}" -ge "30" ]]; then
3233
echo '[execution]' >> ${HOME}/.nipype/nipype.cfg
3334
echo 'profile_runtime = true' >> ${HOME}/.nipype/nipype.cfg
34-
py.test -n ${CIRCLE_NCPUS:-4} --junitxml=${WORKDIR}/pytests_py${PYTHON_VERSION}_profiler.xml --cov-report xml:${WORKDIR}/coverage_py${PYTHON_VERSION}_profiler.xml --cov=nipype nipype/interfaces/tests/test_runtime_profiler.py
35-
py.test -n ${CIRCLE_NCPUS:-4} --junitxml=${WORKDIR}/pytests_py${PYTHON_VERSION}_multiproc.xml --cov-report xml:${WORKDIR}/coverage_py${PYTHON_VERSION}_multiproc.xml --cov=nipype nipype/pipeline/plugins/tests/test_multiproc*.py
35+
export COVERAGE_FILE=${WORKDIR}/tests/.coverage.py${PYTHON_VERSION}_extra
36+
py.test -v --junitxml=${WORKDIR}/tests/pytests_py${PYTHON_VERSION}_extra.xml --cov nipype --cov-report xml:${WORKDIR}/tests/coverage_py${PYTHON_VERSION}_extra.xml /src/nipype/nipype/interfaces/tests/test_runtime_profiler.py /src/nipype/nipype/pipeline/plugins/tests/test_multiproc*.py
37+
exit_code=$(( $exit_code + $? ))
3638
fi
3739

38-
# Copy crashfiles to scratch
39-
find /src/nipype/ -name "crash-*" -exec cp {} ${WORKDIR}/crashfiles/ \;
40+
find /work -name "crash-*" -maxdepth 1 -exec mv {} ${WORKDIR}/crashfiles/ \;
41+
42+
# Just in case output xml files are misplaced,
43+
# then circle would not tell the tests failed otherwise
44+
exit ${exit_code}

0 commit comments

Comments
 (0)