Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gitlab run pipeline job only when previous job ran

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"]
like image 615
Sam Avatar asked Aug 26 '20 09:08

Sam


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.

like image 98
David Losert Avatar answered Oct 23 '22 06:10

David Losert