# This file holds all gerrit build verifications https://jenkins.osmocom.org/jenkins/view/Jenkins-Gerrit/.
# One can simply add a gerrit job by adding project's repository to repos list.
#
# Overview of jobs involved in the pipeline:
# https://osmocom.org/projects/osmocom-servers/wiki/Jenkins_gerrit-verifications_Pipeline
#
# How it works:
# * Two jobs get added for each repository:
#   gerrit-{repos}
#   gerrit-{repos}-build
# * The gerrit-{repos} job is a pipeline that runs the gerrit-{repos}-build job
#   and other jobs (linting, building debian packages, ...). The purpose of
#   this job is to reduce the amount of comments (and resulting mails) in
#   gerrit coming from the jenkins build verification. If each job ran
#   separately without this pipeline job, they would each generate mails.
#   The gerrit-{repos} job gets triggered from gerrit whenever a new patch to
#   test is available. It passes the GERRIT_BRANCH and GERRIT_REFSPEC variables
#   from gerrit to the jobs called in the pipeline.
# * The gerrit-{repos}-build job runs contrib/jenkins.sh in docker in a matrix.
#   By default the matrix results in only one job, however for some projects we
#   use the matrix to build for multiple CPU architectures (x86_64, arm) or use
#   it to build multiple configurations of the same project (see osmo-bts).
#
# NOTE: after updating the job with Jenkins Job Builder as usual, check if a
# new pipeline script was generated and approve it here:
# https://jenkins.osmocom.org/jenkins/scriptApproval/
# This used to be necessary when changing the pipeline script, adding new
# projects etc. But it seems to get auto-approved now.

- project:
    name: gerrit
    # following default values can be overridden by each repo
    disabled: false
    concurrent: true
    # axes related defaults
    slave_axis: !!python/tuple [osmocom-gerrit]
    a1_name: a1
    a1: !!python/tuple [default]
    a2_name: a2
    a2: !!python/tuple [default]
    a3_name: a3
    a3: !!python/tuple [default]
    a4_name: a4
    a4: !!python/tuple [default]
    combination_filter: ''
    sequential: false
    # most common build invocation
    # SYS_PTRACE is needed for ASAN (https://github.com/google/sanitizers/issues/764)
    # Documentation for variables (keep in sync!):
    # https://osmocom.org/projects/osmocom-servers/wiki/Jenkins_build_verification_jobs
    docker_run: |
            docker run --rm=true \
              --cap-add SYS_PTRACE \
              -e ASCIIDOC_WARNINGS_CHECK="1" \
              -e HOME=/build \
              -e JOB_NAME="$JOB_NAME" \
              -e MAKE=make \
              -e OSMOPY_DEBUG_TCP_SOCKETS="1" \
              -e OSMO_GSM_MANUALS_DIR="/opt/osmo-gsm-manuals" \
              -e PARALLEL_MAKE="$PARALLEL_MAKE" \
              -e WITH_MANUALS="1" \
              -w /build -i -u build \
              -v "$PWD:/build" \
    docker_run_ccache: |
            CCACHE_DIR="$HOME/ccache/gerrit-verifications"
            mkdir -p "$CCACHE_DIR"
            chown osmocom-build:osmocom-build "$CCACHE_DIR"

            docker run --rm=true \
              --cap-add SYS_PTRACE \
              -e ASCIIDOC_WARNINGS_CHECK="1" \
              -e HOME=/build \
              -e JOB_NAME="$JOB_NAME" \
              -e MAKE=make \
              -e OSMOPY_DEBUG_TCP_SOCKETS="1" \
              -e OSMO_GSM_MANUALS_DIR="/opt/osmo-gsm-manuals" \
              -e PARALLEL_MAKE="$PARALLEL_MAKE" \
              -e WITH_MANUALS="1" \
              -w /build -i -u build \
              -v "$PWD:/build" \
              \
              -e CCACHE_DIR="/ccache" \
              -e PATH="/usr/lib/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
              -v "$CCACHE_DIR:/ccache" \
    docker_img: '$USER/debian-bookworm-build'
    docker_img_erlang: '$USER/debian-bookworm-erlang'
    timeout_cmd: '/usr/bin/timeout 30m'
    cmd: '{docker_run_ccache} {docker_img} {timeout_cmd} /build/contrib/jenkins.sh'
    gerrit_url: 'ssh://jenkins@gerrit.osmocom.org:29418'
    repos_url: '{gerrit_url}/{repos}'
    gerrit_project: '{repos}'
    # Which jobs to run in the pipeline
    pipeline_build: true
    pipeline_lint: true
    pipeline_binpkgs: "debian:10 debian:12"

    # in alphabetical order
    repos:
      - asn1c:
          pipeline_binpkgs: ""
          pipeline_lint: false

      - cellmgr-ng:
          pipeline_binpkgs: "debian:10 debian:12"

      - docker-playground:
          pipeline_build: false
          pipeline_binpkgs: ""

      - libasn1c
      - libgtpnl
      - libosmo-abis
      - libosmo-gprs
      - libosmo-netif
      - libosmo-pfcp
      - libosmo-sigtran

      - libosmocore:
          slave_axis: !!python/tuple [io_uring]  # OS#6405
          a1_name: arch
          a1: !!python/tuple [arm-none-eabi, amd64]
          combination_filter: '!(arch=="arm-none-eabi" && label=="FreeBSD_amd64")'
          cmd: '{docker_run_ccache} {docker_img} {timeout_cmd} /build/contrib/jenkins_arch.sh "$arch"'
          pipeline_binpkgs: "centos:7 debian:10 debian:12"  # centos7: SYS#6760

      - libsmpp34

      - libtelnet:
          pipeline_binpkgs: ""

      - libusrp

      - openggsn:
          a1_name: GTP
          a1: !!python/tuple [--enable-gtp-linux,--disable-gtp-linux]
          concurrent: false
          cmd: '{timeout_cmd} ./contrib/jenkins.sh'

      - osmo-bsc
      - osmo-bsc-nat

      - osmo-bts:
          slave_axis: !!python/tuple [osmocom-gerrit, raspbian]
          a1_name: FIRMWARE_VERSION
          a1: !!python/tuple [master, femtobts_v2.7, superfemto_v2.4, superfemto_v3.0.1pre, superfemto_v3.1, superfemto_v5.1, v2017.01, litecell15, oc2g, oc2g-next]
          a2_name: BTS_MODEL
          a2: !!python/tuple [sysmo, oct, trx, oct+trx, lc15, oc2g]
          a3_name: WITH_MANUALS
          a3: !!python/tuple ["1", "0"]
          combination_filter: >
            (FIRMWARE_VERSION == "master" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "master" && BTS_MODEL == "trx" && WITH_MANUALS == "0" && label == "raspbian") ||
            (FIRMWARE_VERSION == "femtobts_v2.7" && BTS_MODEL == "sysmo" && WITH_MANUALS == "1" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "superfemto_v2.4" && BTS_MODEL == "sysmo" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "superfemto_v3.0.1pre" && BTS_MODEL == "sysmo" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "superfemto_v3.1" && BTS_MODEL == "sysmo" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "superfemto_v5.1" && BTS_MODEL == "sysmo" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "v2017.01" && BTS_MODEL == "lc15" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "litecell15" && BTS_MODEL == "lc15" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "oc2g" && BTS_MODEL == "oc2g" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (FIRMWARE_VERSION == "oc2g-next" && BTS_MODEL == "oc2g" && WITH_MANUALS == "0" && label == "osmocom-gerrit")
          concurrent: false
          cmd: |
            DOCKER_IMG="{docker_img}"
            case "$(arch)" in
            arm*|aarch64)
              DOCKER_IMG="$DOCKER_IMG-arm"
              SETARCH_CMD="setarch linux32"
              ;;
            esac
            {docker_run_ccache} \
              -e FIRMWARE_VERSION="$FIRMWARE_VERSION" \
              -e WITH_MANUALS="$WITH_MANUALS" \
              "$DOCKER_IMG" {timeout_cmd} $SETARCH_CMD /build/contrib/jenkins_bts_model.sh "$BTS_MODEL"

      - osmo_dia2gsup:
          repos_url: '{gerrit_url}/erlang/{repos}'
          gerrit_project: 'erlang/{repos}'
          cmd: '{docker_run} {docker_img_erlang} {timeout_cmd} /build/contrib/jenkins.sh'
          pipeline_binpkgs: "debian:11 debian:12"

      - osmo-epdg:
          repos_url: '{gerrit_url}/erlang/{repos}'
          gerrit_project: 'erlang/{repos}'
          pipeline_binpkgs: "debian:12"
          a2_name: JOB_TYPE
          a2: !!python/tuple ["build", "manuals"]
          cmd: |
            case "$JOB_TYPE" in
            build)
              {docker_run} {docker_img_erlang} {timeout_cmd} /build/contrib/jenkins.sh
              ;;
            manuals)
              {docker_run} {docker_img} {timeout_cmd} /build/contrib/jenkins_manuals.sh
              ;;
            esac

      - osmo-s1gw:
          repos_url: '{gerrit_url}/erlang/{repos}'
          gerrit_project: 'erlang/{repos}'
          pipeline_binpkgs: "debian:12"
          cmd: '{docker_run} {docker_img_erlang} {timeout_cmd} /build/contrib/jenkins.sh'

      - osmo-e1-hardware:
          a2_name: JOB_TYPE
          a2: !!python/tuple ["firmware", "gateware", "manuals", "software"]
          cmd: |
            DOCKER_IMG="{docker_img}"
            case "$JOB_TYPE" in
            firmware|gateware|manuals)
              DOCKER_IMG="registry.osmocom.org/$USER/fpga-build"
              docker pull "$DOCKER_IMG"
              ;;
            esac
            {docker_run} \
              -e JOB_TYPE="$JOB_TYPE" \
              "$DOCKER_IMG" \
                {timeout_cmd} /build/contrib/jenkins.sh
          pipeline_binpkgs: ""

      - osmo-ci:
          pipeline_build: false
          pipeline_binpkgs: ""

      - osmo-ggsn:
          a1_name: GTP
          a1: !!python/tuple [--enable-gtp-linux,--disable-gtp-linux]
          a2_name: WITH_MANUALS
          a2: !!python/tuple ["1", "0"]
          combination_filter: >
            (GTP == "--enable-gtp-linux" && WITH_MANUALS == "0") ||
            (GTP == "--disable-gtp-linux" && WITH_MANUALS == "1")
          cmd: |
            {docker_run_ccache} \
              -e GTP="$GTP" \
              -e WITH_MANUALS="$WITH_MANUALS" \
              {docker_img} {timeout_cmd} /build/contrib/jenkins.sh

      - osmo-gsm-manuals:
          pipeline_binpkgs: "debian:10 debian:12"

      - osmo_gsup:
          repos_url: '{gerrit_url}/erlang/{repos}'
          gerrit_project: 'erlang/{repos}'
          cmd: '{docker_run_ccache} {docker_img_erlang} {timeout_cmd} /build/contrib/jenkins.sh'
          pipeline_binpkgs: ""

      - osmo-hlr
      - osmo-iuh
      - osmo-mgw

      - osmo-msc:
          a1_name: IU
          a1: !!python/tuple [--enable-iu, --disable-iu]
          a2_name: WITH_MANUALS
          a2: !!python/tuple ["1", "0"]
          combination_filter: >
            (IU == "--enable-iu" && WITH_MANUALS == "1") ||
            (IU == "--disable-iu" && WITH_MANUALS == "0")
          cmd: |
            {docker_run_ccache} \
              -e IU="$IU" \
              -e WITH_MANUALS="$WITH_MANUALS" \
              {docker_img} {timeout_cmd} /build/contrib/jenkins.sh

      - osmo-pcap:
          pipeline_binpkgs: "centos:7 debian:10 debian:12"  # centos7: SYS#6760

      - osmo-pcu:
          slave_axis: !!python/tuple [osmocom-gerrit, raspbian]
          a1_name: FIRMWARE_VERSION
          a1: !!python/tuple [master, v2017.01, litecell15, oc2g]
          a2_name: with_vty
          a2: !!python/tuple [True, False]
          a3_name: with_dsp
          a3: !!python/tuple [sysmo, lc15, oc2g, none]
          a4_name: WITH_MANUALS
          a4: !!python/tuple ["1", "0"]
          combination_filter: >
            (with_vty == "True" && with_dsp == "sysmo" && FIRMWARE_VERSION=="master" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (with_vty == "True" && with_dsp == "lc15" && FIRMWARE_VERSION=="master" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (with_vty == "True" && with_dsp == "lc15" && FIRMWARE_VERSION=="v2017.01" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (with_vty == "True" && with_dsp == "lc15" && FIRMWARE_VERSION=="litecell15" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (with_vty == "True" && with_dsp == "oc2g" && FIRMWARE_VERSION=="oc2g" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (with_vty == "False" && with_dsp == "none" && FIRMWARE_VERSION=="master" && WITH_MANUALS == "1" && label == "osmocom-gerrit") ||
            (with_vty == "False" && with_dsp == "none" && FIRMWARE_VERSION=="master" && WITH_MANUALS == "0" && label == "raspbian")
          cmd: |
            DOCKER_IMG="{docker_img}"
            case "$(arch)" in
            arm*|aarch64)
              DOCKER_IMG="$DOCKER_IMG-arm"
              SETARCH_CMD="setarch linux32"
              ;;
            esac
            {docker_run_ccache} \
              -e FIRMWARE_VERSION="$FIRMWARE_VERSION" \
              -e with_vty="$with_vty" \
              -e with_dsp="$with_dsp" \
              -e WITH_MANUALS="$WITH_MANUALS" \
              "$DOCKER_IMG" {timeout_cmd} $SETARCH_CMD /build/contrib/jenkins.sh

      - osmo-python-tests:
          repos_url: '{gerrit_url}/python/{repos}'
          gerrit_project: 'python/{repos}'
          pipeline_binpkgs: "debian:10 debian:12"

      - pyosmocom:
          repos_url: '{gerrit_url}/python/{repos}'
          gerrit_project: 'python/{repos}'
          pipeline_binpkgs: "debian:12"
          concurrent: false
          slave_axis: !!python/tuple [simtester,osmocom-gerrit]
          a2_name: JOB_TYPE
          a2: !!python/tuple ["test", "pylint", "docs", "pysim"]
          combination_filter: >
            (JOB_TYPE == "test" && label == "osmocom-gerrit") ||
            (JOB_TYPE == "pylint" && label == "osmocom-gerrit") ||
            (JOB_TYPE == "docs" && label == "osmocom-gerrit") ||
            (JOB_TYPE == "pysim" && label == "simtester")
          cmd: |
            case "$JOB_TYPE" in
            "pysim")
              {timeout_cmd} ./contrib/jenkins.sh
              ;;
            *)
              {docker_run} \
                -e JOB_TYPE="$JOB_TYPE" \
                {docker_img} \
                  {timeout_cmd} /build/contrib/jenkins.sh
              ;;
            esac

      - osmo-sgsn:
          a1_name: IU
          a1: !!python/tuple [--enable-iu, --disable-iu]
          a2_name: WITH_MANUALS
          a2: !!python/tuple ["1", "0"]
          combination_filter: >
            (IU == "--enable-iu" && WITH_MANUALS == "1") ||
            (IU == "--disable-iu" && WITH_MANUALS == "0")
          cmd: |
            {docker_run_ccache} \
              -e IU="$IU" \
              -e WITH_MANUALS="$WITH_MANUALS" \
              {docker_img} {timeout_cmd} /build/contrib/jenkins.sh

      - osmo_ss7:
          repos_url: '{gerrit_url}/erlang/{repos}'
          gerrit_project: 'erlang/{repos}'
          cmd: '{docker_run} {docker_img_erlang} {timeout_cmd} /build/contrib/jenkins.sh'
          pipeline_binpkgs: ""

      - osmo-sip-connector

      - osmo-trx:
          slave_axis: !!python/tuple [osmocom-gerrit,raspbian]
          a1_name: INSTR
          a1: !!python/tuple [--with-sse, --without-sse, --with-neon, --with-neon-vfpv4]
          a2_name: WITH_MANUALS
          a2: !!python/tuple ["1", "0"]
          combination_filter: >
            (INSTR == "--without-sse" && WITH_MANUALS == "1" && label == "osmocom-gerrit") ||
            (INSTR == "--with-sse" && WITH_MANUALS == "0" && label == "osmocom-gerrit") ||
            (INSTR == "--with-neon" && WITH_MANUALS == "0" && label == "raspbian") ||
            (INSTR == "--with-neon-vfpv4" && WITH_MANUALS == "0" && label == "raspbian")
          cmd: |
            DOCKER_IMG="{docker_img}"
            case "$(arch)" in
            arm*|aarch64)
              DOCKER_IMG="$DOCKER_IMG-arm"
              SETARCH_CMD="setarch linux32"
              ;;
            esac
            {docker_run_ccache} \
              -e INSTR="$INSTR" \
              -e WITH_MANUALS="$WITH_MANUALS" \
              "$DOCKER_IMG" {timeout_cmd} $SETARCH_CMD /build/contrib/jenkins.sh

      - osmocom-bb:
          pipeline_binpkgs: "debian:12"

      - osmo-tetra:
          pipeline_binpkgs: ""

      - osmo-sysmon:
          pipeline_binpkgs: "debian:10 debian:12"

      - osmo-remsim
      - simtrace2

      - osmo-opencm3-projects:
          cmd: '{docker_run} {docker_img} {timeout_cmd} /build/contrib/jenkins.sh'
          pipeline_binpkgs: ""

      - osmo-asf4-dfu:
          pipeline_binpkgs: ""

      - osmo-ccid-firmware:
          pipeline_binpkgs: ""

      - osmo-e1d
      - osmo-cbc

      - osmo-e1-recorder:
          pipeline_binpkgs: ""

      - gapk:
          pipeline_binpkgs: "debian:12"

      - osmo-uecups

      - osmo-el2tpd:
          pipeline_binpkgs: ""

      - osmo-smlc
      - osmo-gbproxy
      - osmo-hnodeb

      - osmo-hnbgw:
          a1_name: PFCP
          a1: !!python/tuple ["1", "0"]
          a2_name: WITH_MANUALS
          a2: !!python/tuple ["1", "0"]
          a3_name: NFTABLES
          a3: !!python/tuple ["1", "0"]
          combination_filter: >
            (PFCP == "1" && WITH_MANUALS == "1" && NFTABLES == "1") ||
            (PFCP == "0" && WITH_MANUALS == "0" && NFTABLES == "0")
          cmd: |
            {docker_run_ccache} \
              -e PFCP="$PFCP" \
              -e WITH_MANUALS="$WITH_MANUALS" \
              -e NFTABLES="$NFTABLES" \
              {docker_img} {timeout_cmd} /build/contrib/jenkins.sh

      - osmo-upf:
          pipeline_binpkgs: "debian:11 debian:12"

      - pysim:
          concurrent: false
          slave_axis: !!python/tuple [simtester,osmocom-gerrit]
          a2_name: JOB_TYPE
          a2: !!python/tuple ["test", "distcheck", "pylint", "docs"]
          combination_filter: >
            (JOB_TYPE == "test" && label == "simtester") ||
            (JOB_TYPE == "distcheck" && label == "osmocom-gerrit") ||
            (JOB_TYPE == "pylint" && label == "osmocom-gerrit") ||
            (JOB_TYPE == "docs" && label == "osmocom-gerrit")
          cmd: |
            case "$JOB_TYPE" in
            "test")
              {timeout_cmd} ./contrib/jenkins.sh
              ;;
            *)
              {docker_run} \
                -e JOB_TYPE="$JOB_TYPE" \
                {docker_img} \
                  {timeout_cmd} /build/contrib/jenkins.sh
              ;;
            esac
          pipeline_binpkgs: ""

      - osmo-ttcn3-hacks:
          slave_axis: !!python/tuple [ttcn3]
          cmd: |
            docker run \
              --rm \
              -v "$PWD:/build" \
              "registry.osmocom.org/osmocom-build/debian-bookworm-titan" \
              {timeout_cmd} \
              sh -e -x -c '
                useradd --uid=1000 build
                for i in /osmo-ttcn3-hacks/deps/*/; do
                  if ! [ -e /build/deps/"$(basename "$i")" ]; then
                    ln -s "$i" /build/deps/
                  fi
                done
                su build -c "make -C /build compile"
                '
          pipeline_binpkgs: ""

      - dahdi-tools:
          pipeline_lint: false
          pipeline_binpkgs: ""

      - upf-benchmark:
          pipeline_binpkgs: ""

    jobs:
      - 'gerrit-{repos}'
      - 'gerrit-{repos}-build'

- job-template:
    name: 'gerrit-{repos}'
    project-type: pipeline
    concurrent: true
    parameters:
      - bool:
          name: PIPELINE_BUILD
          description: Enable the build job (runs contrib/jenkins.sh)
          default: '{obj:pipeline_build}'
      - bool:
          name: PIPELINE_LINT
          description: Enable the lint job
          default: '{obj:pipeline_lint}'
      - string:
          name: REPO_URL
          description: Clone URL, to be passed to jobs started in the pipeline
          default: '{obj:repos_url}'
      - string:
          name: PIPELINE_BINPKGS
          description: |
            Enable the binpkgs job (build deb/rpm packages) for the given space
            separated distributions. Empty list disables the binpkgs job. The
            distributions must have binary packages in the osmocom:master
            repository.
          default: '{obj:pipeline_binpkgs}'
    dsl: |
      def run_job(display_name, job_name, comment_type=null, distro=null) {{
        try {{
          echo "pipeline_${{display_name}}: running job ${{job_name}}"

          // IMPORTANT: Keep gerrit-verifications-parameters.yaml.inc in sync
          // with the list of parameters here, and make sure all jobs passed
          // to run_job() include the .yaml.inc file. (OS#6261)
          build job: job_name, parameters: [
            string(name: "COMMENT_TYPE", value: comment_type),
            string(name: "DISTRO", value: distro),
            string(name: "GERRIT_BRANCH", value: "${{env.GERRIT_BRANCH}}"),
            string(name: "GERRIT_CHANGE_NUMBER", value: "${{env.GERRIT_CHANGE_NUMBER}}"),
            string(name: "GERRIT_HOST", value: "${{env.GERRIT_HOST}}"),
            string(name: "GERRIT_PATCHSET_NUMBER", value: "${{env.GERRIT_PATCHSET_NUMBER}}"),
            string(name: "GERRIT_PATCHSET_REVISION", value: "${{env.GERRIT_PATCHSET_REVISION}}"),
            string(name: "GERRIT_PATCHSET_UPLOADER_NAME", value: "${{env.GERRIT_PATCHSET_UPLOADER_NAME}}"),
            string(name: "GERRIT_PORT", value: "${{env.GERRIT_PORT}}"),
            string(name: "GERRIT_PROJECT", value: "${{env.GERRIT_PROJECT}}"),
            string(name: "GERRIT_REFSPEC", value: "${{env.GERRIT_REFSPEC}}"),
            string(name: "GERRIT_REPO_URL", value: "${{env.REPO_URL}}"),
            string(name: "PIPELINE_BUILD_URL", value: "${{env.BUILD_URL}}"),
            string(name: "PROJECT_NAME", value: "{repos}"),
          ]
          echo "pipeline_${{display_name}}: SUCCESS"
        }} catch (Exception e) {{
          echo "pipeline_${{display_name}}: FAILED"
        }}
      }}

      pipeline {{
        agent none
        stages {{
          stage("Verification") {{
            parallel {{

              // Run the comment job to add the pipeline link to gerrit
              stage("Start Comment") {{
                steps {{
                  script {{
                    run_job("comment_start", "gerrit-verifications-comment", "start")
                  }}
                }}
              }}

              stage("Build") {{
                when {{
                  expression {{ params.PIPELINE_BUILD }}
                }}
                steps {{
                  script {{
                    run_job("build", "gerrit-{repos}-build")
                  }}
                }}
              }}

              stage("Lint") {{
                when {{
                  expression {{ params.PIPELINE_LINT }}
                }}
                steps {{
                  script {{
                    run_job("lint", "gerrit-lint")
                  }}
                }}
              }}

              // Generating binpkgs stages is not possible if we want to run
              // them in parallel and not have another job that just waits
              // until they complete.

              stage("binpkgs-0") {{
                when {{
                  expression {{ params.PIPELINE_BINPKGS.split().size() > 0 }}
                }}
                steps {{
                  script {{
                    distro = params.PIPELINE_BINPKGS.split()[0]
                    run_job(distro, "gerrit-binpkgs", null, distro)
                  }}
                }}
              }}

              stage("binpkgs-1") {{
                when {{
                  expression {{ params.PIPELINE_BINPKGS.split().size() > 1 }}
                }}
                steps {{
                  script {{
                    distro = params.PIPELINE_BINPKGS.split()[1]
                    run_job(distro, "gerrit-binpkgs", null, distro)
                  }}
                }}
              }}

              stage("binpkgs-2") {{
                when {{
                  expression {{ params.PIPELINE_BINPKGS.split().size() > 2 }}
                }}
                steps {{
                  script {{
                    distro = params.PIPELINE_BINPKGS.split()[2]
                    run_job(distro, "gerrit-binpkgs", null, distro)
                  }}
                }}
              }}

            }} // end of parallel
          }} // end of Verification stage

          // Run the comment job to get successful/failed links and add a
          // comment + vote to gerrit
          stage("Result Comment") {{
            steps {{
              script {{
                run_job("comment_result", "gerrit-verifications-comment", "result")
              }}
            }}
          }}

        }}
      }}
    disabled: '{obj:disabled}'
    retry-count: 3 # scm checkout
    properties:
      - build-discarder:
          days-to-keep: 30
          num-to-keep: 1000
    description: |
      Pipeline of CI for patches sent to
      <a href="https://gerrit.osmocom.org/#/q/status:open+project:{repos}">{repos}</a>
      <br/><br/>
      <b>Auto-generated using Jenkins Job Builder. DO NOT EDIT MANUALLY!</b>

    scm:
      - git:
         url: '{obj:repos_url}'
         credentials-id: d5eda5e9-b59d-44ba-88d2-43473cb6e42d
         branches:
           - $GERRIT_BRANCH
         refspec: $GERRIT_REFSPEC
         name:
         choosing-strategy: gerrit
         wipe-workspace: false
         skip-tag: true
         submodule:
           recursive: true

    triggers:
      - gerrit:
          trigger-on:
            - patchset-created-event:
                exclude-drafts: true
                exclude-no-code-change: true
          projects:
            - project-compare-type: 'PLAIN'
              project-pattern: '{obj:gerrit_project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**'
          skip-vote:
              successful: false
              failed: false
              unstable: false
              notbuilt: false
          silent: true  # comment + vote is done in gerrit-pipeline-result.yml
          escape-quotes: false
          server-name: gerrit.osmocom.org

- job-template:
    name: 'gerrit-{repos}-build'
    project-type: matrix
    concurrent: '{obj:concurrent}'
    disabled: '{obj:disabled}'
    retry-count: 3 # scm checkout
    properties:
      - build-discarder:
          days-to-keep: 30
          num-to-keep: 1000
    description: |
      Build job of CI for patches sent to
      <a href="https://gerrit.osmocom.org/#/q/status:open+project:{repos}">{repos}</a>
      <br/><br/>
      <b>Auto-generated using Jenkins Job Builder. DO NOT EDIT MANUALLY!</b>

    execution-strategy:
      sequential: '{obj:sequential}'
      combination-filter: |
        {obj:combination_filter}
    axes:
      - axis:
          type: slave
          name: label
          values: '{obj:slave_axis}'
      - axis:
          type: user-defined
          name: '{obj:a1_name}'
          values: '{obj:a1}'
      - axis:
          type: user-defined
          name: '{obj:a2_name}'
          values: '{obj:a2}'
      - axis:
          type: user-defined
          name: '{obj:a3_name}'
          values: '{obj:a3}'
      - axis:
          type: user-defined
          name: '{obj:a4_name}'
          values: '{obj:a4}'

    scm:
      - git:
         url: '{obj:repos_url}'
         credentials-id: d5eda5e9-b59d-44ba-88d2-43473cb6e42d
         branches:
           - $GERRIT_BRANCH
         refspec: $GERRIT_REFSPEC
         name:
         choosing-strategy: gerrit
         wipe-workspace: false
         skip-tag: true
         submodule:
           recursive: true

    parameters:
      !include: gerrit-verifications-parameters.yaml.inc

    builders:
      - shell: '{obj:cmd}'
      # Remove workspace on success to free up space
      - shell: 'rm -rf "$WORKSPACE"'

    publishers:
       - warnings:
           console-log-parsers:
             - 'GNU C Compiler 4 (gcc)'
           resolve-relative-paths: true

# vim: expandtab tabstop=2 shiftwidth=2
