From b097a25350e1b4192c0b84aa6e7bb5a77477e3b6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20H=C3=B6ppner?= <jonas.hoeppner@garz-fricke.com>
Date: Mon, 21 Mar 2022 13:04:34 +0100
Subject: [PATCH] CI: Generate .gitlab-ci.yml with include commands in deploy
 step

This change should be reverted after once used.
It is needed to initially add the include .gitlab-ci.yml in
all subprojects.
---
 deploy_gitlab_ci.py |  71 +++++-
 manifest-build.yml  | 166 ++++++++++++++
 manifest.yml        | 516 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 752 insertions(+), 1 deletion(-)
 create mode 100644 manifest-build.yml
 create mode 100644 manifest.yml

diff --git a/deploy_gitlab_ci.py b/deploy_gitlab_ci.py
index 24df87b0..4f2445f9 100755
--- a/deploy_gitlab_ci.py
+++ b/deploy_gitlab_ci.py
@@ -12,11 +12,77 @@ from get_merge_requests import get_merge_requests
 from update_submodule import update_submodule
 from update_gitlab_ci import update_gitlab_ci_include
 
+from ruamel.yaml import YAML
+
 
 def update_rev_in_gitlab_ci(repo, submodule_project, submodule_revision):
 
     # Add changed revision also to .gitlab-ci.yml
     gitlab_ci_yml = os.path.join(repo.working_tree_dir, ".gitlab-ci.yml")
+
+    # ======================================
+    # Hack to deploy the .gitlab-ci.yml which does the include
+    # to the child project
+    logging.debug("Origin: %s", repo.remotes.origin.url)
+
+    # Contains the base file to be used in the subprojects
+    if "ci-test" in repo.remotes.origin.url:
+        if "manifest" in repo.remotes.origin.url:
+            include_file = "foobar-manifest.yml"
+        else:
+            include_file = "foobar-manifest-integration.yml"
+    else:
+        if "manifest" in repo.remotes.origin.url:
+            include_file = "manifest.yml"
+        else:
+            include_file = "manifest-integration.yml"
+
+    # -----------------------------------
+    # Adapt content in the include file
+    # -----------------------------------
+    # Read values from existing file
+    yaml = YAML()
+    with open(gitlab_ci_yml, "r", encoding="utf8") as fp:
+        data = yaml.load(fp)
+
+    logging.debug("Yaml: %s", data)
+
+    try:
+        masterbranch = data["variables"]["MASTER_BRANCH_PROJECT"]
+        logging.debug("Masterbranch %s", masterbranch)
+    except KeyError:
+        masterbranch = None
+    try:
+        recipe = data["variables"]["BB_RECIPE_NAME"]
+        logging.debug("Recipe %s", recipe)
+    except KeyError:
+        recipe = None
+
+    # -----------------------------------
+    with open(gitlab_ci_yml, "w", encoding="utf8") as fp:
+        fp.write(
+            """---
+# ---------------------------------------------------------------------------------------
+# Include the default CI steps from the gitlab-ci repo
+# ---------------------------------------------------------------------------------------
+include:
+  - project: '${CI_PROJECT_ROOT_NAMESPACE}/yocto/infrastructure/gitlab-ci'
+    ref: 49cc4204323bca76190e5ffae1a7d5627157c073
+"""
+        )
+        fp.write("    file: '{}'\n".format(include_file))
+        if masterbranch is not None or recipe is not None:
+            fp.write("\nvariables:\n")
+            if masterbranch is not None:
+                fp.write("  MASTER_BRANCH_PROJECT: {}\n".format(masterbranch))
+            if recipe is not None:
+                fp.write("  BB_RECIPE_NAME: {}\n".format(recipe))
+
+    # -----------------------------------
+    repo.git.add(gitlab_ci_yml)
+
+    # ======================================
+
     if update_gitlab_ci_include(
         gitlab_ci_yml,
         submodule_project.web_url.split("//")[1].split("/", 1)[1],
@@ -24,6 +90,9 @@ def update_rev_in_gitlab_ci(repo, submodule_project, submodule_revision):
     ):
         repo.git.add(gitlab_ci_yml)
 
+    with open(gitlab_ci_yml, "r", encoding="utf8") as fp:
+        logging.debug(fp.read())
+
 
 def deploy_into(project, submodule, revision, branch, replace_existing_branch=False):
     """Update the submodule and include refs to the submodule in the given project.
@@ -190,7 +259,7 @@ def main():
         sys.exit(0)
 
     # The manifest needs to be merged at last
-    merge_requests.append(merge_request_manifest) 
+    merge_requests.append(merge_request_manifest)
     for mr in merge_requests:
         logging.debug("Merge %s", mr)
         # Wait until GitLab has checked merge status
diff --git a/manifest-build.yml b/manifest-build.yml
new file mode 100644
index 00000000..3dace580
--- /dev/null
+++ b/manifest-build.yml
@@ -0,0 +1,166 @@
+---
+variables:
+  BUILDPATH: "build-${CI_PARAM_DISTRO}-${CI_PARAM_MACHINE}"
+  IMAGEBASEPATH: "tmp/deploy/images/"
+  IMAGEPATH: "${IMAGEBASEPATH}/${CI_PARAM_MACHINE}"
+  LICENSESPATH: "tmp/deploy/licenses"
+  SDKPATH: "tmp/deploy/sdk/"
+  DEPLOYPATH_TEST: "/artifacts/${CI_JOB_ID}/"
+  GIT_BASE_URL: "git@${CI_SERVER_HOST}:${CI_PROJECT_ROOT_NAMESPACE}"
+  TESTS_GIT_URL: "${GIT_BASE_URL}/yocto/tests.git"
+
+.setup_ssh: &setup_ssh
+  # setup ssh key to access private repos
+  # https://docs.gitlab.com/ee/ci/ssh_keys/#ssh-keys-when-using-the-docker-executor
+  - eval $(ssh-agent -s)
+  - echo "$JENKINSGUF_SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
+  - mkdir -p ~/.ssh
+  - chmod 700 ~/.ssh
+  # add content of variable SSH_KNOWN_HOSTS to known hosts
+  # https://docs.gitlab.com/ee/ci/ssh_keys/#verifying-the-ssh-host-keys
+  - echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
+  - chmod 644 ~/.ssh/known_hosts
+
+.repo_checkout: &repo_checkout
+  - cd ${CI_PROJECT_DIR}
+  - repo init --submodules -u ${CI_REPOSITORY_URL}
+      -b refs/pipelines/${CI_PIPELINE_ID}
+  - repo sync --detach --current-branch --no-tags --force-remove-dirty
+      --optimized-fetch --force-sync
+
+.collect_srcrevs: &collect_srcrevs
+  # write all package AUTOREVS to file
+  - |-
+    SRCREVS_FILE="${CI_PROJECT_DIR}/${BUILDPATH}/${IMAGEPATH}/BUILD_SRCREVS.log"
+    if [ -d "$( dirname "${SRCREVS_FILE}" )" ];then
+        buildhistory-collect-srcrevs > ${SRCREVS_FILE}
+        cat ${SRCREVS_FILE}
+    fi
+
+.dump_install_command: &dump_install_command
+  # print install instructions
+  - |-
+    for i in ${INSTALLSCRIPTS};do
+    SCRIPT="${CI_PROJECT_DIR}/${BUILDPATH}/${IMAGEPATH}/${i}"
+    if [[ -f "${SCRIPT}" ]]; then
+      cat <<-EOF
+    ==============================
+        Install the image:
+
+    export GITLAB_TOKEN=<your_access_token>
+    FNG="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/jobs/${CI_JOB_ID}/artifacts/${BUILDPATH}/${IMAGEPATH}/${i}"
+    curl --location --header "PRIVATE-TOKEN: \$GITLAB_TOKEN" "\$FNG" \
+                              | sh -s -- --url="\$(dirname "\$FNG")"
+    ==============================
+    EOF
+    fi
+    done
+
+.build_script: &build_script
+  # setup build environment
+  - echo "Build configuration MACHINE=${CI_PARAM_MACHINE}
+      DISTRO=${CI_PARAM_DISTRO} IMAGE=${CI_PARAM_IMAGE}"
+  - echo "BUILD_MACHINE=$CI_PARAM_MACHINE" > build.env
+  - echo "BUILD_IMAGE=$CI_PARAM_IMAGE" >> build.env
+  - echo "BUILD_DISTRO=$CI_PARAM_DISTRO" >> build.env
+  - echo "Using build dir ${BUILDPATH}"
+  - export MACHINE="${CI_PARAM_MACHINE}"
+  - export DISTRO="${CI_PARAM_DISTRO}"
+  - export EULA="1"
+  - source ./"${SETUPSCRIPT}" "${BUILDPATH}"
+  # start build
+  - echo -e "section_start:`date +%s`:bitbake_run\r\e[0KBitbake Log"
+  - echo "bitbake ${CI_PARAM_IMAGE} -c ${BITBAKE_TASK}"
+  - bitbake "${CI_PARAM_IMAGE}" -c "${BITBAKE_TASK}"
+  - echo -e "section_end:`date +%s`:bitbake_run\r\e[0K"
+
+.build:
+  variables:
+    GIT_STRATEGY: none
+    SETUPSCRIPT: "setup-environment"
+    INSTALLSCRIPTS: "fng-install.sh fngsystem-self-update.sh"
+    BITBAKE_TASK: "build"
+  before_script:
+    - *setup_ssh
+    - *repo_checkout
+  script:
+    - *build_script
+    - *collect_srcrevs
+    - *dump_install_command
+
+  artifacts:
+    paths:
+      - "${BUILDPATH}/${IMAGEPATH}/*"
+      - "${BUILDPATH}/${LICENSESPATH}/**/license.manifest"
+    reports:
+      dotenv: build.env
+
+.package:
+  variables:
+    CI_PARAM_PACKAGE_FTP: "false"
+  after_script:
+    - |-
+      # Package release files
+      [ -e build.env ] && source build.env
+      BUILDPATH="build-${BUILD_DISTRO}-${BUILD_MACHINE}"
+      [ -z "${ARTIFACTS_IMAGE_PATH}" ] && \
+        ARTIFACTS_IMAGE_PATH="${BUILDPATH}/${IMAGEBASEPATH}/${BUILD_MACHINE}"
+      [ -z "${ARTIFACTS_LICENSES_PATH}" ] && \
+        ARTIFACTS_LICENSES_PATH="${BUILDPATH}/${LICENSESPATH}"
+      [ -z "${ARTIFACTS_SDK_PATH}" ] && \
+        ARTIFACTS_SDK_PATH="${BUILDPATH}/${SDKPATH}"
+
+      if $CI_PARAM_PACKAGE_FTP; then
+          UPLOAD_PARAM="" # don't store as gitlab artifact
+          OUTDIR_BASE="/artifacts-ftp"
+      else
+          UPLOAD_PARAM="--outputdir-upload=release"
+          OUTDIR_BASE="/artifacts"
+      fi
+
+      # If we are on the master branch and a tag is set
+      # we tread it as release
+      if [ -n "$CI_COMMIT_TAG" ];then
+        outdir="${OUTDIR_BASE}-yocto/Releases"
+        [ "${BUILD_DISTRO}" = "guf-fngsystem" ] && \
+          outdir="${OUTDIR_BASE}-fngsystem"
+      else
+        outdir="${OUTDIR_BASE}-yocto/Interne_Releases"
+        [ "${BUILD_DISTRO}" = "guf-fngsystem" ] && \
+          outdir="${OUTDIR_BASE}-fngsystem/CI_Builds"
+      fi
+
+      # Generate AlphaPlan FWR articles if release tag is set
+      if [ -n "$CI_COMMIT_TAG" ] && \
+        [[ "${CI_PARAM_PACKAGE_FTP}" == "false" ]];then
+        UPLOAD_PARAM="${UPLOAD_PARAM} --generate-fwr-articles"
+      fi
+
+      script=".gitlab-ci/package_release.py"
+      [ ! -x "$script" ] && script=".repo/manifests/$script"
+      [ ! -x "$script" ] && echo "Failed to find package_release script"
+
+      # Image if available
+      if [ -d "${ARTIFACTS_IMAGE_PATH}" ];then
+          $script \
+              --images-dir="${ARTIFACTS_IMAGE_PATH}" \
+              --licenses-dir="${ARTIFACTS_LICENSES_PATH}" \
+              --doc-dir=. \
+              --outputdir-local=${outdir} \
+              $UPLOAD_PARAM
+      fi
+      # SDK if available
+      if [ -d "${ARTIFACTS_SDK_PATH}" ];then
+          $script \
+              --sdk-dir=${ARTIFACTS_SDK_PATH} \
+              --outputdir-local="${outdir}"
+      fi
+
+.prepare_test:
+  before_script:
+    - *setup_ssh
+    - |-
+      # Copy artifacts to local server for automated tests
+      .gitlab-ci/package_release.py \
+        --images-dir="${BUILDPATH}/${IMAGEPATH}" \
+        --outputdir-local="${DEPLOYPATH_TEST}"
diff --git a/manifest.yml b/manifest.yml
new file mode 100644
index 00000000..e06e6f04
--- /dev/null
+++ b/manifest.yml
@@ -0,0 +1,516 @@
+# --------------------------------------------------------------------------------------
+# Global
+# --------------------------------------------------------------------------------------
+---
+include:
+  - local: manifest-build.yml
+
+stages:
+  - retrigger
+  - prepare
+  - build
+  - test
+  - deploy
+  - uploadftp
+
+variables:
+  # CI_IMAGES_BASEPATH: Environment variable configure in gitlab
+  CI_IMAGES_PATH: ${CI_IMAGES_BASEPATH}/ci-images
+  CI_IMAGES_REV: 44965ccdd847f1e077670f49d546047f8ad0110c
+  CI_IMAGE_PYTHON: "${CI_IMAGES_PATH}/python/3.9:${CI_IMAGES_REV}"
+  CI_IMAGE_YOCTO: "${CI_IMAGES_PATH}/yocto-build/ubuntu-20.04:${CI_IMAGES_REV}"
+  # The master branch is hardcoded here, because it cannot be determined
+  # automatically. Has to be modified for new branches, e.g. new Yocto
+  # versions or fix releases.
+  MASTER_BRANCH: dunfell
+  # Default image and distro
+  CI_PARAM_IMAGE: guf-image
+  CI_PARAM_DISTRO: guf-wayland
+
+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
+    - if: $CI_MERGE_REQUEST_IID
+      when: never
+    # Do not run pipelines on forked projects
+    # (use id instead of name because of rename)
+    - if: $CI_PROJECT_ID != "17852514"
+      when: never
+    # Do not run pipelines on integration branches, except from gitlab-ci repo
+    - if: $CI_COMMIT_REF_NAME =~ /^integrate\/.*/ &&
+          $CI_COMMIT_REF_NAME !~ /^integrate\/gitlab-ci\/.*/
+      when: never
+    # In all other cases, run the pipeline automatically
+    - when: always
+
+# --------------------------------------------------------------------------------------
+# Common infrastructure settings
+# --------------------------------------------------------------------------------------
+.infrastructure:
+  tags:
+    - infrastructure
+  timeout: 10m
+  image: "${CI_IMAGE_PYTHON}"
+  needs: []
+  variables:
+    # Include git submodules
+    GIT_SUBMODULE_STRATEGY: recursive
+
+# --------------------------------------------------------------------------------------
+# Stage: retrigger
+# --------------------------------------------------------------------------------------
+retrigger:
+  extends: .infrastructure
+  stage: retrigger
+  rules:
+    - if: $CI_COMMIT_REF_NAME == $MASTER_BRANCH && $CI_PIPELINE_SOURCE != "api"
+  script:
+    - PROJECTS=$(
+        .gitlab-ci/get_manifest_projects.py
+        --manifest=default.xml
+        --remote=seco-north
+        --concat-namespaces
+      )
+    - echo -e "Projects:\n${PROJECTS}"
+    - for PROJECT in ${PROJECTS}; do
+        .gitlab-ci/retrigger_mr_pipeline_jobs.py
+          --gitlab-url=${CI_SERVER_URL}
+          --token=${GITBOT_TOKEN}
+          --project=${PROJECT}
+          --state=opened
+          --target-branch=${MASTER_BRANCH}
+          --job=check
+        ;
+      done
+
+# --------------------------------------------------------------------------------------
+# Stage: prepare
+# --------------------------------------------------------------------------------------
+yamllint:
+  extends: .infrastructure
+  stage: prepare
+  rules:
+    - if: $CI_COMMIT_REF_NAME != $MASTER_BRANCH || $CI_PIPELINE_SOURCE == "api"
+  script:
+    - yamllint .*.yml
+
+changelog:
+  stage: prepare
+  rules:
+    - if: $CI_COMMIT_REF_NAME != $MASTER_BRANCH || $CI_PIPELINE_SOURCE == "api"
+  tags:
+    - infrastructure
+  variables:
+    IMAGE_PATH: ${CI_IMAGES_BASEPATH}/changelog-generator
+    IMAGE_REVISION: 2fd56690a5dabde6eda101182e8359f1c3609664
+  image:
+    name: "${IMAGE_PATH}:${IMAGE_REVISION}"
+    # set entrypoint to noop to be able to run from script
+    entrypoint: [""]
+  script: "changelog_generator.py --branch ${MASTER_BRANCH} > changelog.md"
+  artifacts:
+    expire_in: 4 weeks
+    paths:
+      - "changelog.md"
+
+# --------------------------------------------------------------------------------------
+# Stage: build
+# --------------------------------------------------------------------------------------
+.buildbase:
+  tags:
+    - builds
+  timeout: 8h
+  interruptible: true
+  image:
+    name: "${CI_IMAGE_YOCTO}"
+    # Override entrypoint so we can pass --id to set the UID and GID for the
+    # user that is created in the container. This is a feature of the
+    # crops/poky images. See poky-entry.py for details.
+    entrypoint:
+      - "/usr/bin/distro-entry.sh"
+      - "/usr/bin/dumb-init"
+      - "--"
+      - "/usr/bin/poky-entry.py"
+      - "--id=118:998"
+  artifacts:
+    expire_in: 4 weeks
+
+.buildimage:
+  extends:
+    - .buildbase
+    - .build
+  rules:
+    - if: $CI_COMMIT_REF_NAME != $MASTER_BRANCH || $CI_PIPELINE_SOURCE == "api"
+  needs: []
+
+.buildfng:
+  extends:
+    - .buildimage
+  variables:
+    CI_PARAM_IMAGE: fngsystem-image
+    CI_PARAM_DISTRO: guf-fngsystem
+
+build:merge_request:
+  extends: .infrastructure
+  stage: build
+  timeout: 1h
+  rules:
+    - if: $CI_COMMIT_REF_NAME == $MASTER_BRANCH && $CI_PIPELINE_SOURCE != "api"
+  script:
+    - cd ${CI_PROJECT_DIR}
+    # Get pipeline for merge request
+    - MR_PIPELINE=$(.gitlab-ci/get_pipelines.py
+        --gitlab-url=${CI_SERVER_URL}
+        --token=${GITBOT_TOKEN}
+        --project=${CI_PROJECT_PATH}
+        --commit=${CI_COMMIT_SHA}
+        --ref=^${MASTER_BRANCH} || true | head -1)
+    # If pipeline exists, mirror its result
+    - if [ ! -z "${MR_PIPELINE}" ]; then
+        .gitlab-ci/mirror_pipeline_result.py
+          --gitlab-url=${CI_SERVER_URL}
+          --token=${GITBOT_TOKEN}
+          --project=${CI_PROJECT_PATH}
+          --pipeline=${MR_PIPELINE}
+    # If no pipeline found, trigger a new one on the master
+    - else
+        .gitlab-ci/trigger_pipeline.py
+          --gitlab-url=${CI_SERVER_URL}
+          --token=${GITBOT_TOKEN}
+          --project=${CI_PROJECT_PATH}
+          --ref=${MASTER_BRANCH}
+    - fi
+
+.buildsdk:
+  extends:
+    - .buildimage
+    - .package
+  stage: build
+  rules:
+    - if: $CI_COMMIT_REF_NAME != $MASTER_BRANCH || $CI_PIPELINE_SOURCE == "api"
+      when: manual
+      allow_failure: true
+  variables:
+    BITBAKE_TASK: "populate_sdk"
+  artifacts:
+    paths:
+      - "${BUILDPATH}/${SDKPATH}/*.manifest"
+      - "${BUILDPATH}/${SDKPATH}/*.json"
+    reports:
+      dotenv: package.env
+
+# ---------------------------------------------------------------------------------------
+# Stage: test
+# ---------------------------------------------------------------------------------------
+.test:
+  extends:
+    - .infrastructure
+    - .prepare_test
+  timeout: 1h
+  rules:
+    - if: $CI_COMMIT_REF_NAME != $MASTER_BRANCH || $CI_PIPELINE_SOURCE == "api"
+      when: manual
+      allow_failure: true
+  variables:
+    # Include git submodules
+    GIT_SUBMODULE_STRATEGY: recursive
+    CI_PARAM_TEST_SUITE: '{platform}.jinja2'
+    CI_PARAM_EXTRA: --nop
+  artifacts:
+    when: always
+    paths:
+      - "results/**"
+    reports:
+      junit: results/results-*.xml
+  after_script:
+    - rm -r "${DEPLOYPATH_TEST}"
+
+  script:
+    - |-
+      # Submit tests to lava server
+      RELEASE=$(ls ${DEPLOYPATH_TEST}/)
+      INSTALLSCRIPT_ABS="$DEPLOYPATH_TEST/$RELEASE/$CI_PARAM_MACHINE/fng-install.sh"
+      FNG_INSTALL_URL="${ARTIFACTS_HOST_URL}/${INSTALLSCRIPT_ABS#/*/}"
+      .gitlab-ci/submit_test.py \
+          --fng-install "${FNG_INSTALL_URL}" \
+          --name \
+          "Gitlab build test ${CI_PARAM_MACHINE} ${RELEASE} ${CI_PIPELINE_ID}" \
+          --results-path "results" \
+          --test-repo ${TESTS_GIT_URL} \
+          --test-repo-branch ${MASTER_BRANCH} \
+          --test-plan ${CI_PARAM_TEST_SUITE} \
+          ${CI_PARAM_EXTRA} \
+          ${CI_PARAM_PLATFORMS}
+
+# --------------------------------------------------------------------------------------
+# Stage: deploy
+# --------------------------------------------------------------------------------------
+.deployimage:
+  extends:
+    - .infrastructure
+    - .package
+  rules:
+    - if: $CI_COMMIT_REF_NAME != $MASTER_BRANCH || $CI_PIPELINE_SOURCE == "api"
+      when: manual
+      allow_failure: true
+  script:
+    - echo
+  artifacts:
+    paths:
+      - release/**/**/*
+    reports:
+      dotenv: package.env
+
+# --------------------------------------------------------------------------------------
+# Stage: uploadftp
+# --------------------------------------------------------------------------------------
+.uploadftp:
+  variables:
+    CI_PARAM_PACKAGE_FTP: "true"
+  extends:
+    - .infrastructure
+    - .package
+  rules:
+    - if: $CI_COMMIT_TAG
+      when: manual
+      allow_failure: true
+  script:
+    - echo
+
+.uploadsdkftp:
+  variables:
+    ARTIFACTS_SDK_PATH: "$LOCALDIR/$BUILD_MACHINE/sdk"
+
+# ---------------------------------------------------------------------------------------
+# Actual jobs
+# ---------------------------------------------------------------------------------------
+
+build:imx6guf:
+  extends: .buildimage
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx6guf
+
+build:imx6ullguf:
+  extends: .buildimage
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx6ullguf
+
+build:imx8mguf:
+  extends: .buildimage
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx8mguf
+
+build:imx8mpguf:
+  extends: .buildimage
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx8mpguf
+
+build:imx6guf:fngsystem:
+  extends: .buildfng
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx6guf
+
+build:imx6ullguf:fngsystem:
+  extends: .buildfng
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx6ullguf
+
+build:imx8mguf:fngsystem:
+  extends: .buildfng
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx8mguf
+
+build:imx8mpguf:fngsystem:
+  extends: .buildfng
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx8mpguf
+
+# -------------------------------------------------------------------------------------
+
+buildsdk:imx6guf:
+  extends: .buildsdk
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx6guf
+
+buildsdk:imx6ullguf:
+  extends: .buildsdk
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx6ullguf
+
+buildsdk:imx8mguf:
+  extends: .buildsdk
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx8mguf
+
+buildsdk:imx8mpguf:
+  extends: .buildsdk
+  stage: build
+  variables:
+    CI_PARAM_MACHINE: imx8mpguf
+
+# -------------------------------------------------------------------------------------
+
+deployimage:imx6guf:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx6guf", "changelog"]
+
+deployimage:imx6ullguf:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx6ullguf", "changelog"]
+
+deployimage:imx8mguf:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx8mguf", "changelog"]
+
+deployimage:imx8mpguf:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx8mpguf", "changelog"]
+
+deployimage:imx6guf:fngsystem:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx6guf:fngsystem", "changelog"]
+
+deployimage:imx6ullguf:fngsystem:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx6ullguf:fngsystem", "changelog"]
+
+deployimage:imx8mguf:fngsystem:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx8mguf:fngsystem", "changelog"]
+
+deployimage:imx8mpguf:fngsystem:
+  extends: .deployimage
+  stage: deploy
+  needs: ["build:imx8mpguf:fngsystem", "changelog"]
+
+# -------------------------------------------------------------------------------------
+
+uploadftp:imx6guf:
+  extends:
+    - .uploadftp
+    - .uploadsdkftp
+  stage: uploadftp
+  needs: ["build:imx6guf", "buildsdk:imx6guf", "changelog"]
+
+uploadftp:imx6ullguf:
+  extends:
+    - .uploadftp
+    - .uploadsdkftp
+  stage: uploadftp
+  needs: ["build:imx6ullguf", "buildsdk:imx6ullguf", "changelog"]
+
+uploadftp:imx8mguf:
+  extends:
+    - .uploadftp
+    - .uploadsdkftp
+  stage: uploadftp
+  needs: ["build:imx8mguf", "buildsdk:imx8mguf", "changelog"]
+
+uploadftp:imx8mpguf:
+  extends:
+    - .uploadftp
+    - .uploadsdkftp
+  stage: uploadftp
+  needs: ["build:imx8mpguf", "buildsdk:imx8mpguf", "changelog"]
+
+uploadftp:imx6guf:fngsystem:
+  extends: .uploadftp
+  stage: uploadftp
+  needs: ["build:imx6guf:fngsystem", "changelog"]
+
+uploadftp:imx6ullguf:fngsystem:
+  extends: .uploadftp
+  stage: uploadftp
+  needs: ["build:imx6ullguf:fngsystem", "changelog"]
+
+uploadftp:imx8mguf:fngsystem:
+  extends: .uploadftp
+  stage: uploadftp
+  needs: ["build:imx8mguf:fngsystem", "changelog"]
+
+uploadftp:imx8mpguf:fngsystem:
+  extends: .uploadftp
+  stage: uploadftp
+  needs: ["build:imx8mpguf:fngsystem", "changelog"]
+
+# -------------------------------------------------------------------------------------
+
+platformtest:imx6guf:
+  extends: .test
+  stage: test
+  needs:
+    - job: build:imx6guf
+  variables:
+    CI_PARAM_MACHINE: imx6guf
+    CI_PARAM_PLATFORMS: santaro santoka santino santino-lt
+
+platformtest:imx6ullguf:
+  extends: .test
+  stage: test
+  needs:
+    - job: build:imx6ullguf
+  variables:
+    CI_PARAM_MACHINE: imx6ullguf
+    CI_PARAM_PLATFORMS: nallino
+
+platformtest:imx8mguf:
+  extends: .test
+  stage: test
+  needs:
+    - job: build:imx6ullguf
+  variables:
+    CI_PARAM_MACHINE: imx8mguf
+    CI_PARAM_PLATFORMS: tanaro
+
+smoketest:imx6guf:
+  extends: .test
+  stage: test
+  needs:
+    - job: build:imx6guf
+  variables:
+    CI_PARAM_MACHINE: imx6guf
+    CI_PARAM_PLATFORMS: imx6guf
+    CI_PARAM_TEST_SUITE: boot.jinja2
+    CI_PARAM_EXTRA: --all-devices
+
+smoketest:imx6ullguf:
+  extends: .test
+  stage: test
+  needs:
+    - job: build:imx6ullguf
+  variables:
+    CI_PARAM_MACHINE: imx6ullguf
+    CI_PARAM_PLATFORMS: imx6ullguf
+    CI_PARAM_TEST_SUITE: boot.jinja2
+    CI_PARAM_EXTRA: --all-devices
+
+smoketest:imx8mguf:
+  extends: .test
+  stage: test
+  needs:
+    - job: build:imx8mguf
+  variables:
+    CI_PARAM_MACHINE: imx8mguf
+    CI_PARAM_PLATFORMS: imx8mguf
+    CI_PARAM_TEST_SUITE: boot.jinja2
+    CI_PARAM_EXTRA: --all-devices
-- 
GitLab