Skip to content
Snippets Groups Projects
manifest-integration.yml 6.14 KiB
Newer Older
---
# ---------------------------------------------------------------------------------------
# Global
# ---------------------------------------------------------------------------------------
include:
  - local: manifest-build.yml
  - local: common.yml
  - integrate
  - merge
  - build
  - check

variables:
  # 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 for merge requests for integrate/gitlab-ci/ branches
    # These are trigger explicitly from the integration pipeline in gitlab-ci repo
    - if: $CI_COMMIT_REF_NAME =~ /^integrate\/gitlab-ci\/.*/
      when: never
    # 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-Northern-Europe 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-Northern-Europe namespace (customer sending
    #    change to us). Here the the IDs used below differ.
    #
    - if: $CI_PROJECT_ROOT_NAMESPACE == "SECO-Northern-Europe"
        && $CI_MERGE_REQUEST_SOURCE_PROJECT_ID == $CI_MERGE_REQUEST_PROJECT_ID

# ---------------------------------------------------------------------------------------
# Stage: prepare
# ---------------------------------------------------------------------------------------
yamllint:
    - if: $CI_COMMIT_REF_NAME != $MASTER_BRANCH_MANIFEST
  script:
    - yamllint -c .gitlab-ci/.yamllint.yml .*.yml

# ---------------------------------------------------------------------------------------
# integrate
# Create a commit in the manifest to pull this change
# ---------------------------------------------------------------------------------------
integrate:
  rules:
    # 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/integrate_into_manifest.py
        --gitlab-url=${CI_SERVER_URL}
        --token=${GITBOT_TOKEN}
        --manifest-project=${MANIFEST_PROJECT}
        --integration-base=${MASTER_BRANCH_MANIFEST}
        --project=${CI_PROJECT_PATH}
        --save-revision-to=manifest_revision
        --recipe-name=${BB_RECIPE_NAME}
  artifacts:
    paths:
      - manifest_revision

# ---------------------------------------------------------------------------------------
# Stage: merge
# ---------------------------------------------------------------------------------------
merge:
  stage: merge
  rules:
    - if: $CI_COMMIT_BRANCH == $MASTER_BRANCH_PROJECT
  script:
    - cd ${CI_PROJECT_DIR}
    - .gitlab-ci/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:
    # 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: SECO-Northern-Europe/yocto/manifest
    branch: "integrate/${CI_PROJECT_NAME}/${CI_COMMIT_REF_NAME}"
    strategy: depend

# ---------------------------------------------------------------------------------------
# Stage: check
# ---------------------------------------------------------------------------------------
check:
  rules:
    - if: $CI_MERGE_REQUEST_IID
    # Explicitly allow externally triggered pipelines in every case
    - if: $CI_PIPELINE_SOURCE == "pipeline" || $CI_PIPELINE_SOURCE == "api"
  needs: ["integrate"]
  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
    - if [ -n "${parent_merge_request}" ];then
        PARENT_MR="--parent-merge-request=${parent_merge_request}";
      fi
    - echo "${parent_merge_request}"
    - echo "${PARENT_MR}"
    - echo "${MERGE_REQUEST}"
    - .gitlab-ci/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}