Gogs + Drone 实现CI/CD(CI)

 

  本文通过docker-compose方式安装运行drone,先将drone的server和agent镜像拉取到本地,这样docker-compose脚本执行速度会快一点。当然,不是必须先拉取drone镜像,完全可以直接用docker-compose执行编写好的脚本。

 

  拉取drone镜像

sudo docker pull drone/drone:1.0.0-rc.5

sudo docker pull drone/agent:1.0.0-rc.5

  安装docker-compose,已安装的话可跳过。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

  需要创建一个目录,在此目录下编写docker-compose.yml文件,然后运行docker-compose命令

mkdir /etc/drone
vi /etc/drone/docker-compose.yml

   docker-compose.yml内容如下:

version: '3'

services:
  drone-server:
    image: drone/drone:1.0.0-rc.5
    ports:
      - 10081:80
    volumes:
      - /var/lib/drone:/var/lib/drone
      - /var/run/docker.sock:/var/run/docker.sock restart: always env_file:
- /etc/drone/server.env drone-agent: image: drone/agent:1.0.0-rc.5 command: agent depends_on: - drone-server volumes: - /var/run/docker.sock:/var/run/docker.sock restart: always env_file: - /etc/drone/agent.env

  生成drone和agent之间通信需要的密钥

LC_ALL=C  
 

  此次生成的密钥内容为:MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM

  在/etc/drone/目录创建文件server.env,保存如下内容:

DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
DRONE_SERVER_HOST=192.168.1.137:10081
DRONE_SERVER_PROTO=http
DRONE_OPEN=true
DRONE_GOGS=true
DRONE_GOGS_SERVER=http://192.168.1.137:10080
DRONE_PROVIDER=gogs
DRONE_LOGS_TRACE=true
DRONE_LOGS_DEBUG=true

  agent.env内容如下:

DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
DRONE_RPC_SERVER=http://192.168.1.137:10081
DRONE_LOGS_TRACE=true
DRONE_LOGS_DEBUG=true

  通过命令启动drone

docker-compose up -d

  本地访问drone服务器地址http://192.168.1.137:10081,用gogs账号登录drone

Gogs + Drone 实现CI/CD(CI)_第1张图片

   登录失败,gogs服务器connection refused,应该是端口问题,那就开放gogs端口。请确保gogs已经启动。

sudo firewall-cmd --zone=public --add-port=10080/tcp --permanent
sudo firewall-cmd --reload

 

Gogs + Drone 实现CI/CD(CI)_第2张图片

  登录之后在drone面板先同步gogs代码仓库,选择一个仓库,在设置选项填写之前生成的密钥,保存设置之后,gogs仓库会生成一个web hook

Gogs + Drone 实现CI/CD(CI)_第3张图片

  由于之前已经配置好了gogs,进入项目仓库,更新web钩子,将推送地址加上drone服务器端口号

Gogs + Drone 实现CI/CD(CI)_第4张图片

  更新web hook之后,点击下面的测试推送,如果失败提示connection refused的话,就开放drone的10081端口。

  为这个空仓库新增.drone.yml文件

kind: pipeline
name: greeting

steps:
- name: en
  image: alpine
  commands:
  - echo hello
  - echo world

- name: es
  image: alpine
  commands:
  - echo hola
  - echo mundo

- name: fr
  image: alpine
  commands:
  - echo bonjour
  - echo monde

- name: zh
  image: alpine
  commands:
  - echo 你好
  - echo 世界

  提交到gogs仓库后,自动触发web hook事件,drone会执行yml文件中的脚本

Gogs + Drone 实现CI/CD(CI)_第5张图片

Gogs + Drone 实现CI/CD(CI)_第6张图片

  然鹅构建却一直pending...

Gogs + Drone 实现CI/CD(CI)_第7张图片

 

  这个drone.yml脚本比较简单,只是简单的打印消息,然而不解的是不知道为什么没有输出。不得其解就继续翻官方文档和各种issue以及网络教程,没什么头绪就把配置项尽可能写全一点,发现原来是数据库配置项的原因,drone默认使用sqlite做数据持久化,但是文档也写明说不需要额外的配置,但是按照目前的配置,虽然web hook可以触发,但是pipeline任务一直处于pending状态,加上数据库配置项,终于有了动静。

  虽然官方强烈建议使用postgres而不是mysql,但是既然drone支持使用mysql,而且我安装的就是mysql,那当然是使用mysql配置项了。drone还强烈建议使用gitea而不是gogs呢。在server.env中加上下面这两行配置,mysql账号密码和ip改成自己的。

DRONE_DATABASE_DRIVER=mysql
DRONE_DATABASE_DATASOURCE=root:password@tcp(1.2.3.4:3306)/drone?parseTime=true

  也可以使用下面的配置,会在配置路径下产生sqlite脚本,drone产生的数据会保存在这个脚本中。

- DRONE_DATABASE_DATASOURCE=/var/lib/drone/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3

  重新执行一下pipeline脚本,终于成功。

Gogs + Drone 实现CI/CD(CI)_第8张图片

 

  以上的docker-compose.yml也可以整合为一个文件,贴一下内容,可供参考

version: '3'
services:
  drone-server:
    image: drone/drone:1.0.0-rc.5
    ports:
      - 10081:80
    volumes:
      - ./drone:/var/lib/drone/
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_OPEN=true
      - DRONE_SERVER_HOST=192.168.1.137:10081
      - DRONE_SERVER_PROTO=http
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true
      - DRONE_GOGS=true
      - DRONE_GOGS_SERVER=http://192.168.1.137:10080
      - DRONE_PROVIDER=gogs
      - DRONE_DATABASE_DATASOURCE=root:your_password@tcp(192.168.1.137:3306)/drone?parseTime=true
      - DRONE_DATABASE_DRIVER=mysql
      - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
  drone-agent:
    image: drone/agent:1.0.0-rc.5
    depends_on:
      - drone-server
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    environment:
      - DRONE_RPC_SERVER=http://192.168.1.137:10081
      - DRONE_RPC_SECRET=MWckgvhjqg4E3eQ0psgZX4iNCxoQiyU4LLvO4eXFFuHtrTkIy8vwcAc3erB5f9reM
      - DRONE_LOGS_TRACE=true
      - DRONE_LOGS_DEBUG=true

 

  记录一下可能会遇到的问题:

  1、web hook可以正常推送消息,而pipeline脚本一直pending,检查drone-server的数据库配置项;

  2、以非root用户运行,可能会遇到docker权限问题,需要将当前用户加入到docker用户组,避免重新登录的话可以su root,然后再su当前用户;

  3、pipeline脚本执行的时候抛出docker权限异常,需要将drone-agent挂载docker执行目录。

 

  通过此番操作,已经实现了持续集成,要实现持续交付,关键在于.drone.yml的编写,Deployment部分待下回推送代码之后再做分享。

 

  顺便说一下drone的文档,1.0之前的文档提供的安装方式是docker compose,有中文文档;1.0之后的文档提供的安装方式的使用docker,只有英文版,不过好像断层了,没有提供1.0版本之前的文档链接。

 

 

 

你可能感兴趣的:(Gogs + Drone 实现CI/CD(CI))