如何使用 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
我不知道你的应用程序,所以你可能需要做一些调整。
更多相关信息:
我有以下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
我不知道你的应用程序,所以你可能需要做一些调整。
更多相关信息: