1

I can't find a satisfying solution for my case.

I want to start a job manually only when a certain previous job has failed. The job in question dose a validation. I want to make the next job manual so that the user acknowledges that something wasn't good and make him investigate the problem and continue only if he deems that the fail can be ignored.

stages:
  - test
  - validate
  - build

lint:
  stage: test
  allow_failure: true
  script:
    - npm run lint

check:reducer:
  stage: test
  allow_failure: true
  script:
    - chmod +x ./check-reducers.py
    - ./check-reducers.py $CI_PROJECT_ID $CI_COMMIT_BRANCH
  except:
    - master
    - development

fail:pause:
  stage: validate
  allow_failure: true
  script:
    - echo The 'validate:reducer' job has failed
    - echo Check the job and decide if this should continue
  when: manual
  needs: ["check:reducer"]

build:
  stage: build
  script:
    - cp --recursive _meta/ $BUILD_PATH
    - npm run build
  artifacts:
    name: "build"
    expire_in: 1 week
    paths:
      - $BUILD_PATH
  needs: ["fail:pause"]

I would like that if check:reducer fails, fail:pause to wait for the user input. If check:reducer exits with 0, fail:pause should start automatically or buildshould start.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Flavius
  • 67
  • 1
  • 9

2 Answers2

1

Unfortunately, this isn't possible as the when keyword is evaluated at the very start of the pipeline (I.e., before any job execution has run), so you cannot set the when condition based on the previous job status.

Patrick
  • 2,885
  • 1
  • 14
  • 20
0

This is possible if you use a generated gitlab-ci.yml as a child workflow.

stages:
  - test
  - approve
  - deploy

generate-config:
  stage: test
  script:
    - ./bin/run-tests.sh
    - ./bin/generate-workflows.sh $?
  artifacts:
    paths:
      - deploy-gitlab-ci.yml

      
trigger-workflows:
  stage: deploy 
  trigger:
    include:
      - artifact: deploy-gitlab-ci.yml
        job: generate-config

The generate-workflows.sh script writes out a deploy-gitlab-ci.yml that either has the approval job or not based on the return code of the run-test.sh passed as the first argument to the script.

You can make it easier on yourself using includes, where you either include the approve step or not in the generated deploy-gitlab-ci.yml file, and make the steps in the deploy optionally need the approal.

approve-gitlab-ci.yml

approve:
  stage: approve
  when: manual
  script:
    - echo "Approved!"

deploy-gitlab-ci.yml

deploy:
  stage: deploy
  needs:
    - job: approve
      optional: true

Then the deploy-gitlab-ci.yml is simply an includes with the jobs to run:

includes:
  - approve-gitlab-ci.yml
  - deploy-gitlab-ci.yml
Nick Palmer
  • 2,589
  • 1
  • 25
  • 34