构建失败但 Gitlab 中的工作状态为成功

Build FAILED but job status is SUCCESS in Gitlab

我的 Dockerfile:

FROM mm_php:7.1

ADD ./docker/test/source/entrypoint.sh /work/entrypoint.sh
ADD ./docker/wait-for-it.sh /work/wait-for-it.sh
RUN chmod 755 /work/entrypoint.sh \
    && chmod 755 /work/wait-for-it.sh

ENTRYPOINT ["/work/entrypoint.sh"]

entrypoint.sh:

#!/bin/bash -e

/work/wait-for-it.sh db:5432 -- echo "PostgreSQL started"

./vendor/bin/parallel-phpunit --pu-cmd="./vendor/bin/phpunit -c phpunit-docker.xml" tests

docker-compose.yml:

version: '2'
services:

  test:
    build:
      context: .
      args:
        ssh_prv_key: ${ssh_prv_key}
        application_env: ${application_env}
      dockerfile: docker/test/source/Dockerfile
    links:
      - db

  db:
    build:
      context: .
      dockerfile: docker/test/postgres/Dockerfile
    environment:
      PGDATA: /tmp

.gitlab-ci.yml:

image: docker:latest

services:
  - name: docker:dind
    command: ["--insecure-registry=my.domain:5000 --registry-mirror=http://my.domain"]

before_script:
  - apk add --no-cache py-pip
  - pip install docker-compose
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
  - echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'

test:
  stage: test
  script:
    - export ssh_prv_key="$(cat ~/.ssh/id_rsa)" && export application_env="testing-docker" && docker-compose up --build test

一切正常。但是如果测试失败,Gitlab 中的作业状态是 SUCCESS 而不是 FAILED。

如果测试失败如何获取状态FAILED?

UPD

如果我在本地运行docker-compose up,它return没有错误代码:

$ export ssh_prv_key="$(cat ~/.ssh/id_rsa)" && export application_env="testing-docker" && docker-compose up --build test
Building db
Step 1/2 : FROM mm_postgres:9.6
...
test_1       | FAILURES!
test_1       | Tests: 1, Assertions: 1, Failures: 1.
test_1       | Success: 2 Fail: 2 Error: 0 Skip: 2 Incomplete: 0
mmadmin_test_1 exited with code 1

$ echo $?
0

在我看来它报告测试失败,但不一定报告 docker-compose 调用的 return 值失败。当本地测试失败时,您是否尝试过捕获 docker-compose 的 return 值?

为了获得 docker-compose 到 return 特定服务的退出代码,试试这个:

docker-compose up --exit-code-from=service

当 Gitlab CI 运行某些东西时,如果进程执行 returns 不同于零的东西,那么,你的构建将失败。

在你的情况下,你是 运行 一个 docker-compose 并且这个程序 returns 零当容器完成时,什么是正确的。

您正在尝试让 phpunit 失败。

我认为在这种情况下最好分步构建而不使用 docker-compose:

gitlab.yml:

stages:
  - build
  - test

build:
  image: docker:latest
  stage: build
  script:
    - docker build -t ${NAME_OF_IMAGE} .
    - docker push ${NAME_OF_IMAGE}

test:
  image: ${NAME_OF_IMAGE}
  stage: test
  script:
    - ./execute_your.sh