Triggers


Trigger other pipelines

Ability to split automation across multiple pipeline

Trigger tokens

Trigger pipelines through the API

Fire and forget

Multi-project pipelines

Launch pipeline in separate project

Use the trigger keyword

Parent-child pipelines

Load stages and jobs from a file using include


Hands-On: Trigger tokens

  1. Create a new project (anywhere!)
  2. Add trigger/.gitlab-ci.yml to root of new project
  3. Optionally, jump to next demo/slide
  4. Go to Settings > CI/CD and unfold Pipeline triggers
  5. Create a trigger and copy curl snippet
  6. Go back to previous project
  7. Switch to branch main
  8. Add new stage and job called trigger
  9. Add curl snippet in script block
  10. Store TOKEN as unprotected but masked CI variable
  11. Fill in REF_NAME with branch name (main)

See new .gitlab-ci.yml:

git checkout origin/160_gitlab_ci/110_triggers/curl -- '*'

Heads-up

Visibility of trigger tokens

Users sees only their own tokens

Tokens of other users are hidden

Branch protection can prevent triggers

Trigger owner must be able to either…


Hands-On: Multi-project pipelines

  1. Replace script with trigger keyword
  2. Specify project and branch:

     job_name:
       trigger:
         project: foo/bar
         branch: main
    
  3. Check pipeline

Hands-On: Parent-child pipelines

  1. Add parent-child/child.yml to root of first project
  2. Replace project and branch under trigger with include

     job_name:
       trigger:
         include: child.yml
    

Child pipeline can be made from multiple files

include supports local for files in the same repository

Use project/ref/file for files in other repositories

Included file can also be generated before job start


Pro tip 1: Variable inheritence

Downstream pipelines inherit some variables

Job variables are passed on unless:

job_name:
  inherit:
    variables: false

Predefined variables must be redefined as job variables:

job_name:
  variables:
    my_var: ${CI_COMMIT_REF_NAME}
  trigger:
    #...

Do not redefined masked variables - they will not be masked


Pro tip 2: Wait for downstream pipeline

Upstream pipeline only waits for successful trigger

Wait for successul downstream pipeline using strategy

job_name:
  trigger:
    include: child.ymal
    strategy: depend

Dynamic includes

Include can be generated on-demand:

generate:
  script:
  - |
    cat <<EOF >child.yaml
    test:
      script:
      - printenv
    EOF
  artifacts:
    paths:
    - child.yaml

use:
  trigger:
    include:
    - artifact: child.yaml
      job: generate

Pro tip: Artifacts from parent pipeline

Generate artifact and trigger child pipeline:

build_artifacts:
  stage: build
  script: echo "This is a test artifact!" >> artifact.txt
  artifacts:
    paths:
    - artifact.txt

deploy:
  stage: deploy
  trigger:
    include:
    - local: path/to/child-pipeline.yml
  variables:
    PARENT_PIPELINE_ID: $CI_PIPELINE_ID

Fetch artifact from parent pipeline

test:
  stage: test
  script: cat artifact.txt
  needs:
  - pipeline: $PARENT_PIPELINE_ID
    job: build_artifacts

Pro tip: Do not pass global variables

Only allow job variables to be passed to downstream pipelines:

variables:
  GLOBAL_VAR: value

trigger-job:
  inherit:
    variables: false
  variables:
    JOB_VAR: value
  trigger:
    include:
    - local: path/to/child-pipeline.yml