From 0671f49c2d8b4f1cf88be84cd091c9be1118fca4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Moreno=20i=20Caireta=2C=20I=C3=B1igo?=
 <inigo.moreno@tecnalia.com>
Date: Tue, 21 Sep 2021 15:10:54 +0200
Subject: [PATCH] Squashed: "Improve CI template organization"

---
 ...ab-industrial-ci-kinetic-no-rosinstall.yml | 191 +----------------
 ...-industrial-ci-kinetic-with-rosinstall.yml | 193 +-----------------
 README.adoc                                   |  28 +--
 ci-templates/README.adoc                      |  54 +++++
 ci-templates/auto-rules/kinetic-default.yml   |   4 +
 ci-templates/auto-rules/melodic-default.yml   |   4 +
 ci-templates/auto-rules/no-default.yml        |  86 ++++++++
 ci-templates/auto-rules/noetic-default.yml    |   4 +
 .../with-rosinstall/kinetic-default.yml       |   4 +
 .../with-rosinstall/melodic-default.yml       |   4 +
 .../auto-rules/with-rosinstall/no-default.yml |   6 +
 .../with-rosinstall/noetic-default.yml        |   4 +
 ci-templates/core.yml                         |  31 +++
 ci-templates/examples/build_vars.yml          |   8 +
 ci-templates/examples/manual_job.yml          |   9 +
 ci-templates/examples/simple_include.yml      |   3 +
 ci-templates/industrial-ci-templates.yml      |  38 ++++
 ci-templates/syntax-check.yml                 |  83 ++++++++
 18 files changed, 351 insertions(+), 403 deletions(-)
 create mode 100644 ci-templates/README.adoc
 create mode 100644 ci-templates/auto-rules/kinetic-default.yml
 create mode 100644 ci-templates/auto-rules/melodic-default.yml
 create mode 100644 ci-templates/auto-rules/no-default.yml
 create mode 100644 ci-templates/auto-rules/noetic-default.yml
 create mode 100644 ci-templates/auto-rules/with-rosinstall/kinetic-default.yml
 create mode 100644 ci-templates/auto-rules/with-rosinstall/melodic-default.yml
 create mode 100644 ci-templates/auto-rules/with-rosinstall/no-default.yml
 create mode 100644 ci-templates/auto-rules/with-rosinstall/noetic-default.yml
 create mode 100644 ci-templates/core.yml
 create mode 100644 ci-templates/examples/build_vars.yml
 create mode 100644 ci-templates/examples/manual_job.yml
 create mode 100644 ci-templates/examples/simple_include.yml
 create mode 100644 ci-templates/industrial-ci-templates.yml
 create mode 100644 ci-templates/syntax-check.yml

diff --git a/.gitlab-industrial-ci-kinetic-no-rosinstall.yml b/.gitlab-industrial-ci-kinetic-no-rosinstall.yml
index d5cc20d..0e7c125 100644
--- a/.gitlab-industrial-ci-kinetic-no-rosinstall.yml
+++ b/.gitlab-industrial-ci-kinetic-no-rosinstall.yml
@@ -1,188 +1,3 @@
-image: tecnalia-docker-dev.artifact.tecnalia.com/docker:git
-
-variables:
-  TMPDIR: /builds/${CI_PROJECT_NAMESPACE}
-  GIT_LFS_SKIP_SMUDGE: 1 # Avoid fetching the files from LFS when doing git fetch
-
-services:
-  - name: tecnalia-docker-dev.artifact.tecnalia.com/docker:dind
-    alias: docker
-
-stages:
-  - build
-  - postcheck
-
-workflow:
-  rules:
-    - if: $CI_COMMIT_TAG
-    - if: $CI_COMMIT_BRANCH
-
-before_script:
-  - apk add --update bash coreutils tar wget
-  - docker login tecnalia-docker-dev.artifact.tecnalia.com -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
-
-.industrial_ci:
-  stage: build
-  before_script:
-    - apk add --update bash coreutils tar
-    - git clone --quiet --depth 1 https://github.com/ros-industrial/industrial_ci.git .ci_config
-    - docker login ${ARTIFACT_DOCKER_URL} -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
-    - docker login tecnalia-docker-dev.artifact.tecnalia.com -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
-  script: .ci_config/gitlab.sh
-  variables:
-    ADDITIONAL_DEBS: curl
-    PARALLEL_BUILDS: 2 # keep this for now, since there seems to be memory limit issues in the ci VM
-    AFTER_SETUP_TARGET_WORKSPACE: rosenv && bash <(curl -Ls https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/ci_run_entry_points.sh) $$current_ws
-    CMAKE_ARGS: -DCMAKE_CXX_FLAGS=-Wno-ignored-attributes -Wno-int-in-bool-context
-  tags:
-    - docker
-
-industrial_ci_kinetic:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: kinetic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-  rules:
-    - if: $CI_COMMIT_TAG
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^melodic-.*/
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^noetic-.*/
-      when: never
-    - when: always
-
-industrial_ci_melodic:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: melodic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-  rules:
-    - if: $CI_COMMIT_TAG
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^melodic-.*/
-
-industrial_ci_noetic:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: noetic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-  rules:
-    - if: $CI_COMMIT_TAG
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^noetic-.*/
-
-industrial_ci_kinetic_deploy:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: kinetic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-    AFTER_SCRIPT: "wget -q -O - https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/pre-deploy-cleanup.bash | bash"
-    DOCKER_COMMIT: industrial_ci_image
-  script:
-    - .ci_config/gitlab.sh
-    - cd $(mktemp -d)
-    - wget https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/-/archive/master/gitlab_templates-master.zip
-    - unzip gitlab_templates-master.zip && cd gitlab_templates-master/deploy
-    - cd base
-    - chmod a+x ros_entrypoint.bash
-    - docker build -t ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME} .
-    - docker push ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}
-    - cd ..
-    - cd dev
-    - docker build --build-arg APPLICATION_IMAGE=${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME} -t ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}-dev .
-    - docker push ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}-dev
-    - cd ..
-  rules:
-    - if: $CI_COMMIT_TAG
-
-clang_format:
-  stage: postcheck
-  before_script:
-    - apk add --update bash coreutils tar wget
-    - git clone --quiet --depth 1 https://github.com/ros-industrial/industrial_ci.git .ci_config -b legacy
-    - wget https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/clang-format -O .clang-format
-  script: .ci_config/gitlab.sh
-  variables:
-    ROS_DISTRO: kinetic
-    CLANG_FORMAT_CHECK: file
-    CLANG_FORMAT_VERSION: "3.8"
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Simple check for basic Python syntax errors; this is much less thorough than
-## other options like pylint, but much faster and less strict
-##########################################################
-python_syntax:
-  before_script:
-    - apk add --update python2
-  stage: build
-  script: python -m compileall -q .
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for errors in bash/sh scripts
-## Uses https://github.com/koalaman/shellcheck
-##########################################################
-bash_syntax:
-  before_script:
-    - apk add --update shellcheck
-  stage: postcheck
-  script:
-    - RET=0
-    - find . -type f -name '*.sh' -exec shellcheck -s sh {} + || RET=1
-    - find . -type f -name '*.bash' -exec shellcheck -s bash {} + || RET=1
-    - exit $RET
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for errors in markdown files
-## Uses https://github.com/cytopia/awesome-ci
-## Disables the line length rule with --custom="-r ..."
-## See other rules that can be configured in
-## https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md
-##########################################################
-markdown_syntax:
-  stage: postcheck
-  script: docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci syntax-markdown --path=/ac --extension=md --ignore=.ci_config --custom="-r ~MD013,~MD014"
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for various syntax issues in files; currently
-##  trailing white spaces
-##  utf8 formatting
-## Uses https://github.com/cytopia/awesome-ci
-##########################################################
-file_syntax:
-  stage: postcheck
-  script:
-    - RET=0
-    - docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci file-trailing-space --path=/ac --extension=py,txt,cpp,h,md,sh,bash,xml,launch --ignore=.ci_config || RET=1
-    - docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci file-utf8 --path=/ac --extension=py,txt,cpp,h,md,sh,bash,xml,launch --ignore=.ci_config || RET=1
-    - exit $RET
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for errors in Asciidoctor files
-## Could not find a proper linter for Asciidoctor format,
-## so this is a custom-made "dirty" script
-##########################################################
-adoc_syntax:
-  stage: postcheck
-  image: tecnalia-docker-dev.artifact.tecnalia.com/alpine
-  before_script:
-    - apk add --update curl asciidoctor bash
-  script:
-    - curl -Ls https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/asciidoctor_syntax_check.bash | bash -s -- .
-  tags:
-    - docker
-  when: always
+include:
+  - project: tecnalia_robotics-public/gitlab_templates
+    file: ci-templates/auto-rules/kinetic-default.yml
\ No newline at end of file
diff --git a/.gitlab-industrial-ci-kinetic-with-rosinstall.yml b/.gitlab-industrial-ci-kinetic-with-rosinstall.yml
index 643b46b..2413c17 100644
--- a/.gitlab-industrial-ci-kinetic-with-rosinstall.yml
+++ b/.gitlab-industrial-ci-kinetic-with-rosinstall.yml
@@ -1,190 +1,3 @@
-image: tecnalia-docker-dev.artifact.tecnalia.com/docker:git
-
-variables:
-  TMPDIR: /builds/${CI_PROJECT_NAMESPACE}
-  GIT_LFS_SKIP_SMUDGE: 1 # Avoid fetching the files from LFS when doing git fetch
-
-services:
-  - name: tecnalia-docker-dev.artifact.tecnalia.com/docker:dind
-    alias: docker
-
-stages:
-  - build
-  - postcheck
-
-workflow:
-  rules:
-    - if: $CI_COMMIT_TAG
-    - if: $CI_COMMIT_BRANCH
-
-before_script:
-  - apk add --update bash coreutils tar wget
-  - docker login tecnalia-docker-dev.artifact.tecnalia.com -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
-
-.industrial_ci:
-  stage: build
-  before_script:
-    - apk add --update bash coreutils tar
-    - git clone --quiet --depth 1 https://github.com/ros-industrial/industrial_ci.git .ci_config
-    - docker login ${ARTIFACT_DOCKER_URL} -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
-    - docker login tecnalia-docker-dev.artifact.tecnalia.com -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
-  script: .ci_config/gitlab.sh
-  variables:
-    ADDITIONAL_DEBS: curl
-    PARALLEL_BUILDS: 2 # keep this for now, since there seems to be memory limit issues in the ci VM
-    UPSTREAM_WORKSPACE: .rosinstall
-    AFTER_SETUP_UPSTREAM_WORKSPACE: "rosenv && bash <(curl -Ls https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/ci_run_entry_points.sh) $$current_ws"
-    AFTER_SETUP_TARGET_WORKSPACE: "rosenv && bash <(curl -Ls https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/ci_run_entry_points.sh) $$current_ws"
-    CMAKE_ARGS: '-DCMAKE_CXX_FLAGS=-Wno-ignored-attributes -Wno-int-in-bool-context'
-  tags:
-    - docker
-
-industrial_ci_kinetic:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: kinetic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-  rules:
-    - if: $CI_COMMIT_TAG
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^melodic-.*/
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^noetic-.*/
-      when: never
-    - when: always
-
-industrial_ci_melodic:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: melodic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-  rules:
-    - if: $CI_COMMIT_TAG
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^melodic-.*/
-
-industrial_ci_noetic:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: noetic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-  rules:
-    - if: $CI_COMMIT_TAG
-      when: never
-    - if: $CI_COMMIT_REF_NAME =~ /^noetic-.*/
-
-industrial_ci_kinetic_deploy:
-  extends: .industrial_ci
-  variables:
-    ROS_DISTRO: kinetic
-    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
-    AFTER_SCRIPT: "wget -q -O - https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/pre-deploy-cleanup.bash | bash"
-    DOCKER_COMMIT: industrial_ci_image
-  script:
-    - .ci_config/gitlab.sh
-    - cd $(mktemp -d)
-    - wget https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/-/archive/master/gitlab_templates-master.zip
-    - unzip gitlab_templates-master.zip && cd gitlab_templates-master/deploy
-    - cd base
-    - chmod a+x ros_entrypoint.bash
-    - docker build -t ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME} .
-    - docker push ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}
-    - cd ..
-    - cd dev
-    - docker build --build-arg APPLICATION_IMAGE=${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME} -t ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}-dev .
-    - docker push ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}-dev
-    - cd ..
-  rules:
-    - if: $CI_COMMIT_TAG
-
-clang_format:
-  stage: postcheck
-  before_script:
-    - apk add --update bash coreutils tar wget
-    - git clone --quiet --depth 1 https://github.com/ros-industrial/industrial_ci.git .ci_config -b legacy
-    - wget https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/clang-format -O .clang-format
-  script: .ci_config/gitlab.sh
-  variables:
-    ROS_DISTRO: kinetic
-    CLANG_FORMAT_CHECK: file
-    CLANG_FORMAT_VERSION: "3.8"
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Simple check for basic Python syntax errors; this is much less thorough than
-## other options like pylint, but much faster and less strict
-##########################################################
-python_syntax:
-  before_script:
-    - apk add --update python2
-  stage: build
-  script: python -m compileall -q .
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for errors in bash/sh scripts
-## Uses https://github.com/koalaman/shellcheck
-##########################################################
-bash_syntax:
-  before_script:
-    - apk add --update shellcheck
-  stage: postcheck
-  script:
-    - RET=0
-    - find . -type f -name '*.sh' -exec shellcheck -s sh {} + || RET=1
-    - find . -type f -name '*.bash' -exec shellcheck -s bash {} + || RET=1
-    - exit $RET
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for errors in markdown files
-## Uses https://github.com/cytopia/awesome-ci
-## Disables the line length rule with --custom="-r ..."
-## See other rules that can be configured in
-## https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md
-##########################################################
-markdown_syntax:
-  stage: postcheck
-  script: docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci syntax-markdown --path=/ac --extension=md --ignore=.ci_config --custom="-r ~MD013,~MD014"
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for various syntax issues in files; currently
-##  trailing white spaces
-##  utf8 formatting
-## Uses https://github.com/cytopia/awesome-ci
-##########################################################
-file_syntax:
-  stage: postcheck
-  script:
-    - RET=0
-    - docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci file-trailing-space --path=/ac --extension=py,txt,cpp,h,md,sh,bash,xml,launch --ignore=.ci_config || RET=1
-    - docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci file-utf8 --path=/ac --extension=py,txt,cpp,h,md,sh,bash,xml,launch --ignore=.ci_config || RET=1
-    - exit $RET
-  when: always
-  tags:
-    - docker
-
-##########################################################
-## Check for errors in Asciidoctor files
-## Could not find a proper linter for Asciidoctor format,
-## so this is a custom-made "dirty" script
-##########################################################
-adoc_syntax:
-  stage: postcheck
-  image: tecnalia-docker-dev.artifact.tecnalia.com/alpine
-  before_script:
-    - apk add --update curl asciidoctor bash
-  script:
-    - curl -Ls https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/asciidoctor_syntax_check.bash | bash -s -- .
-  tags:
-    - docker
-  when: always
+include:
+  - project: tecnalia_robotics-public/gitlab_templates
+    file: ci-templates/auto-rules/with-rosinstall/kinetic-default.yml
\ No newline at end of file
diff --git a/README.adoc b/README.adoc
index f50fb4d..eb4ff72 100644
--- a/README.adoc
+++ b/README.adoc
@@ -1,32 +1,10 @@
 = GitLab Templates
+:toc:
 
 This repository contains miscellaneous resources that need to be accessible without authentication.
 
-== GitLab CI templates
 
-Two templates with default CI pipeline configurations are provided, for any repo to make use of:
-
-- `.gitlab-industrial-ci-kinetic-no-rosinstall.yml`
-- `.gitlab-industrial-ci-kinetic-with-rosinstall.yml`
-
-Both define basically the same pipeline, consisting of the following stages and jobs:
-
-- Stage: `precheck`
-  * Check python syntax
-- Stage: `build`
-  * Run `industrial_ci`
-    ** Uses `flexbotics-base-devel` as a starting image
-    ** Runs link:scripts/ci_run_entry_points.sh[] in the `BEFORE_SCRIPT` stage, which in turn finds and runs every `ci_entry_script.bash` script found in the source tree (target repo + repos from `.rosinstall`)
-  * Only when tags are pushed:
-    ** Run some cleanup in the `industrial_ci` context (e.g. delete sources)
-    ** Commit image used by `industrial_ci`
-    ** Build deployment image on top of it and push it to our registry
-- Stage: `postcheck` (jobs in this stage are allowed to fail)
-  * Check `bash`/`sh` script syntax
-  * Check Markdown syntax
-  * Check files have no trailing whitespace and are UTF-8 encoded
-
-It is important to note that both images set the variable `GIT_LFS_SKIP_SMUDGE`, which means that when the repositories are cloned/fetched, the files hosted using Git LFS will not be downloaded. An example on how to explicitely fetch the files from LFS can be found in the https://git.code.tecnalia.com/tecnalia_robotics/common_config/blob/e93dbe6379d94e6a895a33c59bf17ccab26eacf9/.gitlab-ci.yml#L132[common_config repository].
+include::ci-templates/README.adoc[leveloffset=+1]
 
 == Custom `rosdep` definitions
 
@@ -37,5 +15,5 @@ Custom `rosdep` definitions for the packages hosted in our internal debian repos
 Resources required for building the deployment docker images are also hosted in this repository.
 This basically boils down to:
 
-- link:scripts/pre-deploy-cleanup.bash[] is run in the `industrial_ci` container before commiting to an image
+- link:scripts/pre-deploy-cleanup.bash[] is run in the `.industrial_ci_deploy` template before commiting to an image
 - link:deploy/Dockerfile[] is used to perform some additional cleanup and install link:deploy/ros_entrypoint.bash[] as entrypoint script on top of the `industrial_ci` image
diff --git a/ci-templates/README.adoc b/ci-templates/README.adoc
new file mode 100644
index 0000000..d4f1a0d
--- /dev/null
+++ b/ci-templates/README.adoc
@@ -0,0 +1,54 @@
+
+= GitLab CI templates
+
+Templates for GitLab Continuous Integration are provided in the folder link:ci-templates[]. These can be included from any repo by using `include:project`:
+
+```yml
+include::examples/simple_include.yml[]
+```
+
+== Core Pipeline
+The Core pipeline, defined in link:ci-templates/core.yml[], has the following structure:
+
+- Stage: `build`
+  * Check python syntax
+  * `.industrial_ci` template (see https://github.com/ros-industrial/industrial_ci[the industrial_ci repo]), which can be used to define jobs that build `ROS` packages
+    ** Needs the `ROS_DISTRO` variable to be defined
+    ** If the package has `.rosinstall` dependencies, they can be installed using the variable `UPSTREAM_WORKSPACE`
+    ** Uses `flexbotics-base-devel:${ROS_DISTRO}` as a starting image
+    ** Runs link:scripts/ci_run_entry_points.sh[] in the `AFTER_SETUP_TARGET_WORKSPACE` stage, which in turn finds and runs every `ci_entry_script.bash` script found in the target repo.
+  * `.industrial_ci_deploy` template, which:
+    ** Runs `industrial_ci` by extending `.industrial_ci`
+    ** Runs some cleanup in the `industrial_ci` context (e.g. delete sources)
+    ** Commits image used by `industrial_ci`
+    ** Builds deployment image on top of it and push it to our registry
+- Stage: `.post`
+  * Check `bash`/`sh` script syntax
+  * Check Markdown and AsciiDoc syntax
+  * Check files have no trailing whitespace and are `UTF-8` encoded
+  * Check that `C++` files follow this link:clang-format[]
+
+It is important to note that both templates set the variable `GIT_LFS_SKIP_SMUDGE`, which means that when the repositories are cloned/fetched, the files hosted using Git LFS will not be downloaded. An example on how to explicitely fetch the files from LFS can be found in the https://git.code.tecnalia.com/tecnalia_robotics/common_config/blob/e93dbe6379d94e6a895a33c59bf17ccab26eacf9/.gitlab-ci.yml#L132[common_config repository].
+
+== Manual Jobs
+
+Using the templates defined by the core pipeline, one can easily define jobs to build the packages in the repo.
+
+```yml
+include::examples/manual_job.yml[]
+```
+
+More examples can be found in link:ci-templates/examples[].
+
+== Auto Rules
+In the link:ci-templates/auto-rules[] folder, automatic pipelines are defined that will try to detect the ROS distro from the branch name and create jobs.
+For example, if the branch starts with `noetic-` it will build for noetic.
+If the branch doesn't start with any ROS distro, it will build the default distro, which can be specified with the variable `DEFAULT_DISTRO`.
+For convenience, some templates are provided that already set this variable.
+If your repo needs to uses `.rosinstall`, you can use the templates in the link:ci-templates/auto-rules/with-rosinstall[] folder.
+
+The auto rules also allow for using variables to explicitely activate each job:
+
+```yml
+include::examples/build_vars.yml[]
+```
diff --git a/ci-templates/auto-rules/kinetic-default.yml b/ci-templates/auto-rules/kinetic-default.yml
new file mode 100644
index 0000000..7bc72b9
--- /dev/null
+++ b/ci-templates/auto-rules/kinetic-default.yml
@@ -0,0 +1,4 @@
+include : ci-templates/auto-rules/no-default.yml
+
+variables:
+  DEFAULT_DISTRO: kinetic
\ No newline at end of file
diff --git a/ci-templates/auto-rules/melodic-default.yml b/ci-templates/auto-rules/melodic-default.yml
new file mode 100644
index 0000000..62379b9
--- /dev/null
+++ b/ci-templates/auto-rules/melodic-default.yml
@@ -0,0 +1,4 @@
+include : ci-templates/auto-rules/no-default.yml
+
+variables:
+  DEFAULT_DISTRO: melodic
\ No newline at end of file
diff --git a/ci-templates/auto-rules/no-default.yml b/ci-templates/auto-rules/no-default.yml
new file mode 100644
index 0000000..a2f6a98
--- /dev/null
+++ b/ci-templates/auto-rules/no-default.yml
@@ -0,0 +1,86 @@
+include : ci-templates/core.yml
+
+workflow:
+  rules:
+    - if: $CI_COMMIT_BRANCH && $CI_COMMIT_REF_NAME =~ /^kinetic-.*/
+      variables:
+        DEFAULT_DISTRO: "kinetic"
+    - if: $CI_COMMIT_BRANCH && $CI_COMMIT_REF_NAME =~ /^melodic-.*/
+      variables:
+        DEFAULT_DISTRO: "melodic"
+    - if: $CI_COMMIT_BRANCH && $CI_COMMIT_REF_NAME =~ /^noetic-.*/
+      variables:
+        DEFAULT_DISTRO: "noetic"
+    - if: $CI_COMMIT_TAG && $CI_COMMIT_REF_NAME =~ /^kinetic-.*/
+      variables:
+        DEFAULT_DISTRO: "kinetic"
+        DEPLOY: "true"
+    - if: $CI_COMMIT_TAG && $CI_COMMIT_REF_NAME =~ /^melodic-.*/
+      variables:
+        DEFAULT_DISTRO: "melodic"
+        DEPLOY: "true"
+    - if: $CI_COMMIT_TAG && $CI_COMMIT_REF_NAME =~ /^noetic-.*/
+      variables:
+        DEFAULT_DISTRO: "noetic"
+        DEPLOY: "true"
+    - if: $CI_COMMIT_TAG
+      variables:
+        DEPLOY: "true"
+    - if: $CI_COMMIT_BRANCH
+
+
+industrial_ci_kinetic:
+  extends: .industrial_ci
+  variables:
+    ROS_DISTRO: kinetic
+  rules:
+    - if: $DEPLOY
+      when: never
+    - if: $DEFAULT_DISTRO == "kinetic"
+    - if: $BUILD_KINETIC
+
+industrial_ci_melodic:
+  extends: .industrial_ci
+  variables:
+    ROS_DISTRO: melodic
+  rules:
+    - if: $DEPLOY
+      when: never
+    - if: $DEFAULT_DISTRO == "melodic"
+    - if: $BUILD_MELODIC
+
+industrial_ci_noetic:
+  extends: .industrial_ci
+  variables:
+    ROS_DISTRO: noetic
+  rules:
+    - if: $DEPLOY
+      when: never
+    - if: $DEFAULT_DISTRO == "noetic"
+    - if: $BUILD_NOETIC
+
+
+
+industrial_kinetic_deploy:
+  extends:
+    - industrial_ci_kinetic
+    - .industrial_ci_deploy
+  rules:
+    - if: $DEPLOY && $DEFAULT_DISTRO == "kinetic"
+    - if: $DEPLOY && $BUILD_KINETIC
+
+industrial_melodic_deploy:
+  extends:
+    - industrial_ci_melodic
+    - .industrial_ci_deploy
+  rules:
+    - if: $DEPLOY && $DEFAULT_DISTRO == "melodic"
+    - if: $DEPLOY && $BUILD_MELODIC
+
+industrial_noetic_deploy:
+  extends:
+    - industrial_ci_noetic
+    - .industrial_ci_deploy
+  rules:
+    - if: $DEPLOY && $DEFAULT_DISTRO == "noetic"
+    - if: $DEPLOY && $BUILD_NOETIC
diff --git a/ci-templates/auto-rules/noetic-default.yml b/ci-templates/auto-rules/noetic-default.yml
new file mode 100644
index 0000000..f35658b
--- /dev/null
+++ b/ci-templates/auto-rules/noetic-default.yml
@@ -0,0 +1,4 @@
+include : ci-templates/auto-rules/no-default.yml
+
+variables:
+  DEFAULT_DISTRO: noetic
\ No newline at end of file
diff --git a/ci-templates/auto-rules/with-rosinstall/kinetic-default.yml b/ci-templates/auto-rules/with-rosinstall/kinetic-default.yml
new file mode 100644
index 0000000..fe99b53
--- /dev/null
+++ b/ci-templates/auto-rules/with-rosinstall/kinetic-default.yml
@@ -0,0 +1,4 @@
+include : ci-templates/auto-rules/with-rosinstall/no-default.yml
+
+variables:
+  DEFAULT_DISTRO: kinetic
\ No newline at end of file
diff --git a/ci-templates/auto-rules/with-rosinstall/melodic-default.yml b/ci-templates/auto-rules/with-rosinstall/melodic-default.yml
new file mode 100644
index 0000000..47e501b
--- /dev/null
+++ b/ci-templates/auto-rules/with-rosinstall/melodic-default.yml
@@ -0,0 +1,4 @@
+include : ci-templates/auto-rules/with-rosinstall/no-default.yml
+
+variables:
+  DEFAULT_DISTRO: melodic
\ No newline at end of file
diff --git a/ci-templates/auto-rules/with-rosinstall/no-default.yml b/ci-templates/auto-rules/with-rosinstall/no-default.yml
new file mode 100644
index 0000000..f4735f5
--- /dev/null
+++ b/ci-templates/auto-rules/with-rosinstall/no-default.yml
@@ -0,0 +1,6 @@
+include : ci-templates/auto-rules/no-default.yml
+
+
+.industrial_ci:
+  variables:
+    UPSTREAM_WORKSPACE: .rosinstall
\ No newline at end of file
diff --git a/ci-templates/auto-rules/with-rosinstall/noetic-default.yml b/ci-templates/auto-rules/with-rosinstall/noetic-default.yml
new file mode 100644
index 0000000..0d83acd
--- /dev/null
+++ b/ci-templates/auto-rules/with-rosinstall/noetic-default.yml
@@ -0,0 +1,4 @@
+include : ci-templates/auto-rules/with-rosinstall/no-default.yml
+
+variables:
+  DEFAULT_DISTRO: noetic
\ No newline at end of file
diff --git a/ci-templates/core.yml b/ci-templates/core.yml
new file mode 100644
index 0000000..859514f
--- /dev/null
+++ b/ci-templates/core.yml
@@ -0,0 +1,31 @@
+
+image: tecnalia-docker-dev.artifact.tecnalia.com/docker:git
+
+
+workflow:
+  rules:
+    - if: $CI_COMMIT_TAG
+    - if: $CI_COMMIT_BRANCH
+
+variables:
+  TMPDIR: /builds/${CI_PROJECT_NAMESPACE}
+  GIT_LFS_SKIP_SMUDGE: 1 # Avoid fetching the files from LFS when doing git fetch
+
+services:
+  - name: tecnalia-docker-dev.artifact.tecnalia.com/docker:dind
+    alias: docker
+
+stages:
+  - build
+
+before_script:
+  - apk add --update bash coreutils tar wget
+  - docker login tecnalia-docker-dev.artifact.tecnalia.com -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
+
+include :
+  - ci-templates/syntax-check.yml
+  - ci-templates/industrial-ci-templates.yml
+
+default:
+  tags:
+  - docker
\ No newline at end of file
diff --git a/ci-templates/examples/build_vars.yml b/ci-templates/examples/build_vars.yml
new file mode 100644
index 0000000..276246b
--- /dev/null
+++ b/ci-templates/examples/build_vars.yml
@@ -0,0 +1,8 @@
+include:
+  - project: tecnalia_robotics-public/gitlab_templates
+    file: ci-templates/auto-rules/no-default.yml
+
+variables:
+  BUILD_KINETIC: 1
+  BUILD_MELODIC: 1
+  BUILD_NOETIC: 1
diff --git a/ci-templates/examples/manual_job.yml b/ci-templates/examples/manual_job.yml
new file mode 100644
index 0000000..8cf4e1d
--- /dev/null
+++ b/ci-templates/examples/manual_job.yml
@@ -0,0 +1,9 @@
+include:
+  - project: tecnalia_robotics-public/gitlab_templates
+    file: ci-templates/core.yml
+
+industrial_ci_kinetic:
+  extends: .industrial-ci
+  variables:
+    ROS_DISTRO: kinetic
+    UPSTREAM_WORKSPACE: .rosinstall
\ No newline at end of file
diff --git a/ci-templates/examples/simple_include.yml b/ci-templates/examples/simple_include.yml
new file mode 100644
index 0000000..3b1a85d
--- /dev/null
+++ b/ci-templates/examples/simple_include.yml
@@ -0,0 +1,3 @@
+include:
+  - project: tecnalia_robotics-public/gitlab_templates
+    file: ci-templates/core.yml
\ No newline at end of file
diff --git a/ci-templates/industrial-ci-templates.yml b/ci-templates/industrial-ci-templates.yml
new file mode 100644
index 0000000..9f2516f
--- /dev/null
+++ b/ci-templates/industrial-ci-templates.yml
@@ -0,0 +1,38 @@
+
+.industrial_ci:
+  stage: build
+  before_script:
+    - apk add --update bash coreutils tar
+    - git clone --quiet --depth 1 https://github.com/ros-industrial/industrial_ci.git .ci_config
+    - docker login ${ARTIFACT_DOCKER_URL} -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
+    - docker login tecnalia-docker-dev.artifact.tecnalia.com -u ${ARTIFACT_CI_USER} -p ${ARTIFACT_CI_TOKEN}
+  script: .ci_config/gitlab.sh
+  variables:
+    DOCKER_IMAGE: "${ARTIFACT_DOCKER_URL}/flexbotics-base-devel:${ROS_DISTRO}"
+    ADDITIONAL_DEBS: curl
+    PARALLEL_BUILDS: 2 # keep this for now, since there seems to be memory limit issues in the ci VM
+    AFTER_SETUP_TARGET_WORKSPACE: "rosenv && bash <(curl -Ls https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/ci_run_entry_points.sh) $$current_ws"
+    CMAKE_ARGS: -DCMAKE_CXX_FLAGS=-Wno-ignored-attributes -Wno-int-in-bool-context
+
+
+.industrial_ci_deploy:
+  extends: .industrial_ci
+  variables:
+    AFTER_SCRIPT: "wget -q -O - https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/pre-deploy-cleanup.bash | bash"
+    DOCKER_COMMIT: industrial_ci_image
+  script:
+    - .ci_config/gitlab.sh
+    - cd $(mktemp -d)
+    - wget https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/-/archive/master/gitlab_templates-master.zip
+    - unzip gitlab_templates-master.zip && cd gitlab_templates-master/deploy
+    - cd base
+    - chmod a+x ros_entrypoint.bash
+    - docker build -t ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME} .
+    - docker push ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}
+    - cd ..
+    - cd dev
+    - docker build --build-arg APPLICATION_IMAGE=${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME} -t ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}-dev .
+    - docker push ${ARTIFACT_DOCKER_URL}/${CI_PROJECT_NAME}:${CI_COMMIT_REF_NAME}-dev
+    - cd ..
+  rules:
+    - if: $DEPLOY
diff --git a/ci-templates/syntax-check.yml b/ci-templates/syntax-check.yml
new file mode 100644
index 0000000..ccf1df2
--- /dev/null
+++ b/ci-templates/syntax-check.yml
@@ -0,0 +1,83 @@
+##########################################################
+## Check formating of C and C++ files using clang-format
+##########################################################
+
+clang_format:
+  stage: .post
+  before_script:
+    - apk add --update bash coreutils tar wget
+    - git clone --quiet --depth 1 https://github.com/ros-industrial/industrial_ci.git .ci_config -b legacy
+    - wget https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/clang-format -O .clang-format
+  script: .ci_config/gitlab.sh
+  variables:
+    ROS_DISTRO: kinetic
+    CLANG_FORMAT_CHECK: file
+    CLANG_FORMAT_VERSION: "3.8"
+  when: always
+
+##########################################################
+## Simple check for basic Python syntax errors; this is much less thorough than
+## other options like pylint, but much faster and less strict
+##########################################################
+python_syntax:
+  before_script:
+    - apk add --update python2
+  stage: build
+  script: python -m compileall -q .
+  when: always
+
+##########################################################
+## Check for errors in bash/sh scripts
+## Uses https://github.com/koalaman/shellcheck
+##########################################################
+bash_syntax:
+  before_script:
+    - apk add --update shellcheck
+  stage: .post
+  script:
+    - RET=0
+    - find . -type f -name '*.sh' -exec shellcheck -s sh {} + || RET=1
+    - find . -type f -name '*.bash' -exec shellcheck -s bash {} + || RET=1
+    - exit $RET
+  when: always
+
+##########################################################
+## Check for errors in markdown files
+## Uses https://github.com/cytopia/awesome-ci
+## Disables the line length rule with --custom="-r ..."
+## See other rules that can be configured in
+## https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md
+##########################################################
+markdown_syntax:
+  stage: .post
+  script: docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci syntax-markdown --path=/ac --extension=md --ignore=.ci_config --custom="-r ~MD013,~MD014"
+  when: always
+
+##########################################################
+## Check for various syntax issues in files; currently
+##  trailing white spaces
+##  utf8 formatting
+## Uses https://github.com/cytopia/awesome-ci
+##########################################################
+file_syntax:
+  stage: .post
+  script:
+    - RET=0
+    - docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci file-trailing-space --path=/ac --extension=py,txt,cpp,h,md,sh,bash,xml,launch --ignore=.ci_config || RET=1
+    - docker run -v ${PWD}:/ac tecnalia-docker-dev.artifact.tecnalia.com/cytopia/awesome-ci file-utf8 --path=/ac --extension=py,txt,cpp,h,md,sh,bash,xml,launch --ignore=.ci_config || RET=1
+    - exit $RET
+  when: always
+
+##########################################################
+## Check for errors in Asciidoctor files
+## Could not find a proper linter for Asciidoctor format,
+## so this is a custom-made "dirty" script
+##########################################################
+adoc_syntax:
+  stage: .post
+  image: tecnalia-docker-dev.artifact.tecnalia.com/alpine
+  before_script:
+    - apk add --update curl asciidoctor bash
+  script:
+    - curl -Ls https://git.code.tecnalia.com/tecnalia_robotics-public/gitlab_templates/raw/master/scripts/asciidoctor_syntax_check.bash | bash -s -- .
+  when: always
-- 
GitLab