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

标签 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管道时,它就变成了 Realm ,因为我认为gitlab无法与docker-compose运行的服务一起使用。

该错误表明mysql拒绝连接。

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

我希望每当有人 push 分支机构时都对其进行测试,如果通过则只是将其部署到测试服务器中,而将其部署在生产服务器上。

在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或将命令从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

我不知道您的应用程序,因此您可能需要进行一些调整。

有关更多信息:
  • https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#define-image-and-services-from-gitlab-ciyml
  • https://docs.gitlab.com/ee/ci/services/
  • http://php.net/manual/en/features.commandline.webserver.php
  • 关于docker - 如何使用gitlab ci测试和部署我的php应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53669615/

    相关文章:

    apache - 您如何比较 Apache Tomcat 和 Glassfish 作为生产服务器?

    docker - env_file在docker-compose中被忽略并导致 “The … variable is not set”警告

    docker - 为什么在 ubuntu 上安装 docker 应该是 `sudo apt-get install docker.io` ?

    go - 为什么 CreateContainerOptions 的 Volumes 采用 map[string]struct{}?

    docker - 为什么docker-compose非顺序打印容器输出

    php - RabbitMQ + PHP部署攻略

    c - 暂停执行 C 代码的 exe

    docker - Docker组成多个网络

    docker - 如何在重启或尝试失败后自动重启带有 compose 的 docker 容器?

    python-3.x - POST请求在docker-compose容器中不起作用