【问题标题】:How to create a test pipeline in Gitlab CI for a Docker based PHP App如何在 Gitlab CI 中为基于 Docker 的 PHP 应用程序创建测试管道
【发布时间】:2021-10-14 01:00:35
【问题描述】:

到目前为止,我在 Gitlab CI 上拥有/拥有一个健康的工作管道,分为两个阶段(构建和部署)。

现在我想在这两者之间添加一个测试阶段,并且我想在前一个阶段构建的图像上运行测试。我应该如何进行?

现在有了这个 CI 文件,我将获得一个正在运行的容器,一个 Web 服务器开始监听,但什么也没有,它会无限期地停留,这是我不想要的。

variables:
    CONTAINER_IMAGE: $CI_REGISTRY_IMAGE/XXXXXXXXX:$CI_COMMIT_REF_SLUG
    CONTAINER_IMAGE_HASHED: $CI_REGISTRY_IMAGE/XXXXXXXXX:$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA

build:
    stage: build
    before_script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    script:
        - echo "Start building XXXXXXXXX container"
        - docker pull $CI_REGISTRY_IMAGE:latest || true
        - docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
        - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
        - docker push $CI_REGISTRY_IMAGE:latest
    environment:
        name: staging
        url: $PUBLIC_ADDRESS

test:
    stage: test
    image: docker:stable
    services:
        - docker:dind
    script:
        - docker run --rm $CI_REGISTRY_IMAGE /bin/bash -c "vendor/bin/phpunit"
    environment:
        name: test

deploy:
    stage: deploy
    before_script:
        - mkdir -p ~/.ssh
        - echo -e "$KEY" > ~/.ssh/id_rsa
        - chmod 600  ~/.ssh/id_rsa
        - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    script:
        - apk update && apk add openssh-client
        - ssh $SERVER_USER@$SERVER_IP "docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY &&
          docker pull $CI_REGISTRY_IMAGE &&
          docker stop XXXXXXXXX || true &&
          docker rm XXXXXXXXX || true &&
          docker run -d -p 80:80 --name XXXXXXXXX $CI_REGISTRY_IMAGE"
    environment:
        name: production
        url: $PUBLIC_ADDRESS

我想运行测试(包括 PHPUnit),失败或成功时,容器应该关闭并移除 (--rm) 并继续部署(让我们说成功)(使用 allow_failure: true/false)。

编辑 1:

这种方式也给出了相同的结果(容器运行并保持运行):

...
test:
    stage: test
    image: $CI_REGISTRY_IMAGE
    services:
        - docker:dind
    before_script:
        - cd webroot
        - composer install
        - composer run-script post-root-package-install
    script:
        - vendor/bin/phpunit
    environment:
        name: test
...

【问题讨论】:

  • 请检查您的问题标题。这是一个开放式提问(主题非常广泛)。你的具体问题是什么,是什么阻止你把它变成一个具体的问题(而不是描述你通常想要做什么然后遇到一些问题 - 我们每天都在做,Stackoverflow 最适合具体问题)

标签: php docker phpunit gitlab-ci


【解决方案1】:

您可以使用 after_script 部分和新的 CI_JOB_STATUS 变量的组合来清理构建作业,该变量由 Gitlab CI/CD 预定义并在您运行 Gitlab 时自动传递给 after_script 13.5 或更高版本,或使用 Gitlab.com。

...
test:
    stage: test
    image: docker:stable
    services:
        - docker:dind
    script:
        - docker run --rm $CI_REGISTRY_IMAGE /bin/bash -c "vendor/bin/phpunit"
    after_script:
      - if [ $CI_JOB_STATUS == "failed" ]; then ./cleanup_image.sh; fi
    environment:
        name: test
...

cleanup_image.sh 代表您要删除图像的步骤。

您可以查看可用变量here

【讨论】:

    猜你喜欢
    • 2017-07-06
    • 1970-01-01
    • 2019-08-03
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多