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