.gitlab-ci.yml 9.83 KB
Newer Older
1
image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-debian:9-master-46405991
2

3
cache:
4
  key: "$CI_JOB_NAME-"
5
  paths:
6
    - cache/
7

8 9
stages:
  - test
10
  - post
11
  - publish
12

13 14 15
variables:
  PYTEST_ADDOPTS: "--color=yes"
  INTEGRATION_CACHE: "${CI_PROJECT_DIR}/cache/integration-cache"
16 17 18
  PYTEST_ARGS: "--color=yes --integration -n 2"
  TEST_COMMAND: "tox -- ${PYTEST_ARGS}"
  EXTERNAL_TESTS_COMMAND: "tox -e py{35,36,37}-external -- ${PYTEST_ARGS}"
19
  COVERAGE_PREFIX: "${CI_JOB_NAME}."
20

21

22 23 24 25
#####################################################
#                    Test stage                     #
#####################################################

26 27
# Run premerge commits
#
28
.tests-template: &tests
29
  stage: test
30

31
  before_script:
32 33 34
  # Diagnostics
  - mount
  - df -h
35
  - tox --version
36

37
  script:
Benjamin Schubert's avatar
Benjamin Schubert committed
38
  - mkdir -p "${INTEGRATION_CACHE}"
39 40 41
  - useradd -Um buildstream
  - chown -R buildstream:buildstream .

42
  # Run the tests as a simple user to test for permission issues
43
  - su buildstream -c "${TEST_COMMAND}"
44
  - su buildstream -c "${EXTERNAL_TESTS_COMMAND}"
45

46 47 48
  after_script:
  except:
  - schedules
49 50
  artifacts:
    paths:
51
    - .coverage-reports
52

53
tests-debian-9:
54
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-debian:9-master-46405991
55
  <<: *tests
56

57
tests-fedora-28:
58
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:28-master-46405991
59
  <<: *tests
60

61 62 63 64
tests-fedora-29:
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
  <<: *tests

65
tests-ubuntu-18.04:
66
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-ubuntu:18.04-master-46405991
67
  <<: *tests
Valentin David's avatar
Valentin David committed
68

Benjamin Schubert's avatar
Benjamin Schubert committed
69 70
tests-centos-7.6:
  <<: *tests
71
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-centos:7.6.1810-master-46405991
Benjamin Schubert's avatar
Benjamin Schubert committed
72

73 74
overnight-fedora-29-aarch64:
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:aarch64-29-master-47052095
Valentin David's avatar
Valentin David committed
75 76
  tags:
    - aarch64
77 78 79 80
  <<: *tests
  # We need to override the exclusion from the template
  # in order to run on schedules
  except: []
81 82
  only:
  - schedules
83 84 85 86 87 88
  before_script:
    # grpcio needs to be compiled from source on aarch64 so we additionally
    # need a C++ compiler here.
    # FIXME: Ideally this would be provided by the base image. This will be
    # unblocked by https://gitlab.com/BuildStream/buildstream-docker-images/issues/34
    - dnf install -y gcc-c++
89

90
tests-unix:
91 92
  # Use fedora here, to a) run a test on fedora and b) ensure that we
  # can get rid of ostree - this is not possible with debian-8
93
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
94
  <<: *tests
95 96
  variables:
    BST_FORCE_BACKEND: "unix"
97

98
  script:
99

100
    # We remove the Bubblewrap and OSTree packages here so that we catch any
101 102
    # codepaths that try to use them. Removing OSTree causes fuse-libs to
    # disappear unless we mark it as user-installed.
103
    - dnf mark install fuse-libs systemd-udev
104
    - dnf erase -y bubblewrap ostree
105 106

    # Since the unix platform is required to run as root, no user change required
107
    - ${TEST_COMMAND}
108

109 110
tests-fedora-missing-deps:
  # Ensure that tests behave nicely while missing bwrap and ostree
111
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
112 113 114 115 116 117
  <<: *tests

  script:
    # We remove the Bubblewrap and OSTree packages here so that we catch any
    # codepaths that try to use them. Removing OSTree causes fuse-libs to
    # disappear unless we mark it as user-installed.
118
    - dnf mark install fuse-libs systemd-udev
119 120 121 122 123
    - dnf erase -y bubblewrap ostree

    - useradd -Um buildstream
    - chown -R buildstream:buildstream .

124
    - ${TEST_COMMAND}
125

126 127 128 129
tests-fedora-update-deps:
  # Check if the tests pass after updating requirements to their latest
  # allowed version.
  allow_failure: true
130
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
131 132 133 134 135 136 137 138 139 140 141
  <<: *tests

  script:
    - useradd -Um buildstream
    - chown -R buildstream:buildstream .

    - make --always-make --directory requirements
    - cat requirements/*.txt

    - su buildstream -c "${TEST_COMMAND}"

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
tests-remote-execution:
  allow_failure: true
  image: registry.gitlab.com/buildstream/buildstream-docker-images/testsuite-fedora:29-master-47052095
  <<: *tests
  before_script:
    - dnf install -y docker docker-compose
    - docker-compose --file ${COMPOSE_MANIFEST} up --detach
  after_script:
    - docker-compose --file ${COMPOSE_MANIFEST} stop
    - docker-compose --file ${COMPOSE_MANIFEST} logs
    - docker-compose --file ${COMPOSE_MANIFEST} down
  services:
    - docker:stable-dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_DRIVER: overlay2
    COMPOSE_MANIFEST: .gitlab-ci/buildgrid-compose.yml
    ARTIFACT_CACHE_SERVICE: http://docker:50052
    REMOTE_EXECUTION_SERVICE: http://docker:50051
    SOURCE_CACHE_SERVICE: http://docker:50052
    PYTEST_ARGS: "--color=yes --remote-execution"


165 166 167 168 169 170 171 172 173 174 175 176
# Lint separately from testing
lint:
  stage: test

  before_script:
  # Diagnostics
  - python3 --version

  script:
  - tox -e lint
  except:
  - schedules
177

178
tests-wsl-master:
179 180 181 182 183 184 185 186 187
  stage: test
  variables:
    LC_ALL: C.UTF-8
    LANG: C.UTF-8
  tags:
  - wsl
  before_script:
  - mount
  - df -h
188
  - PATH=/root/.local/bin:$PATH tox --version
189 190 191 192
  script:
  - PATH=/root/.local/bin:$PATH ${TEST_COMMAND}
  only:
  - master
193

194 195 196 197 198 199 200 201 202 203 204
tests-wsl-non-master:
  stage: test
  variables:
    LC_ALL: C.UTF-8
    LANG: C.UTF-8
  tags:
  - wsl
  before_script:
  - mount
  - df -h
  - PATH=/root/.local/bin:$PATH tox --version
205
  script:
206
  - PATH=/root/.local/bin:$PATH ${TEST_COMMAND}
207 208 209
  when: manual
  except:
  - master
210

211 212 213 214
# Automatically build documentation for every commit, we want to know
# if building documentation fails even if we're not deploying it.
docs:
  stage: test
215 216
  variables:
    BST_FORCE_SESSION_REBUILD: 1
217
  script:
218 219
  - env BST_SOURCE_CACHE="$(pwd)/cache/integration-cache/sources" tox -e docs
  - mv doc/build/html public
220 221
  except:
  - schedules
222 223 224 225
  artifacts:
    paths:
    - public/

226 227 228
.overnight-tests: &overnight-tests-template
  stage: test
  variables:
Tiago Gomes's avatar
Tiago Gomes committed
229
    BST_EXT_URL: git+https://gitlab.com/BuildStream/bst-external.git
230
    BST_EXT_REF: 0.9.0-0-g63a19e8068bd777bd9cd59b1a9442f9749ea5a85
231
    FD_SDK_REF: freedesktop-sdk-18.08.28-0-g29cf2127554cdd83a1532afa53824b23cee2eed3
232
  before_script:
233 234 235 236 237 238
  - |
    mkdir -p "${HOME}/.config"
    cat <<EOF >"${HOME}/.config/buildstream.conf"
    scheduler:
      fetchers: 2
    EOF
239 240
  - pip3 install -r requirements/requirements.txt -r requirements/plugin-requirements.txt
  - pip3 install --no-index .
Tiago Gomes's avatar
Tiago Gomes committed
241
  - pip3 install --user -e ${BST_EXT_URL}@${BST_EXT_REF}#egg=bst_ext
242
  - git clone https://gitlab.com/freedesktop-sdk/freedesktop-sdk.git
Tiago Gomes's avatar
Tiago Gomes committed
243
  - git -C freedesktop-sdk checkout ${FD_SDK_REF}
244 245 246
  artifacts:
    paths:
    - "${HOME}/.cache/buildstream/logs"
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
  only:
  - schedules

overnight-tests:
  <<: *overnight-tests-template
  script:
  - make -C freedesktop-sdk
  tags:
  - overnight-tests

overnight-tests-no-cache:
  <<: *overnight-tests-template
  script:
  - sed -i '/artifacts:/,+1 d' freedesktop-sdk/project.conf
  - make -C freedesktop-sdk
  tags:
  - overnight-tests
264

265
# Check code quality with gitlab's built-in feature.
266
#
267
code_quality:
268
  image: docker:stable
269
  stage: test
270 271 272 273 274 275 276 277 278 279 280 281
  variables:
    DOCKER_DRIVER: overlay2
  allow_failure: true
  services:
    - docker:stable-dind
  script:
    - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
    - docker run
        --env SOURCE_CODE="$PWD"
        --volume "$PWD":/code
        --volume /var/run/docker.sock:/var/run/docker.sock
        "registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
282 283
  except:
  - schedules
284
  artifacts:
285
    paths: [gl-code-quality-report.json]
286

287 288 289 290
#####################################################
#                    Post stage                     #
#####################################################

291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
analysis:
  stage: post
  script:
  - |
    pip3 install radon
    mkdir analysis

  - |
    echo "Calculating Maintainability Index"
    radon mi -s -j buildstream > analysis/mi.json
    radon mi -s buildstream

  - |
    echo "Calculating Cyclomatic Complexity"
    radon cc -a -s -j buildstream > analysis/cc.json
    radon cc -a -s buildstream

  - |
    echo "Calculating Raw Metrics"
    radon raw -s -j buildstream > analysis/raw.json
    radon raw -s buildstream

313 314
  except:
  - schedules
315 316 317 318
  artifacts:
    paths:
    - analysis/

319 320 321
# Collate coverage reports
#
coverage:
322
  stage: post
323
  coverage: '/TOTAL +\d+ +\d+ +(\d+\.\d+)%/'
324
  script:
325 326 327
    - cp -a .coverage-reports/ ./coverage-sources
    - tox -e coverage
    - cp -a .coverage-reports/ ./coverage-report
328
  dependencies:
329
  - tests-centos-7.6
330
  - tests-debian-9
331
  - tests-fedora-28
332
  - tests-fedora-29
333
  - tests-fedora-missing-deps
334
  - tests-fedora-update-deps
335
  - tests-remote-execution
336
  - tests-ubuntu-18.04
337
  - tests-unix
338 339
  except:
  - schedules
340 341 342 343
  artifacts:
    paths:
    - coverage-sources/
    - coverage-report/
344

345
# Deploy, only for merges which land on master branch.
346
#
347
pages:
348
  stage: publish
349
  dependencies:
350
  - coverage
351
  - docs
Tiago Gomes's avatar
Tiago Gomes committed
352 353
  variables:
    ACME_DIR: public/.well-known/acme-challenge
354
    COVERAGE_DIR: public/coverage
355
  script:
356
  - mkdir -p ${ACME_DIR}
Tiago Gomes's avatar
Tiago Gomes committed
357 358 359 360
    # Required to finish the creation of the Let's Encrypt certificate,
    # which allows using https://docs.buildstream.build/ for accessing
    # the documentation.
  - echo ${ACME_CHALLENGE} > ${ACME_DIR}/$(echo ${ACME_CHALLENGE} | cut -c1-43)
361 362
  - mkdir -p ${COVERAGE_DIR}
  - cp -a ./coverage-report/ ${COVERAGE_DIR}
363 364 365 366
  artifacts:
    paths:
    - public/
  only:
367 368 369 370 371 372 373 374 375
  #
  # FIXME:
  #
  # Ideally we want to publish to a different subdir of
  # pages depending on which stable branch we are building here,
  # not currently automatically supported but can be worked around.
  #
  # See https://gitlab.com/gitlab-org/gitlab-ce/issues/35141
  #
376
  - master
377 378
  except:
  - schedules