最近研究了一下 drone,尝试将 drone 和 gitea 集合在一起,做 CI 服务;drone 官方是有说明文档,支持 gitea 的,见 drone server 的安装文档;但是我个人觉得不够详细,在这里记下安装过程。
先上 docker-compose.yaml 文件:
version: “3.6”
services:
mysql:
image: mysql:${MYSQL_VERSION}
container_name: mysql
ports:
– “${MYSQL_HOST_PORT}:3306”
volumes:
– ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
– ${MYSQL_DATA_DIR}:/var/lib/mysql/:rw
restart: always
networks:
– default
environment:
MYSQL_ROOT_PASSWORD: “${MYSQL_ROOT_PASSWORD}”
TZ: Asia/Shanghai
gitea:
image: gitea/gitea:latest
container_name: gitea
environment:
TZ: Asia/Shanghai
volumes:
– /var/lib/gitea:/data
restart: always
networks:
– default
ports:
– “10022:22”
– “10080:3000”
drone-server:
image: drone/drone:latest
container_name: drone-server
ports:
– “8080:80”
– “8000:8000”
– “9000:9000”
volumes:
– /var/run/docker.sock:/var/run/docker.sock
– /dnmp/drone/:/var/lib/drone/:rw
restart: always
environment:
– DRONE_GITEA_SERVER=http://192.168.88.190:10080
#- DRONE_GITEA_SERVER=http://127.0.0.1:10080
– DRONE_GIT_ALWAYS_AUTH=false
– DRONE_RUNNER_CAPACITY=2
– DRONE_SERVER_HOST=192.168.88.190
– DRONE_SERVER_PROTO=http
– DRONE_RPC_SECRET=9c3921e3e748aff725d2e16ef31fbc42
– DRONE_TLS_AUTOCERT=false
– DRONE_LOGS_DEBUG=true
– TZ=Asia/Shanghai
restart: always
networks:
– default
drone-agent:
image: drone/agent:latest
container_name: drone-agent
command: agent
restart: always
depends_on:
– drone-server
volumes:
– /var/run/docker.sock:/var/run/docker.sock
environment:
#- DRONE_RPC_SERVER=http://192.168.88.190:9000
– DRONE_RPC_SERVER=drone-server:9000
– DRONE_RPC_SECRET=9c3921e3e748aff725d2e16ef31fbc42
– DRONE_RUNNER_CAPACITY=2
– DRONE_RUNNER_NAME=192.168.88.190
– DRONE_LOGS_DEBUG=true
– TZ=Asia/Shanghai
restart: always
#detach: true
networks:
– default
networks:
default:
我的环境是本地虚拟机 centos7,上面 IP 地址是虚拟机的 ip 地址。因为 gitea 是采用 mysql 数据库,所以要启动一个 msyql 的容器服务;通过命名 docker-compose -f docker-compose.yml build 命令先将镜像构建,其实都是用官方的镜像,构建这一步是很快的,只是做一个检查;
然后 docker-compose -f docker-compose.yml up -d 将容器运行起来,通过 docker ps - a 可以查看到容器的状态:
status 这一栏都是正常的,表明服务就可以使用了。
先要配置 gitea,通过 http://192.168.88.190:10080/ 进入 gitea 的 web 页面,点击登录后,就会出现安装向导,填写信息,点击安装,等几分钟就 ok 了。安装的细节稍微要注意填写的地址和端口,容器内部要填写 3000,对外开放的是 10080。记住设置的管理员账号和密码,后面 drone 登录时也要用到。
然后通过 http://192.168.88.190:8080/ 进入 drone 的 web 页面,如下:
输入刚才在 gitea 设置的管理员账号和密码,就可以登录成功,就能看到如下页面:
刚开始 repositories 是空的,点击右上方的 sync 按钮,等一分钟就会自动同步 gitea 项目过来;同步过来的 gitea 仓库,默认状态是没开启的。可以点击 setting 页面,进入设置,如下:
填写配置文件名字,默认是.drone.yml。点击 save,就会开启。点击 save 的时候,drone 会将配置信息同步给你的 gitea,gitea 项目那边会响应,然后配置一个 webhook,这里有个坑,后面再讲。
顺利的话,你在 gitea 项目添加.drone.yal 后,就会触发构建,我在 gitea 仓库 test 下建的.drone.yml 文件:
workspace:
base: /go
path: src/web_api
pipeline:
build:
image: golang
environment:
TZ: Asia/Shanghai
commands:
– pwd
– go env
– date
– go version
– go build
– ls -a
提交 gitea 后,查看 drone 的状态:
第一步是 clone 代码,第二步是 build,因为我的.drone.yml 超级简单,没有后面的步骤,只是测试用的。第二步 build 的结果:看到正常运行,drone+gitea 的服务就初步搭建起来了。后面通过在.drone.yml 添加内容和服务,就能达到快速 CI/CD 的效果。
顺便记录一下踩的坑,刚开始我按照 drone 集成 gitea 的安装文档,将 docker-compose.yml 文件写好,运行 docker-compose -f docker-compose.yml up -d 将容器运行起来,通过 docker ps - a 看到 drone-server 容器怎样都起不来,docker logs drone-server 也看不出报错。
在网上找到 drone+gitea 的贴子,大部分都是 drone0.8 版本,鉴于此,我将 drone 的 latest 改为 0.8,安装 0.8 版本的配置,重新运行,竟然跑起来了。跑起来后,我就摸索 drone 的配置和服务,后面发现 1.0 版本有一些配置跟 0.8 不一样,官方有说明,但不明显。见:
1.0 版本跑不起来的配置,是因为 drone-server 的服务,80 端口没对外开放,据我目前的了解,1.0 版本默认是开放 80 端口,我当时按照 0.8 版本的端口,配置了 ”8000:8000″ 和 ”9000:9000″,就差 80 端口,所以服务一直不正常。
这里也会涉及到 gitea 的 webhook,上面说的在 drone 将 gitea 设置为开启状态时,这两者会交互的,我们看下 gitea 的 webhook:
drone 关联 gitea 项目时,就会有添加这个,但是端口不是 8080,默认是 80,就是没有端口的,类似:http://192.168.88.190/hook?se…。点击修改,加上前面设置的端口 8080,点击保存,然后 test 一下 webhook,就能看到效果。
至此,drone1.0+gitea,docker 部署安装的步骤就完成了。drone 更多细节,还有待继续研究。