Gitlab run pipeline job only when previous job ran

Viewed 3085

I'm trying to create a pipeline with a production and a development deployment. In both environments the application should be built with docker. But only when something changed in the according directory.

For example:

  • When something changed in the frontend directory the frontend should be build and deployed
  • When something changed in the backend directory the backend should be build and deployed

At first I didn't had the needs: keyword. The pipeline always executed the deploy_backend and deploy_frontend even when the build jobs were not executed.

Now I've added the needs: keyword, but Gitlab says yaml invalid when there was only a change in one directory. When there is a change in both directories the pipeline works fine. When there for exaple a change in the README.md outside the 2 directories the says yaml invalid as well.

Does anyone knows how I can create a pipeline that only runs when there is a change in a specified directory and only runs the according deploy job when the build job has ran?

gitlab-ci.yml:

stages:
  - build
  - deploy

build_frontend:
  stage: build
  only:
    refs:
      - master
      - development
    changes:
      - frontend/* 
  script: 
    - cd frontend
    - docker build -t frontend .

build_backend:
  stage: build
  only:
    refs:
      - master
      - development
    changes:
      - backend/* 
  script: 
    - cd backend
    - docker build -t backend .

deploy_frontend_dev:
  stage: deploy
  only:
    refs:
      - development
  script:
    - "echo deploy frontend"
  needs: ["build_frontend"]

deploy_backend_dev:
  stage: deploy
  only:
    refs:
      - development
      - pipeline
  script:
      - "echo deploy backend"
  needs: ["build_backend"]
1 Answers

The problem here is that your deploy jobs require the previous build jobs to actually exist.

However, by using the only.changes-rule, they only exist if actually something changed within those directories.

So when only something in the frontend-folder changed, the build_backend-Job is not generated at all. But the deploy_backend_dev job still is and then misses it's dependency.

A quick fix would be to add the only.changes configuration also to the deployment-jobs like this:

deploy_frontend_dev:
  stage: deploy
  only:
    refs:
      - development
    changes:
      - frontend/* 
  script:
    - "echo deploy frontend"
  needs: ["build_frontend"]

deploy_backend_dev:
  stage: deploy
  only:
    refs:
      - development
      - pipeline
    changes:
      - backend/* 
  script:
      - "echo deploy backend"
  needs: ["build_backend"]

This way, both jobs will only be created if the dependent build job is created as well and the yaml will not be invalid.

Related