by Devin Yang

建立于: 6年前 ( 更新: 6年前 )

您想透过docker创建持续集成及交付的CI Server给Laravel使用吗?
在CI Server上运行laravel dusk及phpunit轻松搞定自动化测试,及相关日志。
看完本篇或许您会发现CI/CD有多简单。
我指基本的运用。

如果您对於持续集成或是持续交付这两个辞不是很了解,
可以参考下方的连结,我就不在多做说明了。
山姆锅对持续集成、持续部署、持续交付的定义


GitHub上DevinY/jenkins详细使用说明:
https://github.com/DevinY/jenkins 
(注:这个jenkins内的PHP使用的为PHP 7.1.10,安装的包与D-Laravel上的PHP 7.1.x版相同)
PHP已更新至 7.2.6。(2018-06-10)

如果您想要马上使用,依序运行如下命令即可。
当然您的电脑需有Docker及git基本的。
(MacOS上我确定可运行,Linux可能您需要了解一些docker设置及权限调整才能跑)。
请确认您的主机连接埠未被占用8080、50000、1915。
git clone https://github.com/DevinY/jenkins
cd jenkins
docker-compose up

题外话,如果您要创建自己的jenkins image,
请在 docker-compose up 启动前,
先移除docker-compose.yml中的 #build . 注解,(下图中build前面的#字号),
再运行docker-compose up,这样docker发现您没有下载该image时,就会自动使用目录下的Dockerfile,创建jenkinsimage了,
或者,也可以用docker build命令,先创建好自己的jenkins image

docker build -t myjenkins . 记得要调整您docker-compose.yml中使用的image名称,例如:改成 myjenkins
jenkins的image满大的,您尝试自己build这个image需要花一些时间才能build完成。



说多了,上面懂docker运用的人不是难事,回归正题,
当我们下载完jenkins的repo,大可直接使用已build好的image,
因此只需运行 docker-compose up -d 即可。
docker会进行检测,看docker-compose.yml中指定的image是否存在我们系统中,
不存在时,就会自动下由我build好并push到Dockerhub上的image(deviny/jenkins:7.1.10)
直接下载来使用,就是说docker会使用该image为模版(template)创建及运行contaienr。
启动完成后,我们就能用浏览器开启jenkins网址罗: http://localhost:8080。

第一次需进行密码解锁,如果是在背景运行(使用-d参数),请用
docker-compose logs ci 查看解锁的密码。

完成解锁后,您可使用建议安装,完成后,画面会让我们创建新的使用者,并且进入Jenkins。

另外,所有jenkins安装的数据都会在jenkins数据夹内的var数据夹。
docker-compose down 或ctrl+c中断后,container会被移除,
docker-compose.yml档里面ci service设置,container会挂载在host的var/jenkins_home数据夹,
这样下启动container后才能保有原有的环境。

简单说,弄坏了环境,或是忘了密码,想重来,我们砍掉var再重新运行一次 docker-compose up 即可。
(所有的测试的build也都会被下载至var/jenkins_home/workspace)。

登录Jenkins后,我们就可选择「新建作业」,再选到pipeline来创建一个jenkins的作业:
pipeline

下方是我使用的 pipeline 参考及每个stage说明:
下载:
如果我们不是使用SCM轮循的方式,而是采用url触发方式时,
可以使用git来进行下载最新版的进程码(请看下方黑色区块的git)。

例如: 我们的CI Server没有真实的对外IP,或许就用轮循让他自己抓。

组态:
非常简单,我把测试环境使用的数据及数据库等设置,放入了.env.example内,这样就可以给CI Server直接拿来使用罗。

启动:
这里很单纯的使用php内建的开发用主机,进行Laravel的启动

测试:
因为Laravel框架,我们要在CI测试操简单,就直接给他跑下去就对了。
phpunit及php artisan dusk.

部署:
如果都没有问题,就可以运行部署到远程主机了。
例如透过rsync,使用加密方式进行差异文件的更新,
再大的Project基本上也可以在几秒内完成。

或是目标环境复杂,调用远程的Laravel的Envoy Task Runner,进行部署。
这应该也OK,如何部署还是要依实际环境来决定,
但我相信要布署的方式有很多的,就看您怎么做了。
 
pipeline {
    agent any 

    stages {
        stage('下载') { 
            steps { 
                git 'https://github.com/DevinY/test1.git' 
            }
        }
        stage('组态') { 
            steps { 
                sh 'cp .env.example .env'
                sh 'composer install'
                sh 'php artisan key:generate'
            }
        }
        stage('启动'){
            steps {
                sh 'php artisan serve&'
                sh 'php artisan view:clear'
            }
        }
         stage('phpunit测试'){
            steps {
                sh 'vendor/bin/phpunit'
            }
        }
        stage('dusk测试'){
            steps {
                sh 'php artisan dusk'
            }
        }
        stage('部署') {
            steps {
                sh 'echo 可运行rsync哦'
            }
        }
    }
}
下图为上方的pipeline实际运行的建置画面:


如果需要数据库相关的测试也没问题,
因为这个Jenkins也是dockercontainer,所以我将设置档,添加到D-Laravel的docker-compose.yml环境中,
并在D-Laravel上创建好jenkins需要任务目录,
就可以简单的用D-Laravel来进行数据库设想关测试了,让Jenkins内的进程可以连到到db container,
因为使用的是相同的网络 dlaravel_net
所以CI service可以轻易的ping到db的service(D-Laravel的database container默认的service name)。
### 网页伺服器的container ##################################
 ci:
  #build: .
  image: deviny/jenkins-php:7.1.10
  dns: 8.8.8.8
  ports:
      - "8081:8080"
      - "50001:50000"
      - "1915"
  volumes:
   - ./var/jenkins_home:/var/jenkins_home
   - /var/run/docker.sock:/var/run/docker.sock 
   - /usr/local/bin/docker:/usr/bin/docker
  hostname: ci
  environment:
   - TZ=Asia/Taipei
  networks:
    - dlaravel_net

### Chromedriver contaienr #######
 chrome:
  image: robcherry/docker-chromedriver
  network_mode: "service:ci"
  environment:
     CHROMEDRIVER_WHITELISTED_IPS: ""
     CHROMEDRIVER_PORT: "9515"
  cap_add:
   - "SYS_ADMIN"

例如:下方的pipeline就是进行migration:fresh及假数据的Insert相关测试。
对Laravel的migration或db:seed了解的人,看到底下pipline的运行方式应该笑出来,
有好多地方命令都非常熟悉,一看应该就知道他在做啥事了,
因为都是laravel上的artisan运行的命令,一模模一样样的放到了pipeline上来运行,
对Laravel的开发者,要进行这样的设置学习曲线应该是零吧。

在下方中的 php artisan migrate:fresh 是Laravel 5.5新提供的功能,
用来移除所有的数据表,并且重新migrate。
因为是测试数据库,所以每次的运行,都会是干净的数据库,再去生成需要的假数据
Laravel框架用起来就是爽爽的fu,哦fu英文是骂人的话我改一下是feel。
总而言之,Laravel什么样的功能都提供给我们了,测试功能或是创建测试环境及创建假数据的功能。
pipeline {
    agent any 

    stages {
        stage('下载') { 
            steps { 
                git 'https://github.com/DevinY/test1.git' 
            }
        }
        stage('组态') { 
            steps { 
                sh 'cp .env.example .env'
                // sh 'sed -i "s/localhost/localhost:8000/" .env'
                sh 'composer install'
                sh 'php artisan key:generate'
            }
        }
        stage('启动'){
            steps {
                sh 'php artisan serve&'
                sh 'php artisan view:clear'
            }
        }
        stage('测试migration'){
            steps {
                sh 'php artisan migrate:fresh'
                sh 'php artisan'
            }
        }
        stage('测试database seeder'){
             steps {
                sh 'php artisan db:seed'
            }
        }
    }
}
任何的失败,都会进行纪录。


是不是有发觉在Laravel的环境下,使用CI的自动测试太简单了,
简单到这篇标题我都觉的都应该打成,是介绍而不是教程了。
好啦,为了SEO我还是打成教程好比较好..

 

Tags: laravel

Devin Yang

文章内容无法一一说明,如果您有什么不了解处,欢印提问哦:)

No Comment

Post your comment

需要登入才可留言!

类似文章


laravel

Laravel维护模式下的随机密码

本文所提到的功能需为Laravel 8及之后的版本才可以使用假如我们有一些有外部IP的Laravel外部的测试网站,但是只想给自己访问。我是这么做的提供参考

laravel教學,blade

在我的Laravel的blade上打标签

使用Laravel的Blade Templates相当好用,用久了还满习惯的,但有一点就是当创建了很多的blade时,搞的自己似乎不太好找,在这里提供了我最近的原创作法,如果雷同纯属巧合了。

laravel,blade

Laravel 5.5新功能,在Blade的"json" directive

Laravel 5.5支持一个新的directive,叫做json,在Blade样版,不需调用json_encode就可以印出json。