image: docker:latest

cache:
  paths:
    - ccache

variables:
  DOCKER_DRIVER: overlay2
# When running CI jobs, don't allow
# HW backed renderes, due to the
# variability it introduces.
#  RENDER_DEVICE: /dev/dri/renderD128

.docker-setup: &docker-setup
    - mkdir -p ccache
    - mkdir -p results
    - export DOCKER_IMAGE_DIGEST=$(cat results/docker_image_digest.txt)
    - echo $DOCKER_IMAGE_DIGEST
    - echo core > /proc/sys/kernel/core_pattern || true
    - echo 0 > /proc/sys/kernel/core_uses_pid || true
    - if [[ -n "$RENDER_DEVICE" ]]; then RD_CONFIG="--device=$RENDER_DEVICE -e RENDER_DEVICE=$RENDER_DEVICE"; fi
    - echo RD_CONFIG=$RD_CONFIG

stages:
  - build
  - sanity test
  - test

build docker image:
  stage: build
  services:
    - docker:dind
  before_script:
    - mkdir -p results
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - time docker pull $CI_REGISTRY_IMAGE:latest || true

    - docker build
             --build-arg KNOWN_GOOD_MESA=$MESA_COMMIT
             --build-arg MESA_REPO=$MESA_REPO
             -t $CI_REGISTRY_IMAGE
             --cache-from $CI_REGISTRY_IMAGE:latest ci

    - docker history $CI_REGISTRY_IMAGE:latest

    - time docker push $CI_REGISTRY_IMAGE:latest 2>&1 | tee results/docker_push_log.txt

    - "grep -o 'digest: sha256:[0-9a-f]\\+' results/docker_push_log.txt |
       cut -f 2 -d ' ' |
       tee results/docker_image_digest.txt"
  only:
    - branches
    - tags
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

make check:
  stage: sanity test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --make-check"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - branches
    - tags
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

piglit - gl host:
  stage: test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --piglit-gl"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

piglit - gles host:
  stage: test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --piglit-gles"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

cts gl - gl host:
  stage: test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --deqp-gl-gl-tests"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

cts gles - gl host:
  stage: test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --deqp-gl-gles-tests"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

cts gl - gles host:
  stage: test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --deqp-gles-gl-tests"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

cts gles - gles host:
  stage: test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --deqp-gles-gles-tests"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/

unreliable tests:
  stage: test
  services:
    - docker:dind
  before_script:
    *docker-setup
  script:
    - docker run
             --ulimit core=99999999999:99999999999
             $RD_CONFIG
             -v $PWD:/virglrenderer
             $CI_REGISTRY_IMAGE@$DOCKER_IMAGE_DIGEST
             bash -c "/virglrenderer/ci/run_tests.sh --deqp-gl-unreliable --deqp-gles-unreliable --piglit-gl-unreliable --piglit-gles-unreliable || true"
             2>&1 | tee results/docker_test_log.txt
    - echo "\n\n"
  only:
    - merge_requests
    - schedules

  artifacts:
    when: always
    paths:
      - results/