如何使用 gitlab ci 来测试和部署我的 php 应用程序?

How use gitlab ci to test and deploy my php application?

我有以下docker-compose.yml

version: "2"
services:
    api:
        build:
            context: .
            dockerfile: ./build/dev/Dockerfile
        container_name: "project-api"
        volumes:
          # 1. mount your workdir path
          - .:/app
        depends_on:
          - mongodb
        links:
          - mongodb
          - mysql

    nginx:
        image: nginx:1.10.3
        container_name: "project-nginx"
        ports:
            - 80:80
        restart: always
        volumes:
            - ./build/dev/nginx.conf:/etc/nginx/conf.d/default.conf
            - .:/app
        links:
            - api
        depends_on:
            - api
    mongodb:
        container_name: "project-mongodb"
        image: mongo:latest
        environment:
          - MONGO_DATA_DIR=/data/db
          - MONGO_LOG_DIR=/dev/null
        ports:
            - "27018:27017"
        command: mongod --smallfiles --logpath=/dev/null # --quiet
    mysql:
      container_name: "gamestore-mysql"
      image: mysql:5.7.23
      ports:
        - "3306:3306"
      environment:
        MYSQL_DATABASE: project_test
        MYSQL_USER: user
        MYSQL_PASSWORD: user
        MYSQL_ROOT_PASSWORD: root

及以下.gitlab-ci.yml

test:
  stage: test
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_DRIVER: overlay2
  before_script:
    - apk add --no-cache py-pip
    - pip install docker-compose
  script:
    - docker-compose up -d
    - docker-compose exec -T api ls -la
    - docker-compose exec -T api composer install
    - docker-compose exec -T api php core/init --env=Development --overwrite=y
    - docker-compose exec -T api vendor/bin/codecept -c core/common run
    - docker-compose exec -T api vendor/bin/codecept -c core/rest run

当我 运行 连接我的 gitlab 管道时,它变成了现场,因为我认为 gitlab 不能与 运行ned by docker-compose 的服务一起工作。

错误提示 mysql 拒绝连接。

我需要此连接,因为我通过 codeception 编写的测试将测试我的模型和 api 操作。

我想在每次有人推送时测试我的分支,如果通过则只在开发中部署到测试服务器并在生产服务器上主部署。

运行 我在 gitlab ci/cd 中进行测试然后将它们部署到我的服务器中的最佳方法是什么?

您应该使用 GitLab CI services 而不是 docker-compose。

您必须选择一个镜像作为您的主镜像,其中您的命令将是 运行,而其他容器就像服务一样。

遗憾的是 CI 服务无法在 gitlab 中挂载文件,您必须能够使用 env 变量配置它们,或者您需要创建自己的包含文件的映像(您可以这样做 CI阶段)

我建议你不要使用nginx,使用built-in php server进行测试。这是不可能的(你有 spicifix nginx 配置),你需要自己构建 nginx 镜像,其中包含复制的文件。

同样对于 PHP(我假设 docker-compose.yaml 中的 api 服务),您需要构建图像 ahed 或从您的 docker文件到script.

所以结果应该是这样的:

test:
  stage: test
  image: custom-php-image #build from ./build/dev/Dockerfile
  services:
    - name: mysql:5.7.23
      alias: gamestore-mysql
    - name: mongo:latest
      alias: project-mongodb
      command: mongod --smallfiles --logpath=/dev/null
  variables:
    MYSQL_DATABASE: project_test
    MYSQL_USER: user
    MYSQL_PASSWORD: user
    MYSQL_ROOT_PASSWORD: root

    MONGO_DATA_DIR: /data/db
    MONGO_LOG_DIR: /dev/null
  script:
    - api ls -la
    - composer install
    - php core/init --env=Development --overwrite=y

    - php -S localhost:8000 # You need to configure your built-in php server probably here 

    - vendor/bin/codecept -c core/common run
    - vendor/bin/codecept -c core/rest run

我不知道你的应用程序,所以你可能需要做一些调整。

更多相关信息: