include:
  - local: '.gitlab-ci/libfprint-image-variables.yaml'
  - local: '.gitlab-ci/libfprint-templates.yaml'
  - project: 'freedesktop/ci-templates'
    ref: master
    file: '/templates/fedora.yml'
  - remote: 'https://gitlab.gnome.org/GNOME/citemplates/-/raw/master/flatpak/flatpak_ci_initiative.yml'

default:
  # Auto-retry jobs in case of infra failures
  retry:
    max: 1
    when:
      - 'runner_system_failure'
      - 'stuck_or_timeout_failure'
      - 'scheduler_failure'
      - 'api_failure'

variables:
  extends: .libfprint_common_variables
  FDO_DISTRIBUTION_TAG: $LIBFPRINT_IMAGE_TAG
  FDO_DISTRIBUTION_VERSION: 41
  FDO_UPSTREAM_REPO: "libfprint/$CI_PROJECT_NAME"
  FEDORA_IMAGE: "$CI_REGISTRY/libfprint/$CI_PROJECT_NAME/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
  LAST_ABI_BREAK: "056ea541ddc97f5806cffbd99a12dc87e4da3546"

workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'push'
    - if: $CI_PIPELINE_SOURCE == 'schedule'
    - if: $CI_PROJECT_NAMESPACE == 'libfprint' && $LIBFPRINT_CI_ACTION != ''

stages:
  - image-build
  - check-source
  - build
  - test
  - flatpak
  - deploy

image: $FEDORA_IMAGE

.build_one_driver_template: &build_one_driver
  script:
    # Build with a driver that doesn't need imaging, or openssl
    - meson setup _build --werror -Ddrivers=$driver
    - meson compile -C _build
    - rm -rf _build/

.build_template: &build
  script:
    # And build with everything
    - meson setup _build --werror -Ddrivers=all
    - meson compile -C _build
    - meson install -C _build

.build_template: &check_abi
  script:
    - ./.ci/check-abi ${LAST_ABI_BREAK} $(git rev-parse HEAD)

.standard_job:
  rules:
    - when: on_success
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never

build:
  stage: build
  extends:
    - .standard_job
  variables:
    driver: virtual_image
  <<: *build_one_driver
  <<: *build
#  <<: *check_abi
  artifacts:
    expose_as: "HTML Documentation"
    paths:
    - _build/doc/html
    - _build/doc/html/index.html
    expire_in: 1 week

test:
  stage: test
  extends:
    - .standard_job
  script:
    - meson setup _build --werror -Ddrivers=all -Db_coverage=true
    - meson test -C _build --print-errorlogs --no-stdsplit --timeout-multiplier 3
    - ninja -C _build coverage
    - cat _build/meson-logs/coverage.txt || true
  artifacts:
    reports:
      junit: "_build/meson-logs/testlog.junit.xml"
      coverage_report:
        coverage_format: cobertura
        path: _build/meson-logs/coverage.xml
    expose_as: 'Coverage Report'
    when: always
    paths:
      - _build/meson-logs
      - _build/meson-logs/coveragereport/index.html
    expire_in: 1 week
  coverage: '/^TOTAL.*\s+(\d+\%)$/'

test_valgrind:
  stage: test
  extends:
    - .standard_job
  script:
    - meson setup _build -Ddrivers=all
    - meson compile -C _build
    - meson test -C _build --print-errorlogs --no-stdsplit --setup=valgrind
  artifacts:
    reports:
      junit: "_build/meson-logs/testlog-valgrind.junit.xml"
    expose_as: 'Valgrind test logs'
    when: always
    paths:
      - _build/meson-logs
      - _build/meson-logs/testlog-valgrind.txt
    expire_in: 1 week

test_asan:
  stage: test
  extends:
    - .standard_job
  script:
    - meson setup _build -Ddrivers=all -Db_sanitize=address,undefined
    - meson test -C _build --print-errorlogs --no-stdsplit
  artifacts:
    reports:
      junit: "_build/meson-logs/testlog.junit.xml"
    expose_as: 'Sanitizers test logs'
    when: always
    paths:
      - _build/meson-logs
      - _build/meson-logs/testlog.txt
    expire_in: 1 week

test_installed:
  stage: test
  extends:
    - .standard_job
  script:
    - meson setup _build --prefix=/usr -Ddrivers=all
    - meson install -C _build
    - mv _build _build_dir
    - rm -rf tests
    - gnome-desktop-testing-runner --list libfprint-2
    - gnome-desktop-testing-runner libfprint-2
        --report-directory=_installed-tests-report/failed/
        --log-directory=_installed-tests-report/logs/
        --parallel=0
  artifacts:
    expose_as: 'GNOME Tests Runner logs'
    when: always
    paths:
      - _build_dir/meson-logs
      - _installed-tests-report
    expire_in: 1 week


test_scan_build:
  stage: test
  extends:
    - .standard_job
  allow_failure: true
  script:
    - meson setup _build -Ddrivers=all
    # Wrapper to add --status-bugs and disable malloc checker
    - SCANBUILD=$CI_PROJECT_DIR/.gitlab-ci/scan-build
      ninja -C _build scan-build
  artifacts:
    when: on_failure
    paths:
      - _build/meson-logs
    expire_in: 1 week

test_indent:
  stage: check-source
  extends:
    - .standard_job
  script:
    - scripts/uncrustify.sh
    - git diff
    - git diff-index --name-only --exit-code HEAD
  rules:
    - changes:
        compare_to: 'refs/heads/master'
        paths:
          - '**/*.c'
          - '**/*.h'

test_unsupported_list:
  stage: check-source
  extends:
    - .standard_job
  allow_failure: true
  script:
    - tests/hwdb-check-unsupported.py

flatpak:
  stage: flatpak
  extends: .flatpak@x86_64
  variables:
    MANIFEST_PATH: "demo/org.freedesktop.libfprint.Demo.json"
    FLATPAK_MODULE: "libfprint"
    APP_ID: "org.freedesktop.libfprint.Demo"
    BUNDLE: "org.freedesktop.libfprint.Demo.flatpak"
    RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
  # Build with any builder
  tags: []
  rules:
    - if: '$CI_PROJECT_PATH != "libfprint/libfprint"'
      when: manual
      allow_failure: true
    - if: $CI_PIPELINE_SOURCE == "schedule"
      when: never
    - if: '$CI_COMMIT_BRANCH == "master"'
      allow_failure: true
      when: always
    - if: '$CI_COMMIT_TAG'
      allow_failure: true
      when: always
    # For any other (commit), allow manual run.
    # This excludes MRs which would create a duplicate pipeline
    - if: '$CI_COMMIT_BRANCH'
      when: manual
      allow_failure: true
    - if: '$CI_MERGE_REQUEST_ID'
      when: manual
      allow_failure: true

# CONTAINERS creation stage
.container_fedora_build_base:
  extends: .fdo.container-build@fedora
  stage: image-build
  variables:
    GIT_STRATEGY: none # no need to pull the whole tree for rebuilding the image
    # a list of packages to install
    FDO_DISTRIBUTION_PACKAGES:
      $LIBFPRINT_DEPENDENCIES
      vala
      libpcap-devel
      libudev-devel
    FDO_DISTRIBUTION_EXEC: |
      $LIBFPRINT_EXEC
  rules:
    - when: never

.container_fedora_build_forced:
  variables:
    FDO_FORCE_REBUILD: 1

container_fedora_build_schedule:
  extends:
    - .container_fedora_build_base
    - .container_fedora_build_forced
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule" && $CRON_TASK == "BUILD_CI_IMAGES"
      when: always

container_fedora_build_manual:
  extends:
    - .container_fedora_build_base
    - .container_fedora_build_forced
  rules:
    - if: $LIBFPRINT_CI_ACTION == "build-image"
      when: always

container_fedora_build_on_deps_changed:
  extends: .container_fedora_build_base
  rules:
    - if: $CI_PROJECT_NAMESPACE == "libfprint" && $CI_PIPELINE_SOURCE != "schedule"
      changes:
        compare_to: 'refs/heads/master'
        paths:
          - '.gitlab-ci/libfprint-image-variables.yaml'
          - '.gitlab-ci/libfprint-templates.yaml'

pages:
  image: alpine:latest
  stage: deploy
  needs:
    - job: test
      artifacts: true
  script:
    - mkdir public
    - mv _build/meson-logs/coveragereport public/coverage
  artifacts:
    paths:
      - public
  rules:
    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
