image: registry.git.cccv.de/uffd/docker-images/buster

variables:
  DEBIAN_FRONTEND: noninteractive 
  GIT_SUBMODULE_STRATEGY: normal
  PYTHONPATH: deps/ldapalchemy

before_script:
  - python3 -V
  - lsb_release -a
  - uname -a
  - python3 -m pylint --version
  - python3 -m coverage --version
  - echo "${CI_COMMIT_TAG}" | grep -qE "v[0-9]+[.][0-9]+[.][0-9]+.*" && export UFFD_PACKAGE_VERSION="${CI_COMMIT_TAG#v}" || export UFFD_PACKAGE_VERSION="${CI_COMMIT_SHA}"

.build:
  stage: build

build:pip:
  extends: .build
  script:
  - PACKAGE_VERSION="${UFFD_PACKAGE_VERSION}" python3 -m build
  artifacts:
    paths:
      - dist/*

build:apt:
  extends: .build
  script:
    - cp CHANGELOG debian/changelog
    - export PYBUILD_INSTALL_ARGS="--install-lib=/usr/share/uffd/ --install-scripts=/usr/share/uffd/"
    - gbp dch --no-git-author --ignore-branch --debian-tag=v%\(version\)s
    - dpkg-buildpackage -us -uc
    - mkdir build
    - mv ../*.deb build/
  artifacts:
    paths:
      - build/*.deb
      - debian/changelog

db_migrations_updated:
  stage: test
  script:
  - FLASK_APP=uffd flask db upgrade
  - FLASK_APP=uffd flask db migrate 2>&1 | grep -q 'No changes in schema detected'

linter:buster:
  image: registry.git.cccv.de/uffd/docker-images/buster
  stage: test
  script:
  - pip3 install pylint-gitlab pylint-flask-sqlalchemy # this force-updates jinja2 and some other packages!
  - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabCodeClimateReporter uffd > codeclimate.json
  - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabPagesHtmlReporter uffd > pylint.html
  - python3 -m pylint --rcfile .pylintrc --output-format=text uffd
  artifacts:
    when: always
    paths:
    - pylint.html
    reports:
      codequality: codeclimate.json


linter:bullseye:
  image: registry.git.cccv.de/uffd/docker-images/bullseye
  stage: test
  script:
  - pip3 install pylint-gitlab pylint-flask-sqlalchemy # this force-updates jinja2 and some other packages!
  - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabCodeClimateReporter uffd > codeclimate.json
  - python3 -m pylint --exit-zero --rcfile .pylintrc --output-format=pylint_gitlab.GitlabPagesHtmlReporter uffd > pylint.html
  - python3 -m pylint --rcfile .pylintrc --output-format=text uffd
  artifacts:
    when: always
    paths:
    - pylint.html
    reports:
      codequality: codeclimate.json

unittests:buster:
  image: registry.git.cccv.de/uffd/docker-images/buster
  stage: test
  script:
  - service slapd start
  - UNITTEST_OPENLDAP=1 python3-coverage run --include 'uffd/*.py' -m pytest --junitxml=report.xml || true
  - python3-coverage report -m
  - python3-coverage html
  - python3-coverage xml
  artifacts:
    when: always
    paths:
    - htmlcov/index.html
    - htmlcov
    expose_as: 'Coverage Report'
    reports:
      cobertura: coverage.xml
      junit: report.xml
  coverage: '/^TOTAL.*\s+(\d+\%)$/'

unittests:bullseye:
  image: registry.git.cccv.de/uffd/docker-images/bullseye
  stage: test
  script:
  - service slapd start
  - UNITTEST_OPENLDAP=1 python3-coverage run --include 'uffd/*.py' -m pytest --junitxml=report.xml || true
  #- python3-coverage report -m
  - python3-coverage html
  #- python3-coverage xml
  artifacts:
    when: always
    paths:
    - htmlcov/index.html
    - htmlcov
    expose_as: 'Coverage Report'
    reports:
      #cobertura: coverage.xml
      junit: report.xml
  #coverage: '/^TOTAL.*\s+(\d+\%)$/'

html5validator:
  stage: test
  script:
  - rm -rf pages
  - mkdir -p pages
  - cp -r uffd/static pages/static
  - DUMP_PAGES=pages python3 -m unittest discover tests
  - sed -i -e 's/href="\/static\//href=".\/static\//g' -e 's/src="\/static\//src=".\/static\//g' pages/*.html
  - html5validator --root pages 2>&1 | tee html5validator.log
  artifacts:
    when: on_failure
    paths:
    - pages
    - html5validator.log

.trans:
  stage: test
  script:
  - ./update_translations.sh $TRANSLATION_LANGUAGE
  coverage: '/^TOTAL.*\s+(\d+\%)$/'

trans_de:
  extends: .trans
  variables:
    TRANSLATION_LANGUAGE: de

test:package:pip:buster:
  image: registry.git.cccv.de/uffd/docker-images/buster
  stage: test
  script:
  - pip3 install dist/*.tar.gz
  dependencies:
  - build:pip

test:package:pip:bullseye:
  image: registry.git.cccv.de/uffd/docker-images/bullseye
  stage: test
  script:
  - pip3 install dist/*.tar.gz
  dependencies:
  - build:pip

test:package:apt:buster:
  image: registry.git.cccv.de/uffd/docker-images/buster
  stage: test
  script:
  - apt -y install ./build/*.deb
  - service uwsgi start uffd || ( service uwsgi status uffd ; sleep 15; cat /var/log/uwsgi/app/uffd.log; )
  - echo "server { listen 127.0.0.1:5000 default_server;  include /etc/uffd/nginx.include.conf; }" > /etc/nginx/sites-enabled/uffd.ini
  - service nginx start || ( service nginx status; nginx -t; exit 1; )
  - uffd-admin routes
  - curl -Lv 127.0.0.1:5000
  dependencies:
  - build:apt

test:package:apt:bullseye:
  image: registry.git.cccv.de/uffd/docker-images/bullseye
  stage: test
  script:
  - apt -y install ./build/*.deb
  - service uwsgi start uffd || ( service uwsgi status uffd ; sleep 15; cat /var/log/uwsgi/app/uffd.log; )
  - echo "server { listen 127.0.0.1:5000 default_server;  include /etc/uffd/nginx.include.conf; }" > /etc/nginx/sites-enabled/uffd.ini
  - service nginx start || ( service nginx status; nginx -t; exit 1; )
  - uffd-admin routes
  - curl -Lv 127.0.0.1:5000
  dependencies:
  - build:apt

.publish:
  stage: deploy
  rules:
    - if: '$CI_COMMIT_TAG =~ /v[0-9]+[.][0-9]+[.][0-9]+.*/'

publish:pip:
  extends: .publish
  script:
  - TWINE_USERNAME="${GITLABPKGS_USERNAME}" TWINE_PASSWORD="${GITLABPKGS_PASSWORD}" python3 -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
  - TWINE_USERNAME="${PYPI_USERNAME}" TWINE_PASSWORD="${PYPI_PASSWORD}" python3 -m twine upload dist/*
  dependencies:
  - build:pip

publish:apt:
  extends: .publish
  script:
  - exit 0
  dependencies:
  - build:apt