Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gitlab CI parent/child pipelines with complex subfolders

i have a problem with gitlab (community edition, version 14.1.2) CI with complex pipeline on my monorepo.

My structure is client/server:

root/
---- server/
-------- lib/
----------- libA/
----------- libB/
----------- libC/
-------- applications/
----------- appA/
----------- appB/
----------- appC/
---- client/
-------- applications/
------------- appA/
------------- appB/
...

Every folder (root, server, lib, libA, libB, libC etc...) have his own ".gitlab-ci.yml"

Root ".gitlab-ci.yml" is:

stages:
  - build
  - test

build-server:
  stage: build
  trigger:
      include:
          - local: 'server/.gitlab-ci.yml'
  rules:
      - changes:
          - server/**/*
        
build-client:
  stage: build
  trigger:
      include:
          - local: 'client/.gitlab-ci.yml'
  rules:
      - changes:
          - client/**/*

Server ".gitlab-ci.yml" is:

stages:
  - build
  - test

build-lib:
  stage: build
  trigger:
      include:
          - local: 'lib/.gitlab-ci.yml'
  rules:
      - changes:
          - lib/**/*
        
build-applications:
  stage: build
  trigger:
      include:
          - local: 'applications/.gitlab-ci.yml'
  rules:
      - changes:
          - applications/**/*

lib ".gitlab-ci.yml" is:

stages:
  - build
  - test

build-libA:
  stage: build
  script:
     - echo "Execute libA build!" 
  rules:
      - changes:
          - libA/**/*
        
build-libB:
  stage: build
  script:
     - echo "Execute libB build!" 
  rules:
      - changes:
          - libB/**/*

If i change a file inside libA only the ".gitlab-ci.yml" of root folder is triggered, other subfolders not detect file changes and not trigger the build.
The purpose of this configuration is that , for example, when i change a file inside libA, the pipeline detects the changes and build the libA.
Somone can help me to resolve? I hope the structure and the problem is clear. Thanks.

UPDATE

I'm using gitlab 14.1.0

Thanks to DavidC for the answer but with your solution I have not solved my problem, especially with the trigger $CI_PROJECT_PATH seems not to work.

After some time I finally got a solution (which can be evolved with variables)

Root ".gitlab-ci.yml" is:

stages:
  - build
  - test

build-server:
  stage: build
  trigger:
      include:
          - local: '/server/.gitlab-ci.yml'
  rules:
      - changes:
          - server/**/*
        
build-client:
  stage: build
  trigger:
      include:
          - local: '/client/.gitlab-ci.yml'
  rules:
      - changes:
          - client/**/*

Server ".gitlab-ci.yml" is:

stages:
  - build
  - test

build-lib:
  stage: build
  trigger:
      include:
          - local: '/server/lib/.gitlab-ci.yml'
  rules:
      - changes:
          - server/lib/**/*
        
build-applications:
  stage: build
  trigger:
      include:
          - local: '/server/applications/.gitlab-ci.yml'
  rules:
      - changes:
          - server/applications/**/*

lib ".gitlab-ci.yml" is:

stages:
  - build
  - test

build-libA:
  stage: build
  script:
     - echo "Execute libA build!" 
  rules:
      - changes:
          - server/lib/libA/**/*
        
build-libB:
  stage: build
  script:
     - echo "Execute libB build!" 
  rules:
      - changes:
          - server/lib/libB/**/*

Pay attention to this line from the gitlab documentation: "Parent and child pipelines were introduced with a maximum depth of one child pipeline level, which was subsequently increased to two. A parent pipeline can activate many child pipelines and these child pipelines can activate their own child pipelines. It is not possible to activate another level of child pipeline. " refer to: https://docs.gitlab.com/ee/ci/pipelines/parent_child_pipelines.html#nested-child-pipelines

Thanks for help!

like image 932
Mattia Avatar asked Oct 26 '25 14:10

Mattia


1 Answers

It seems like GitLab child-pipeline context execution path is the same as the root directory of your repository, and is not relative to the path of the child-pipeline gitlab-ci.yml file.

The only solution so far seems to either give the path to the directory you want as a variable to your child-pipeline or to directly define it in the .gitlab-ci.yml.

Example :

Root ".gitlab-ci.yml" is:

stages:
  - build
  - test

build-server:
  stage: build
  variables:
    CI_ROOT_DIR: server # you don't need to provide it, if you define it in the server/.gitlab-ci.yml file
  trigger:
      include:
          - local: '$CI_ROOT_DIR/.gitlab-ci.yml'
  rules:
      - changes:
          - $CI_ROOT_DIR/**/*
        
build-client:
  stage: build
  variables:
    CI_ROOT_DIR: client
  trigger:
      include:
          - local: '$CI_ROOT_DIR/.gitlab-ci.yml'
  rules:
      - changes:
          - $CI_ROOT_DIR/**/*

Server ".gitlab-ci.yml" is:

stages:
  - build
  - test

variables:
  CI_ROOT_DIR: $CI_PROJECT_PATH/server # default

build-lib:
  stage: build
  variables:
    CI_ROOT_DIR: $CI_ROOT_DIR/lib # you don't need to provide it, if you define it in the server/lib/.gitlab-ci.yml file
  trigger:
      include:
          - local: '$CI_ROOT_DIR/.gitlab-ci.yml'
  rules:
      - changes:
          - $CI_ROOT_DIR/**/*
        
build-applications:
  stage: build
  variables:
    CI_ROOT_DIR: $CI_ROOT_DIR/applications # you don't need to provide it, if you define it in the server/applications/.gitlab-ci.yml file
  trigger:
      include:
          - local: '$CI_ROOT_DIR/.gitlab-ci.yml'
  rules:
      - changes:
          - $CI_ROOT_DIR/**/*

lib ".gitlab-ci.yml" is:

stages:
  - build
  - test

variables:
  CI_ROOT_DIR: $CI_PROJECT_PATH/server/lib # default

build-libA:
  stage: build
  script:
     - echo "Execute libA build!" 
  rules:
      - changes:
          - $CI_ROOT_DIR/libA/**/*
        
build-libB:
  stage: build
  script:
     - echo "Execute libB build!" 
  rules:
      - changes:
          - $CI_ROOT_DIR/libB/**/*

It would be better tho if it was possible to choose the context of the execution of the pipeline when triggered by the parent-pipeline or to have a CI_CHILD_PIPELINE_DIR variable available by Gitlab predefined environment variables

like image 158
DavidC Avatar answered Oct 29 '25 08:10

DavidC



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!