Drone + Gogs 执行自动构建

Drone 是一种基于容器技术的持续交付系统。Drone 使用YAML配置文件来定义和执行Docker容器中的Pipelines。

Gogs 是一个用Go编写的轻量级git服务器,它设计简单,易于设置和操作。Gogs提供存储库文件查看和编辑,项目问题跟踪以及项目文档的内置wiki。

Drone 作为一个CI工具,当然会出现与Jenkins的对比,从docker镜像来看,Jenkins的镜像达到了702M,而Drone的最新的docker镜像才62.1M。最重要的是drone使用的是yaml文件来进行构建,这对使用docker的人来说是相当友好的,而Jenkins的pipeline的编写对大多数人来说都是一种挑战。就像Jenkins官方所说的一样,“Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。”,而drone所提供的插件相对来说很少,只有百十个的样子,所以这也是Jenkins的优势。

当然,对于Gitlab-runner,它也有同样的问题,gitlab-runner的v11.9.0的镜像达到了403M,而且Gitlab-runner是与Gitlab深度集成的,如果你使用了Gitlab,那这很好;而如果你使用的是GitHub这些源代码管理系统,那这就是问题了。

Drone适用于在Docker容器内运行的任何语言,数据库或服务。Drone使用容器将预先配置的步骤放入pipeline中。从现有插件或通过创建自己的插件来进行构建。当然,正如前面说的,drone使用yaml来定义pipeline,它的语法简洁明了,很容易上手。关于drone的更多介绍详见:https://drone.io/。

还是从外在的地方来对比,我使用的Gitlab-CE的11.7.5版本,docker镜像达到了1.59G,而最新版的gogs,它的镜像才99.1M,足够轻量级。Gogs在GitHub上的star也突破了三万,这也证明了gogs的受欢迎程度,同时gogs对中文支持很好。其他不再细讲,Gitlab官方也对Gogs做了对比,详见:https://about.gitlab.com/devops-tools/gogs-vs-gitlab.html。

这里对于Drone和Gogs的部署是使用docker-compose单机模式部署的。在使用docker-compose部署之前,我首先想的是将drone部署在kubernetes上,但是drone对此的支持不是很好,drone需要可路由的域名,无论是使用traefik部署的内部域名,还是service,Gitlab和Gogs都无法连接该域名或service,这就导致Gitlab和Gogs无法将代码推送到drone。drone的文档也还不够丰富,我也查阅了官方论坛,依然没能解决,所以很遗憾。

配置 docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# vim docker-compose.yaml 
version: '3.5'

services:
drone-server:
container_name: drone-server
image: 192.168.100.100/drone/drone:1.1.0
restart: always
labels:
- "traefik.docker.network: traefik"
- "traefik.frontend.rule=Host:drone.flywzj.com"
networks:
traefik:
aliases:
- drone.flywzj.com
ports:
- "18080:80"
- "4433:443"
volumes:
- /data/drone:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_GIT_ALWAYS_AUTH=false
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NETWORKS=traefik
- DRONE_SERVER_HOST=drone-server
- DRONE_SERVER_PROTO=http
- DRONE_LOGS_DEBUG=true
- DRONE_TLS_AUTOCERT=false
- DRONE_GOGS_SKIP_VERIFY=false
- DRONE_GOGS_SERVER=http://gogs.flywzj.com:3000
- DRONE_PROVIDER=gogs
- DRONE_DATABASE_DATASOURCE=/data/drone.sqlite
- DRONE_DATABASE_DRIVER=sqlite3

gogs:
container_name: gogs
image: 192.168.100.100/gogs/gogs:latest
restart: always
labels:
- "traefik.docker.network: traefik"
- "traefik.frontend.rule=Host:gogs.flywzj.com"
- "traefik.http.port=3000"
- "traefik.ssh.port=22"
networks:
traefik:
aliases:
- gogs.flywzj.com
ports:
- "10022:22"
- "3000:3000"
volumes:
- /data/gogs:/data
depends_on:
- mysql

mysql:
container_name: mysql
image: 192.168.100.100/library/mysql:5.7
restart: always
labels:
- "traefik.docker.network: traefik"
networks:
- traefik
volumes:
- /data/mysql:/var/lib/mysql
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "3306:3306"
command: --explicit_defaults_for_timestamp=true --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: 'passw0rd'
MYSQL_DATABASE: 'gogs'
MYSQL_USER: 'gogs'
MYSQL_PASSWORD: 'gogs'
TZ: Asia/Shanghai

traefik-proxy:
container_name: traefik
image: 192.168.100.100/library/traefik:1.7
restart: always
labels:
- "traefik.docker.network: traefik"
networks:
- traefik
command: --api --docker
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock

networks:
traefik:
name: traefik
external: false

部署 docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
# docker-compose up -d
Creating mysql ... done
Creating gogs ... done
Creating drone-server ...
Creating traefik ...
Creating gogs ...
# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------
drone-server /bin/drone-server Up 0.0.0.0:4433->443/tcp, 0.0.0.0:18080->80/tcp
gogs /app/gogs/docker/start.sh ... Up 0.0.0.0:10022->22/tcp, 0.0.0.0:3000->3000/tcp
mysql docker-entrypoint.sh --exp ... Up 0.0.0.0:3306->3306/tcp, 33060/tcp
traefik /traefik --api --docker Up 0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp

部署 Gogs

这里通过traefik配置的gogs.flywzj.com:3000即可登录配置界面,安装后创建一个新的仓库

gogs01

注: 数据库主机 —-> mysql:3306 (这里的mysql是container_name)

启用 Drone

这里通过traefik配置的drone.flywzj.com即可登录,之后输入在gogs上创建的账号和密码即可登录,登录后drone会自动进行同步

点击”ACTIVATE”激活该代码库

drone01

进入该代码库,点击”SETTINGS”之后,点击”ACTIVATE REPOSITORY”激活储存库

drone02

激活后配置项如下图所示

drone03

推送代码到 Gogs

注:新建的代码库是无法直接在gogs的web端进行编辑的,需要从远端推送一次后才能在gogs的web端进行编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# git clone http://gogs.flywzj.com:3000/zhi/test.git
# cd test/
# vim Dockerfile
FROM alpine
RUN echo hello-world
# vim .drone.yml
kind: pipeline
name: default

steps:
- name: build
image: plugins/docker
settings:
username:
from_secret: docker_username
password:
from_secret: docker_password
repo: wangzhijian/test
tags: latest
dry_run: true
# git add --all .
# git commit -m "update"
[master(根提交) 7dbb251] update
2 files changed, 14 insertions(+)
create mode 100644 .drone.yml
create mode 100644 Dockerfile
# git push -u origin master

注:”from_secret”里的密钥需在”SETTINGS” ===> “Secrets” 下进行配置;使用 “dry_run: true” 将不推送到镜像仓库

查看 Drone

构建中的状态显示如下:

drone04

构建完成显示如下:

drone05

点击即可进入查看构建的详细信息:

drone06

drone07

附:

ZhiJian wechat
欢迎您扫一扫上面的二维码,订阅我的微信公众号!
-------------本文结束,感谢您的阅读-------------