# vim: set expandtab shiftwidth=2 tabstop=8 textwidth=0 filetype=yaml:

########################################
#                                      #
# THIS FILE IS GENERATED, DO NOT EDIT  #
# Edit .gitlab-ci/ci.template instead  #
#                                      #
# Regenerate with:
#   TEMPLATE_SHA="$(sed -n 's/^.templates_sha: *\&template_sha *\([0-9a-f]\+\)$/\1/p' ./.gitlab-ci/ci.template)"
#   pip3 install "git+http://gitlab.freedesktop.org/freedesktop/ci-templates@$TEMPLATE_SHA"
#   ci-fairy generate-template
#
########################################


# see https://docs.gitlab.com/ee/ci/yaml/#includefile
.templates_sha: &template_sha 593a0a5fe35a523a646a7efae5471c9759b8fba3



include:
  # Alpine container builder template
  - project: 'freedesktop/ci-templates'
    ref: *template_sha
    file: '/templates/alpine.yml'
  # Centos container builder template
  - project: 'freedesktop/ci-templates'
    ref: *template_sha
    file: '/templates/centos.yml'
  # Debian container builder template
  - project: 'freedesktop/ci-templates'
    ref: *template_sha
    file: '/templates/debian.yml'
  # Fedora container builder template
  - project: 'freedesktop/ci-templates'
    ref: *template_sha
    file: '/templates/fedora.yml'
  # Ubuntu container builder template
  - project: 'freedesktop/ci-templates'
    ref: *template_sha
    file: '/templates/ubuntu.yml'
  - project: 'freedesktop/ci-templates'
    file: '/templates/ci-fairy.yml'

stages:
  - prep
  - tier1
  - tier2
  - tier3
  - deploy
  - triage
  - coverity

variables:
  FDO_UPSTREAM_REPO: NetworkManager/NetworkManager
  GIT_DEPTH: 1
  # These tags should be updated each time the list of packages is updated
  # changing these will force rebuilding the associated image
  # Note: these tags have no meaning and are not tied to a particular NM version
  #
  # This is done by running `ci-fairy generate-template` and possibly bumping
  # ".default_tag".
  ALPINE_TAG:  'tag-dcc430216167'
  CENTOS_TAG:  'tag-feb1adbc208e'
  DEBIAN_TAG:  'tag-afb784497c2f'
  FEDORA_TAG:  'tag-feb1adbc208e'
  UBUNTU_TAG:  'tag-afb784497c2f'

  ALPINE_EXEC: 'bash .gitlab-ci/alpine-install.sh'
  CENTOS_EXEC: 'bash .gitlab-ci/fedora-install.sh'
  DEBIAN_EXEC: 'bash .gitlab-ci/debian-install.sh'
  FEDORA_EXEC: 'bash .gitlab-ci/fedora-install.sh'
  UBUNTU_EXEC: 'bash .gitlab-ci/debian-install.sh'

.nm_artifacts:
  variables:
    NM_BUILD_TARBALL: 1
  artifacts:
    expire_in: 5 days
    when: always
    paths:
      - docs-html
      - NetworkManager-1*.tar.xz
      - NetworkManager-1*.src.rpm
      - nm-test.log
      - testlog.txt

.nm_artifacts_debug:
  artifacts:
    expire_in: 5 days
    when: always
    paths:
      - nm-test.log
      - testlog.txt

#################################################################
#                                                               #
# prep stage                                                    #
#                                                               #
#################################################################

# Build a container for each distribution + version. The ci-templates
# will re-use the containers if the tag doesn't change.

tier1:fedora:43@prep:
  extends:
    - .fdo.container-build@fedora
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '43'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
    FDO_DISTRIBUTION_EXEC: $FEDORA_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule' || $SCHEDULED_PIPELINE_NAME == "weekly"

tier3:fedora:42@prep:
  extends:
    - .fdo.container-build@fedora
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '42'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
    FDO_DISTRIBUTION_EXEC: $FEDORA_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:fedora:41@prep:
  extends:
    - .fdo.container-build@fedora
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '41'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
    FDO_DISTRIBUTION_EXEC: $FEDORA_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:ubuntu:25.04@prep:
  extends:
    - .fdo.container-build@ubuntu
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '25.04'
    FDO_DISTRIBUTION_TAG: $UBUNTU_TAG
    FDO_DISTRIBUTION_EXEC: $UBUNTU_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:ubuntu:24.04@prep:
  extends:
    - .fdo.container-build@ubuntu
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '24.04'
    FDO_DISTRIBUTION_TAG: $UBUNTU_TAG
    FDO_DISTRIBUTION_EXEC: $UBUNTU_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:ubuntu:22.04@prep:
  extends:
    - .fdo.container-build@ubuntu
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '22.04'
    FDO_DISTRIBUTION_TAG: $UBUNTU_TAG
    FDO_DISTRIBUTION_EXEC: $UBUNTU_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:debian:13@prep:
  extends:
    - .fdo.container-build@debian
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '13'
    FDO_DISTRIBUTION_TAG: $DEBIAN_TAG
    FDO_DISTRIBUTION_EXEC: $DEBIAN_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:debian:12@prep:
  extends:
    - .fdo.container-build@debian
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '12'
    FDO_DISTRIBUTION_TAG: $DEBIAN_TAG
    FDO_DISTRIBUTION_EXEC: $DEBIAN_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:alpine:3.22@prep:
  extends:
    - .fdo.container-build@alpine
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '3.22'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
    FDO_DISTRIBUTION_EXEC: $ALPINE_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:alpine:3.21@prep:
  extends:
    - .fdo.container-build@alpine
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '3.21'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
    FDO_DISTRIBUTION_EXEC: $ALPINE_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:alpine:3.20@prep:
  extends:
    - .fdo.container-build@alpine
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '3.20'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
    FDO_DISTRIBUTION_EXEC: $ALPINE_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:alpine:3.19@prep:
  extends:
    - .fdo.container-build@alpine
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: '3.19'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
    FDO_DISTRIBUTION_EXEC: $ALPINE_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:centos:stream10@prep:
  extends:
    - .fdo.container-build@centos
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: 'stream10'
    FDO_DISTRIBUTION_TAG: $CENTOS_TAG
    FDO_DISTRIBUTION_EXEC: $CENTOS_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

tier3:centos:stream9@prep:
  extends:
    - .fdo.container-build@centos
  stage: prep
  variables:
    GIT_STRATEGY: none
    FDO_DISTRIBUTION_VERSION: 'stream9'
    FDO_DISTRIBUTION_TAG: $CENTOS_TAG
    FDO_DISTRIBUTION_EXEC: $CENTOS_EXEC
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
      when: manual
      allow_failure: true

#################################################################
#                                                               #
# tierN stage                                                   #
#                                                               #
#################################################################

.build@template:
  script:
    - env
    - r=0
    - .gitlab-ci/run-test.sh 2>&1 | tee /tmp/nm-test.log || r=$?
    - mv /tmp/nm-test.log .
    - exit $r
  dependencies: []


t_fedora:43:
  extends:
    - .build@template
    - .fdo.distribution-image@fedora
    - .nm_artifacts
  stage: tier1
  parallel:
    matrix:
      - NM_TEST_SELECT_RUN:
        - meson+gcc+docs+valgrind
        - meson+clang
        - rpm+meson
        - tarball+meson
        - tarball
        - subtree
  variables:
    FDO_DISTRIBUTION_VERSION: '43'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
  needs:
    - "tier1:fedora:43@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_fedora:42:
  extends:
    - .build@template
    - .fdo.distribution-image@fedora
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '42'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
  needs:
    - "tier3:fedora:42@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_fedora:41:
  extends:
    - .build@template
    - .fdo.distribution-image@fedora
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '41'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
  needs:
    - "tier3:fedora:41@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_ubuntu:25.04:
  extends:
    - .build@template
    - .fdo.distribution-image@ubuntu
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '25.04'
    FDO_DISTRIBUTION_TAG: $UBUNTU_TAG
  needs:
    - "tier3:ubuntu:25.04@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_ubuntu:24.04:
  extends:
    - .build@template
    - .fdo.distribution-image@ubuntu
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '24.04'
    FDO_DISTRIBUTION_TAG: $UBUNTU_TAG
  needs:
    - "tier3:ubuntu:24.04@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_ubuntu:22.04:
  extends:
    - .build@template
    - .fdo.distribution-image@ubuntu
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '22.04'
    FDO_DISTRIBUTION_TAG: $UBUNTU_TAG
  needs:
    - "tier3:ubuntu:22.04@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_debian:13:
  extends:
    - .build@template
    - .fdo.distribution-image@debian
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '13'
    FDO_DISTRIBUTION_TAG: $DEBIAN_TAG
  needs:
    - "tier3:debian:13@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_debian:12:
  extends:
    - .build@template
    - .fdo.distribution-image@debian
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '12'
    FDO_DISTRIBUTION_TAG: $DEBIAN_TAG
  needs:
    - "tier3:debian:12@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_alpine:3.22:
  extends:
    - .build@template
    - .fdo.distribution-image@alpine
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '3.22'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
  needs:
    - "tier3:alpine:3.22@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_alpine:3.21:
  extends:
    - .build@template
    - .fdo.distribution-image@alpine
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '3.21'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
  needs:
    - "tier3:alpine:3.21@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_alpine:3.20:
  extends:
    - .build@template
    - .fdo.distribution-image@alpine
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '3.20'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
  needs:
    - "tier3:alpine:3.20@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_alpine:3.19:
  extends:
    - .build@template
    - .fdo.distribution-image@alpine
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: '3.19'
    FDO_DISTRIBUTION_TAG: $ALPINE_TAG
  needs:
    - "tier3:alpine:3.19@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_centos:stream10:
  extends:
    - .build@template
    - .fdo.distribution-image@centos
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: 'stream10'
    FDO_DISTRIBUTION_TAG: $CENTOS_TAG
  needs:
    - "tier3:centos:stream10@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

t_centos:stream9:
  extends:
    - .build@template
    - .fdo.distribution-image@centos
    - .nm_artifacts_debug
  stage: tier3
  variables:
    FDO_DISTRIBUTION_VERSION: 'stream9'
    FDO_DISTRIBUTION_TAG: $CENTOS_TAG
  needs:
    - "tier3:centos:stream9@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'

#################################################################
#                                                               #
# specific jobs                                                 #
#                                                               #
#################################################################

check-patch:
  extends:
    - .fdo.distribution-image@fedora
  variables:
    FDO_DISTRIBUTION_VERSION: '43'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
  needs:
    - "tier1:fedora:43@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE != 'schedule'
  stage: tier1
  script:
    - date '+%Y%m%d-%H%M%S'; NM_CHECKPATCH_FETCH_UPSTREAM=1 contrib/scripts/checkpatch-feature-branch.sh
  allow_failure: true

check-tree:
  extends:
    - .fdo.distribution-image@fedora
  variables:
    FDO_DISTRIBUTION_VERSION: '43'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
  needs:
    - "tier1:fedora:43@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event' && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
      allow_failure: true
    - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
      allow_failure: true
    - if: $CI_PIPELINE_SOURCE != 'schedule'
  stage: tier1
  script:
    - date '+%Y%m%d-%H%M%S'; clang-format --version
    - date '+%Y%m%d-%H%M%S'; black --version
    - date '+%Y%m%d-%H%M%S'; contrib/scripts/nm-python-black-format.sh --check
    - date '+%Y%m%d-%H%M%S'; git ls-files -z -- 'po/*.po' | xargs -0 -n1 msgfmt -vc
    - date '+%Y%m%d-%H%M%S'; contrib/scripts/nm-code-format.sh -n
    - date '+%Y%m%d-%H%M%S'; ci-fairy generate-template && git diff --exit-code
    - date '+%Y%m%d-%H%M%S'; meson setup build && [ "$(LANG=C ninja -C build NetworkManager-update-po 2>&1 1>/dev/null | grep -c 'warning:')" = 0 ]

pages:
  stage: deploy
  script:
    - mv docs-html public
  artifacts:
    expire_in: 20 days
    paths:
      - public
  rules:
    - if: $CI_PIPELINE_SOURCE == 'schedule'
      when: never
    - if: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == 'main'
  dependencies:
    - "t_fedora:43: [meson+gcc+docs+valgrind]"
  needs:
    - "t_fedora:43: [meson+gcc+docs+valgrind]"

triage:issues:
  stage: triage
  image: ruby:3
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULED_PIPELINE_NAME == "daily"
  tags:
    - placeholder-job  # The job mostly waits on network requests, so use only one CPU: https://gitlab.freedesktop.org/freedesktop/freedesktop/-/issues/1358#note_2457416
  script:
    - gem install gitlab-triage
    - gitlab-triage --debug --token $API_TOKEN --source-id $CI_PROJECT_ID

coverity:
  extends:
    - .fdo.distribution-image@fedora
  variables:
    FDO_DISTRIBUTION_VERSION: '43'
    FDO_DISTRIBUTION_TAG: $FEDORA_TAG
  stage: coverity
  needs:
    - "tier1:fedora:43@prep"
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULED_PIPELINE_NAME == "weekly"
  script:
    - dnf install -y curl
    - CC=gcc CONFIGURE_ONLY=1 contrib/scripts/nm-ci-run.sh
    - cd build
    - ../.gitlab-ci/coverity.sh download
    - cov-analysis-linux64-*/bin/cov-build --dir cov-int ninja
    - ../.gitlab-ci/coverity.sh upload

# Clean the generated images periodically to get updated snapshots of the distribution images.
# Create an scheduled pipeline to run it, passing an AUTHFILE environment variable of type
# 'File' with an authentication token with API access level.
clean-images:
  extends:
    - .fdo.ci-fairy
  stage: prep
  rules:
    - if: $CI_PIPELINE_SOURCE == "schedule" && $SCHEDULED_PIPELINE_NAME == "weekly"
  script:
    - ci-fairy -v --authfile $AUTHFILE delete-image --project NetworkManager/NetworkManager --all

# Have detached MR pipeline (https://docs.gitlab.com/ee/ci/pipelines/merge_request_pipelines.html)
# https://gitlab.freedesktop.org/freedesktop/freedesktop/-/issues/540#what-it-means-for-me-a-maintainer-of-a-project-part-of-gitlabfreedesktoporg
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
    - if: $CI_PIPELINE_SOURCE == 'schedule'
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never
    - if: $CI_COMMIT_BRANCH
