---
stages:
  - code-check
  - build
  - tests
  - package
  - benchmarks


variables:
  DOCKER_DRIVER: overlay

# Cache a folder between builds.
# Tox sets it to be our pip cache.
cache:
  untracked: true
  key: soledad-shared-pip-cache
  paths:
    - .cache/

before_script:
  - echo "Running on ${HOST_HOSTNAME:=$(hostname)}"


#
# "code-check" stage
#

code-check:
  stage: code-check
  except:
    - schedules
  image: 0xacab.org:4567/leap/soledad:latest
  script:
    - tox -e code-check


#
# "build" stage
#

build_docker_image:
  stage: build
  except:
    - schedules
  image: 0xacab.org:4567/leap/soledad:latest
  services:
    - docker:dind
  tags:
    - docker-in-docker
  script:
    - scripts/docker/build-docker-image.sh


#
# "tests" stage
#

tests:
  stage: tests
  except:
    - schedules
  image: 0xacab.org:4567/leap/soledad:latest
  services:
    - couchdb
  script:
    - tox -- --couch-url http://couchdb:5984

e2e:
  stage: tests
  except:
    - schedules
  image: 0xacab.org:4567/leap/soledad:latest
  script:
    - tox -e e2e


#
# "package" stage
#

.job_template: &package
  stage: package
  except:
    - schedules
  image: "0xacab.org:4567/leap/gitlab-buildpackage:build_${DIST}_${ARCH}"
  script:
    - /usr/bin/unbuffer scripts/packaging/run-packaging-ci-job.sh | /usr/bin/ts -s
    # sleep 1h to allow debugging of running container
    # - sleep 3600
  artifacts:
    expire_in: 1w
    paths:
      - '*_*.xz'
      - '*_*.dsc'
      - '*_amd64.changes'
      - '*.deb'
      - 'results/*'
  cache:
    policy: pull

package:amd64_jessie:
  variables:
    ARCH: "amd64"
    DIST: "jessie"
    REPONAMES: "platform,client"
    # Default is to fail on warnings, we disable it here
    # unless a manpage is included (see #8895)
    LINTIAN_OPTS: "--fail-on-warnings -X filename-length,manpages,standards-version"
  <<: *package


package:amd64_stretch:
  variables:
    ARCH: "amd64"
    DIST: "stretch"
    REPONAMES: "platform,client"
    # Default is to fail on warnings, we disable it here
    # unless a manpage is included (see #8895)
    LINTIAN_OPTS: "--fail-on-warnings -X filename-length,manpages,standards-version"
  <<: *package

package:amd64_buster:
  variables:
    ARCH: "amd64"
    DIST: "buster"
    REPONAMES: "client"
    # Default is to fail on warnings, we disable it here
    # unless a manpage is included (see #8895)
    # Also, ignore the `build-depends-on-obsolete-package` tag
    # until we can deprecate jessie and take out the dh-systemd
    # build-depends (see #8963)
    LINTIAN_OPTS: "--fail-on-warnings -X filename-length,manpages --suppress-tags build-depends-on-obsolete-package"
  <<: *package

package:amd64_zesty:
  variables:
    ARCH: "amd64"
    DIST: "zesty"
    REPONAMES: "client"
    # Default is to fail on warnings, we disable it here
    # unless a manpage is included (see #8895)
    LINTIAN_OPTS: "--fail-on-warnings -X filename-length,manpages,standards-version"
  <<: *package

package:amd64_artful:
  variables:
    ARCH: "amd64"
    DIST: "artful"
    REPONAMES: "client"
    # Default is to fail on warnings, we disable it here
    # unless a manpage is included (see #8895)
    LINTIAN_OPTS: "--fail-on-warnings -X filename-length,manpages --suppress-tags build-depends-on-obsolete-package"
  <<: *package


#
# "benchmarks" stage
#

.job_template: &benchmark
  stage: benchmarks
  only:
    - schedules
  image: 0xacab.org:4567/leap/soledad:latest
  tags:
    - benchmark
  services:
    - couchdb
  before_script:
    - git checkout -B "$CI_COMMIT_REF_NAME" "$CI_COMMIT_SHA"
    - '[ -n "${BENCHMARK_ALL_COMMITS}" ] && git checkout origin/master scripts/benchmark/setup-all-commits-env.sh'
    - '[ -n "${BENCHMARK_ALL_COMMITS}" ] && ./scripts/benchmark/setup-all-commits-env.sh'
    - curl -s couchdb:5984
    # You can provide a $NETRC variable containing the creds for your
    # elasticsearch instance so it's protected from being leaked in the
    # CI console
    # We can't get it working inside docker for unknown reasons.
    # - echo "$NETRC" > /root/.netrc && chmod 600 /root/.netrc
    #
    # Add $PYTEST_OPTS to pytest.ini to allow posting benchmark tests
    # to an elasticsearch instance
    - echo "addopts=$PYTEST_OPTS" >> pytest.ini && chmod 600 pytest.ini
  after_script:
    # Output locally saved benchmarks if they exist
    - 'if [ -d .benchmarks ]; then find .benchmarks -type f -exec cat {} \; ; fi'

time-cpu:
  <<: *benchmark
  script:
    - scripts/benchmark/run-benchmarks-ci-job.sh benchmark-time-cpu

memory:
  <<: *benchmark
  script:
    - scripts/benchmark/run-benchmarks-ci-job.sh benchmark-memory

responsiveness:
  <<: *benchmark
  script:
    - scripts/benchmark/run-benchmarks-ci-job.sh responsiveness