本文通过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 </dev/urandom tr -dc A-Za-z0-9 | head -c 65 && echo

  此次生成的密钥内容为: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服务器connection refused,应该是端口问题,那就开放gogs端口。请确保gogs已经启动。

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

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

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

  更新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文件中的脚本

  然鹅构建却一直pending...

  这个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脚本,终于成功。

  以上的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版本之前的文档链接。

最新文章

  1. explain mysql的type字段,索引的类型
  2. ASP.NET 5中的静态文件处理
  3. 查看GCC编译C的中间代码
  4. Linux自动化安装cobbler
  5. UDP protocol
  6. 深入学习Oracle分区表及分区索引
  7. 自己实现Single LinkedList
  8. 多个分布式系统如何共享使用一个固定公网IP
  9. 【转】[WCF REST] 帮助页面与自动消息格式(JSON/XML)选择
  10. [转载] Java并发编程:Callable、Future和FutureTask
  11. JSP自定义标签就是如此简单
  12. centos7下部署nginx与php
  13. cron定时任务
  14. Nginx+Tomcat+Https 服务器负载均衡配置
  15. QT +go 开发 GUI程序
  16. 设置mysql 事务锁超时时间 innodb_lock_wait_timeout
  17. Markdown新手教程
  18. JavaScript对象编程-第3章
  19. python Twisted安装报错
  20. C语言 深入学习

热门文章

  1. 当fixed元素相互嵌套时,父元素会影响子元素的层叠关系,最好不要嵌套使用fixed
  2. Manning Java Persistence with Hibernate &amp; hibernate_in_action
  3. Python3基础 continue while循环示例
  4. pytorch nn.Sequential()动态添加方法
  5. wpf程序,只允许运行一个程序实例问题
  6. 一起玩&quot;Docker&quot;之1——Ubuntu配置安装Docker运行环境并安装(Ubuntu、Centos)镜像
  7. 【php】PHP制作QQ微信支付宝三合一收款码
  8. python初级 1 内存和变量
  9. Python核心编程(第二版)PDF
  10. Python动态构造类:借助强悍的内建 type()