项目集成持续构建 drone

by kingzcheung on April 16, 2019

drone 的搭建可参照此文: https://kingzcheung.com/archives/118.html. drone 本身没有账户体系,一般使用仓库的账户体系。

进入后台,选择项目点击ACTIVATE字样,进入项目详情,点击activate repository ,这个操作是为了向仓库添加webhook钩子。

SETTINGS

接下来配置 SETTINGS:

以上可根据项目要求配置,需要注意的是 Configuration,此文件名就是决定项目配置脚本的名字,最好是ymlyaml格式。

配置密钥

在项目中,我们需要通过密钥连接ssh通道来实现项目文件更新的测试服务器,在持续集成后台系统中,已经内置了一对密钥。因此如果你的项目持续构建脚本中存在更新项目到测试服务器的行为,就需要配置密钥。

密钥内容可以内置到docker中。

在持续集成后台中,我们添加此密钥到 Secrets:

期中,ssh_key 这个名字会使用在构建脚本中。

至此,持续构建后台配置部分完成。

.drone.yml

持续构建后台是通过 读取.drone.yml 文件来实现持续构建,因此我们需要在项目根目录添加这个脚本(注意:名字一定要与上面设置的一样)。

Drone 持续构建依赖于 Docker,这意味着只要你愿意整个持续构建过程都可以自定义,我们只要实现自己的docker 镜像即可,当然,Drone 也收集了一些Plugins(其实就是Docker 镜像),我们可以使用这些Plugins 来实现自己的构建。

那么如何编写.drone.yml?

我们需要想一下需要把哪一些操作放到持续集成,这里列三个例子:

PHP

  1. 加载源码
  2. 更新 composer类库
  3. 运行代码规范检查器
  4. 运行测试用例
  5. 打包
  6. 上传到测试服务器
  7. 构建成功或者失败通知

前端项目

  1. 加载源码
  2. 使用npm或者yarn下载依赖
  3. 运行测试用例
  4. 构建项目
  5. 上传到测试服务器
  6. 构建成功或者失败通知

GO

  1. 加载源码
  2. 设置编译参数
  3. 下载依赖
  4. 运行代码检查器golint
  5. 运行测试go test
  6. 构建成功或者失败通知

对于drone,加载源码不需要我们做,以PHP为例子,我们需要一个 docker 镜像来实现 2,3,4 三个功能(当然,你也可以每个功能都使用一个镜像来实现,但是如果一个镜像能解决三个功能,那就没有必要分三个镜像)。

Drone 使用yaml来管理构建步骤,不熟悉yaml语法的可自行百度。

Drone 使用顶极的 steps 来定义步骤集,每个步骤都会启动一个包含存储库克隆的新容器,然后在其中运行命令部分的内容。

开头定义如下:

kind: pipeline
name: default

接下来通过 steps 定义执行步骤,比如上面说到的PHP 2,3,4步骤:

- name: composer update
    image: bbking/composer:latest
    commands:
      - composer install --prefer-dist --no-plugins --no-scripts --optimize-autoloader --no-progress --no-interaction #更新类库
      - /tmp/vendor/bin/phpmd ./app text ./phpmd.xml #代码质量检查器
      #- phpunit test ./tests #运行测试用例,如果没有可以去除
      - tar zcf dist.tar.gz ./* # 打包

上面的name 定义了步骤名称,image 指定了docker镜像名,默认会自动到hub.docker.com查找相关镜像。 commands则为linux 命令集。

我们下一步是把这个打包好的压缩包上传到测试服务器指定目录,步骤定义内容如下:

- name: Unarchive
    image: appleboy/drone-ssh
    settings:
      host: your server
      username: root
      key:
        from_secret: ssh_key
      port: 22
      script:
        - cd /www/wwwroot/;tar --no-same-owner -zxf dist.tar.gz
        - rm /www/wwwroot/dist.tar.gz
    when:
      status:
        - success

这里使用了一个叫`

- name: publish
    image: appleboy/drone-scp
    settings:
      host: your server
      username: root
      key:
        from_secret: ssh_key
      target: /www/wwwroot
      source: dist.tar.gz
    when:
      status:
        - success

这里使用了一个叫appleboy/drone-scp的镜像插件,关于此插件的使用可参考此文档:http://plugins.drone.io/appleboy/drone-scp/ 。需要注意的是,我们这里的key使用了`

- name: publish
    image: appleboy/drone-scp
    settings:
      host: your server
      username: root
      key:
        from_secret: ssh_key
      target: /www/wwwroot/
      source: dist.tar.gz
    when:
      status:
        - success

这里使用了一个叫appleboy/drone-scp的镜像插件,关于此插件的使用可参考此文档:[](http://plugins.drone.io/appleboy/drone-scp/) 。需要注意的是,我们这里的key使用了from_secret: ssh_key语法,期中ssh_key就是构建后台所设置的密钥名称。

when:
    status:
    - success

以上表示前面的构建成功了才会触发此步骤。

接下来我们需要解压缩上传后的文件,可以会用 appleboy/drone-ssh:

- name: Unarchive
    image: appleboy/drone-ssh
    settings:
      host: your server
      username: root
      key:
        from_secret: ssh_key
      port: 22
      script:
        - cd /www/wwwroot/;tar --no-same-owner -zxf dist.tar.gz
        - rm /www/wwwroot/dist.tar.gz
    when:
      status:
        - success

文档地址:http://plugins.drone.io/appleboy/drone-ssh/

除此之外,我们还要以添加构建通知功能,比如构建失败使用email通知:

  - name: notify
    image: drillster/drone-email
    host: smtp.yourmail.com
    port: 465
    username: drone@yourmail.com
    password:
      from_secret: mail_password
    from: drone@yourmail.com
    recipients: [邮箱列表]
    when:
      status: [ changed, failure ]

或者直接使用钉钉通知:

steps:
- name: dingtalk
  image: lddsb/drone-dingtalk-message
  settings:
    token: your-dingtalk-robot-access-token
    type: markdown
  when:
      status: [ changed, failure ]

最后我们需要指定什么情况下才触发构建,比如当dev分支push的时候:

trigger:
  branch:
    - dev
  event:
    - push

最终的完整.drone.yml内容如下:

kind: pipeline
name: default

steps:

  - name: composer update
    image: bbking/composer:latest
    commands:
      - composer install --prefer-dist --no-plugins --no-scripts --optimize-autoloader --no-progress --no-interaction
      - /tmp/vendor/bin/phpmd ./app text ./phpmd.xml
      - tar zcf dist.tar.gz ./*

  - name: publish
    image: appleboy/drone-scp
    settings:
      host: your server
      username: root
      key:
        from_secret: ssh_key
      target: /www/wwwroot
      source: dist.tar.gz
    when:
      status:
        - success

  - name: Unarchive
    image: appleboy/drone-ssh
    settings:
      host: your server
      username: root
      key:
        from_secret: ssh_key
      port: 22
      script:
        - cd /www/wwwroot;tar --no-same-owner -zxf dist.tar.gz
        - rm /www/wwwroot/dist.tar.gz
    when:
      status:
        - success

  - name: notify
    image: drillster/drone-email
    host: mail.yourserver.com
    port: 465
    username: drone@yourserver.com
    password:
      from_secret: mail_password
    from: drone@yourserver.com
    recipients: [邮箱列表]
    when:
      status: [ changed, failure ]

trigger:
  branch:
    - dev
  event:
    - push