summaryrefslogtreecommitdiffstats
path: root/.travis.yml
blob: 76f6db060af67d4ebfbc23b597ed45e585e66778 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
dist: trusty
language: python

notifications:
  irc: "chat.freenode.net#scons"

addons:
    apt:
      update: true

os:
  - linux

sudo: required

install:
    - ./.travis/install.sh

# pypy is not passing, but allow failures for coverage stage to be reached
matrix:
  allow_failures:
    - python: pypy

jobs:
  include:
    - &test_job
      stage: Test
      script: python runtest.py -a || if [[ $? == 2 ]]; then true; else false; fi
      before_script: skip
      after_success: skip
      python: 2.7
      env: PYVER=27
      sudo: required

    - <<: *test_job
      python: 3.5
      env: PYVER=35
      sudo: required

    - <<: *test_job
      python: 3.6
      env: PYVER=36
      sudo: required

    - <<: *test_job
      python: 3.7
      env: 
        - PYVER=37
      sudo: required
      dist: xenial  # required for Python 3.7 (travis-ci/travis-ci#9069)

    - <<: *test_job
      python: pypy
      env: PYVER=pypy
      sudo: required


    - &coverage_jobs
      stage: Coverage
      
      before_script:
        - sudo pip install coverage
        - sudo pip install coveralls
        # set this ensure user sites are available
        - export PYTHONNOUSERSITE=
        # attempt to get a location where we can store the usercustomize.py file
        - python -m site
        - export PYSITEDIR=$(python -m site --user-site)
        - sudo mkdir -p $PYSITEDIR
        - sudo touch ${PYSITEDIR}/usercustomize.py
        - export COVERAGE_FILE=$PWD/.coverage_file
        # write the usercustomize.py file so all python processes use coverage and know where the config file is
        - echo "import os" | sudo tee --append ${PYSITEDIR}/usercustomize.py
        - echo "os.environ['COVERAGE_PROCESS_START'] = '$PWD/.coveragerc'" | sudo tee --append ${PYSITEDIR}/usercustomize.py
        - echo "import coverage" | sudo tee --append ${PYSITEDIR}/usercustomize.py
        - echo "coverage.process_startup()" | sudo tee --append ${PYSITEDIR}/usercustomize.py

      script: 
        - export TOTAL_BUILD_JOBS=8
        # write the coverage config file
        - export COVERAGE_PROCESS_START=$PWD/.coveragerc
        - echo "[run]" >> .coveragerc
        - echo "source = $PWD/src" >> .coveragerc
        - echo "parallel = True" >> .coveragerc
        - printf "omit =\n\t*Tests.py\n\tsrc/test_*\n\tsrc/setup.py\n\n" >> .coveragerc
        - echo "[path] = $PWD" >> .coveragerc
        # get a list of all the tests to split them up
        - python runtest.py -l -a > all_tests
        - let "start = ($(wc -l < all_tests) / ${TOTAL_BUILD_JOBS}) * (${BUILD_JOB_NUM} - 1)"; true;
        - let "end = ($(wc -l < all_tests) / ${TOTAL_BUILD_JOBS}) * ${BUILD_JOB_NUM}"
        - if (( ${BUILD_JOB_NUM} == ${TOTAL_BUILD_JOBS} )); then end=$(wc -l < all_tests); fi
        - if (( ${start} == 0 )); then start=1; fi
        - sed -n ${start},${end}p all_tests > build_tests
        - coverage run -p --rcfile=$PWD/.coveragerc runtest.py -f build_tests || if [[ $? == 2 ]]; then true; else false; fi

      after_success:
        - coverage combine
        - coverage report
        - coveralls --rcfile=$PWD/.coveragerc

      env: BUILD_JOB_NUM=1

    - <<: *coverage_jobs
      env: BUILD_JOB_NUM=2
    - <<: *coverage_jobs
      env: BUILD_JOB_NUM=3
    - <<: *coverage_jobs
      env: BUILD_JOB_NUM=4
    - <<: *coverage_jobs
      env: BUILD_JOB_NUM=5
    - <<: *coverage_jobs
      env: BUILD_JOB_NUM=6
    - <<: *coverage_jobs
      env: BUILD_JOB_NUM=7
    - <<: *coverage_jobs
      env: BUILD_JOB_NUM=8