---
# --------------------------------------------------------------------------------------
# Global
# --------------------------------------------------------------------------------------
include:
  - local: common.yml

stages:
  - infrastructure
  - integrate
  - merge
  - build
  - check

variables:
  MANIFEST_FILE: "default.xml"
  # The BB_RECIPE_NAME is used for projects referenced in the SRCREV file
  # to match the repository and the bitbake recipe name.
  # We set it here to none, as every project needing it
  # has to specify it in its own gitlab-ci.yml file.
  # The BB_RECIPE_NAME is passed to the python scripts below anyway, but not
  # used for projects referenced in the manifest file.
  BB_RECIPE_NAME: none

workflow:
  rules:
    # Explicitly allow externally triggered pipelines in every case
    - if: $CI_PIPELINE_SOURCE == "pipeline" || $CI_PIPELINE_SOURCE == "api"
    # Do not run pipelines on forked projects.
    # The pipelines would not work anyway because of the users permissions.
    # There are two cases catched here:
    # 1. The project is forked into someones gitlab namespace and a MR to
    #    include a change into this forked project is created. In this case
    #    is the CI_PROJECT_ROOT_NAMESPACE not seco-ne but the
    #    namespace the fork lives in.
    # 2. The MR from the forked project is created to merge the change into this
    #    the project in the seco-ne namespace (customer sending
    #    change to us). Here the the IDs used below differ.
    #
    - if: $CI_PROJECT_ROOT_NAMESPACE == "seco-ne"
        && $CI_MERGE_REQUEST_SOURCE_PROJECT_ID == $CI_MERGE_REQUEST_PROJECT_ID

# --------------------------------------------------------------------------------------
# Stage: infrastructure
# --------------------------------------------------------------------------------------
integrate:
  extends: .infrastructure
  rules:
    # Do not integration pipeline for merge requests for integrate/gitlab-ci/ branches
    # The integration is done from the pipeline in gitlab-ci already
    - if: $CI_COMMIT_REF_NAME =~ /^integrate\/gitlab-ci\/.*/
      when: never
    # We have to make sure that the pipeline runs for the current manifest
    # master at the time a merge request is created. Otherwise we cannot
    # guarantee a green master after merging.
    - if: $CI_MERGE_REQUEST_IID
    # Explicitly allow externally triggered pipelines in every case
    - if: $CI_PIPELINE_SOURCE == "pipeline" || $CI_PIPELINE_SOURCE == "api"
  cache:
    policy: push
  script:
    - cd ${CI_PROJECT_DIR}
    - if [ -n "${CI_MERGE_REQUEST_IID}" ];then
        MERGE_REQUEST="${CI_MERGE_REQUEST_IID}";
      else
        MERGE_REQUEST="${CI_OPEN_MERGE_REQUESTS%%,*}";
      fi
    - .gitlab-ci/scripts/integrate_into_manifest.py
        --gitlab-url=${CI_SERVER_URL}
        --token=${GITBOT_TOKEN}
        --manifest-project=${MANIFEST_PROJECT}
        --manifest-file=${MANIFEST_FILE}
        --integration-base=${MASTER_BRANCH_MANIFEST}
        --project=${CI_PROJECT_PATH}
        --merge-request=${MERGE_REQUEST}
        --save-revision-to=manifest_revision
        --recipe-name=${BB_RECIPE_NAME}
  artifacts:
    paths:
      - manifest_revision

yamllint:
  extends: .yamllint

# --------------------------------------------------------------------------------------
# Stage: merge
# --------------------------------------------------------------------------------------
merge:
  extends: .infrastructure
  stage: merge
  rules:
    - if: $CI_COMMIT_BRANCH == $MASTER_BRANCH_PROJECT
  script:
    - cd ${CI_PROJECT_DIR}
    - .gitlab-ci/scripts/merge_into_manifest.py
        --gitlab-url=${CI_SERVER_URL}
        --token=${GITBOT_TOKEN}
        --manifest-project=${MANIFEST_PROJECT}
        --master-branch=${MASTER_BRANCH_MANIFEST}
        --project=${CI_PROJECT_PATH}
        --master-branch-project=${MASTER_BRANCH_PROJECT}
        --commit=${CI_COMMIT_SHA}
        --save-revision-to=manifest_revision
        --recipe-name=${BB_RECIPE_NAME}
  artifacts:
    paths:
      - manifest_revision

# --------------------------------------------------------------------------------------
# Stage: build
# --------------------------------------------------------------------------------------
build:
  stage: build
  rules:
    # Do not run build if the "skip build" label is set on the merge request
    - if: $CI_MERGE_REQUEST_LABELS =~ /skip build/
      when: never
    # execute this in MR only and not for integrate/gitlab-ci/ integrations
    # branches. These are build after the integration has been done in all
    # projects
    - if: $CI_MERGE_REQUEST_IID && $CI_COMMIT_REF_NAME !~ /^integrate\/gitlab-ci\/.*/
  trigger:
    project: !reference [variables, MANIFEST_PROJECT]
    branch: "integrate/${CI_PROJECT_NAME}/${CI_COMMIT_REF_NAME}"
    strategy: depend

# --------------------------------------------------------------------------------------
# Stage: check
# --------------------------------------------------------------------------------------
check:
  extends: .infrastructure
  stage: check
  rules:
    # Do not run check if the "skip build" label is set on the merge request
    - if: $CI_MERGE_REQUEST_LABELS =~ /skip build/
      when: never
    # Do not integration pipeline for merge requests for integrate/gitlab-ci/ branches
    # The integration is done from the pipeline in gitlab-ci already
    - if: $CI_COMMIT_REF_NAME =~ /^integrate\/gitlab-ci\/.*/
      when: never
    - if: $CI_MERGE_REQUEST_IID
    # Explicitly allow externally triggered pipelines in every case
    - if: $CI_PIPELINE_SOURCE == "pipeline" || $CI_PIPELINE_SOURCE == "api"
  needs: ["integrate"]
  allow_failure: true
  script:
    - cd ${CI_PROJECT_DIR}
    # When running in a trigger pipeline the CII_MERGE_REQUEST_IID is not set
    # but CI_OPEN_MERGE_REQUESTS. We use  the first of this comma separated list
    # in this case
    - if [ -n "${CI_MERGE_REQUEST_IID}" ];then
        MERGE_REQUEST="${CI_MERGE_REQUEST_IID}";
      else
        MERGE_REQUEST="${CI_OPEN_MERGE_REQUESTS%%,*}";
      fi
    # The 'parent_merge_request' is passed from the trigger
    # in case this check job is part of a gitlab-ci integration
    # pipeline. It is only used to display the correct MR to run again
    # in a failed check
    - if [ -n "${parent_merge_request}" ];then
        PARENT_MR="--parent-merge-request=${parent_merge_request}";
      fi
    - .gitlab-ci/scripts/check_if_integration_branch_is_up_to_date.py
        --gitlab-url=${CI_SERVER_URL}
        --token=${GITBOT_TOKEN}
        --manifest-project=${MANIFEST_PROJECT}
        --integration-base=${MASTER_BRANCH_MANIFEST}
        --project=${CI_PROJECT_PATH}
        --merge-request=${MERGE_REQUEST}
        --verbose
        ${PARENT_MR}
