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

时间:2018-12-07 12:31:57

标签: docker deployment docker-compose gitlab-ci gitlab-ci-runner

我在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无法使用由docker-compose运行的服务。

错误表明mysql拒绝了连接。

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

每当有人按下分支时,我都希望对其进行测试;如果仅在开发部署中将其通过,则部署到测试服务器中,而在生产服务器中的主部署中则通过。

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

1 个答案:

答案 0 :(得分:1)

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

您必须选择一个映像作为主映像,在其中运行命令,而其他容器则作为服务。

遗憾的是,CI服务无法在gitlab中挂载文件,您必须能够使用env变量对其进行配置,或者您需要在其中包含文件的情况下创建自己的映像(可以执行CI阶段)

我建议您不要使用nginx,而应使用built-in php server进行测试。这是不可能的(您有spicifix nginx配置),您将需要构建自己的nginx映像,并在其中复制文件。

对于PHP(我假设docker-compose.yaml中的api服务),您还需要构建映像ahed或将命令从dockerfile复制到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

我不了解您的应用,因此您可能需要进行一些调整。

更多信息