数人云今天带来的文章将分享如何用Docker实现PHP命令行程序的CI/CD过程中整体思路以及需要注意哪些问题。
6月10日,《DevOps&SRE超越传统运维之道》的话题将在北京延续,四位业界大牛技术齐聚,结合传统运维现状及实践案例,讲述DevOps&SRE的超越之道。点击即可报名。
内容要点:
使用Jet设置环境并在本地运行测试
配置Codeship Pro每次新代码提交时,自动运行测试
上一步的测试通过后,自动将更新部署到服务器
持续集成
应用程序和测试套件已经在本地运行,下一步要做的是建立一些持续集成系统。虽然可以设置服务器来执行此操作,但这个过程工作量略大,因此推荐一个像Codeship Pro的服务。
使用Jet进行本地测试
代码提交到Codeship测试前,建议先安装其本地版本的持续集成平台:Jet。这会更快地推进工作,下面示例配置文件中,需要根据应用的实际情况,做出相应调整。
安装Jet后,在项目的根目录中创建两个新文件——
1)codeship-services.yml –docker-compose.yml文件的变种,适用于Codeship
2)codeship-steps.yml – 在持续集成过程中,命令和顺序的说明
codeship-services.yml文件与 docker-compose.yml几乎一样。内容如下:
version: "2.0"
services:
# PHP Application
app:
build: .
links:
- database
encrypted_env_file: .env.encrypted
command: cron -f
# Database
database:
image: mariadb
encrypted_env_file: .env.encrypted
# Composer
composer:
image: composer/composer
volumes:
- ./:/app
codeship-steps.yml内容如下,这个文件在例子里很简单,按顺序执行这些的命令(一个接一个地)就好。如果应用程序允许,也可以并列地跑某几个步骤:
-type: serial
steps:
-service: composer
command: install
-service: app
command: bash docker/codeship-run.sh
为了确保应用程序容器和数据库容器已启动,可以看到codeship-steps.yml文件调用了一个尚未创建的shell脚本。若数据库迁移,说明测试通过。把脚本放在 ./docker/codeship-run.sh ,内容如下:
#!/usr/bin/env bash
## Ensure that the database is up and running
function test_database {
mysqladmin -h"$DB_HOST"-u"$DB_USERNAME"-p"$DB_PASSWORD"ping
}
count=0
until( test_database )
do
((count++))
## This will check up to 100 times.
if[${count}-gt 100]
then
echo"Services didn't become ready in time"
exit1
fi
## And the script waits one second between each try
sleep1
done
## Create the database
mysql -h"$DB_HOST"-u"$DB_USERNAME"-p"$DB_PASSWORD"-e 'CREATE DATABASE IF NOT EXISTS laravel'
## Run migrations
php artisan migrate
## Run the test suite
vendor/bin/phpunit
首先,该脚本会尝试连接到数据库。Codeship软件会自动启动应用程序容器和数据库容器,但MySQL初始化需要几秒,所以必须重试该test_database()功能,直到成功连接数据库(或尝试100次)。这在Codeship的Docker文档中有更详细的概述。
一旦脚本能连接到数据库,它将创建默认数据库(数据库名为laravel)。然后会运行迁移,通过PHPUnit创建数据库表和测试套件。
最后,为了测试配置正常运行和且结果通过,用Jet来运行所有步骤:
$ jet steps
如果一切正常,那么在构建容器镜像过程中,会看到一堆输出,运行返回一条成功消息:
{ContainerRunStdout=step_name:"serial_bash_docker/codeship-run.sh" service_name:"app"}: PHPUnit 5.7.19 by Sebastian Bergmann and contributors.
{ContainerRunStdout=step_name:"serial_bash_docker/codeship-run.sh" service_name:"app"}:. 1/1(100%)
Time:1.09 seconds, Memory:12.00MB
OK (1test,1 assertion)
{StepFinished=step_name:"serial_bash_docker/codeship-run.sh"type:STEP_FINISHED_TYPE_SUCCESS}
$
将仓库连接到Codeship
如果尚未提交本地代码到GitHub或Bitbucket上。每次提交代码更改时,Codeship都自动会从私有或公共仓库中拉取代码,所以只需要设置Codeship去监视那个仓库。
在Codeship中创建一个新项目,并将其连接到仓库:
Meetup北京|DevOps&SRE超越传统运维之道
DevOps&SRE超越传统之道北京站来啦!6月10日,四位业界大牛技术齐聚,结合传统运维现状及实践案例,讲述DevOps&SRE的超越之道。
活动报名地址:
http://www.bagevent.com/event...