Home > Back-end >  The gitlab-ci job does not fail but the test does
The gitlab-ci job does not fail but the test does

Time:10-29

I need a failed test in my pipeline to fail the job so that I can have control over it. The problem is that the tests are being run in a "docker in docker" so the job doesn't fail because the container did run correctly, but the test doesn't return an error code (even if one fails). The script "docker:test" run my test suit in a container and my pipeline is like:

image: docker:dind #Alpine

stages:
    - install
    - test
    # - build
    - deploy

env:
    stage: install
    script:
        - chmod  x ./setup_env.sh
        - ./setup_env.sh
    artifacts:
        paths:
            - .env
        expire_in: 1 days

tests:
    stage: test
    before_script:
        - docker rm extractos-bancarios-test || true
    script:
        - apk add --update nodejs npm
        - npm run docker:test
        - docker cp extractos-bancarios-test:/usr/src/coverage .
        - docker cp extractos-bancarios-test:/usr/src/junit.xml .
    cache:
        paths:
            - coverage/
    artifacts:
        when: always
        paths:
            - coverage/
        reports:
            junit:
                - junit.xml

# docker image:
#     stage: build
#     script:
#         - npm run docker:build

remove .env:
    stage: deploy
    script:
        - rm .env

pages:
    stage: deploy
    script:
        - mkdir .public
        - cp -r coverage/* .public
        - mv .public public
    artifacts:
        paths:
            - public
    # only:
    #     - main

And my npm script is:


        "docker:test": "npm i && tsc && docker build -t extractos-bancarios-test --target test . && docker run -d --name extractos-bancarios-test extractos-bancarios-test && docker logs -f extractos-bancarios-test >> logs.log",

I need to fail the pipeline when a test fails while using docker in docker

CodePudding user response:

I was able to solve the problem on my own and I leave it documented so that no one wastes as much time as I did. For the container inside the first container to fail, I needed it to return an exit code 1 when there is an error in the report. So I added a conditional with a grep in the scripts section of my .gitlab-ci.yml:

tests:
    stage: test
    before_script:
        - docker rm extractos-bancarios-test || true
        - rm junit.xml || true
        - rm -r coverage || true
    script:
        - apk add --update nodejs npm
        - npm run docker:test
        - docker cp extractos-bancarios-test:/usr/src/coverage .
        - docker cp extractos-bancarios-test:/usr/src/junit.xml .
        - if grep '<failure' junit.xml; then exit 1; else exit 0; fi
    cache:
        paths:
            - coverage/
    artifacts:
        when: always
        paths:
            - coverage/
        reports:
            junit:
                - junit.xml
  • Related