Gogs+Drone轻量搭配替代Gitlab+Jenkins实现自动化部署

在开发或生产环境中,我们经常会搞一套自动化部署方案(俗称一键部署)。比较流行的一种就是Gitlab+Jenkins实现方案,不过这种方案占用内存比较大,没有个8G内存,很难流畅运行,而且部署起来也不快。最近发现一款神器Drone,轻量级CI/DI工具,结合Gogs使用内存占用不到1G,几行脚本就能实现自动化部署,推荐给大家!

Gogs

Gogs简介

Gogs是一款极易搭建的自助Git服务,使用Go语言开发,只要Go语言支持的平台它都支持,包括Linux、Mac OS X、Windows以及ARM平台。Gogs对系统硬件要求极低,你甚至可以在树莓派上搭建它。

项目地址:https://github.com/gogs/gogs

Gogs安装

首先需要下载Gogs的Docker镜像:

1
docker pull gogs/gogs

下载完成后在Docker容器中运行Gogs:

1
2
3
4
docker run -p 10022:22 -p 10080:3000 --name=gogs \
-e TZ="Asia/Shanghai" \
-v /mydata/gogs:/data \
-d gogs/gogs

命令中值得注意的地方,10022对应的是Gogs的SSH服务端口,10080对应的使用Gogs的HTTP服务端口,我们还将容器的数据目录挂载到了宿主机的/mydata/gogs目录下,这样就算我们重新创建容器数据也不会丢失。

Gogs配置

安装完成后,我们第一次访问Gogs服务会显示一个设置页面,访问地址:http://192.168.5.19:10080/

数据库设置,这里我们直接使用内置的SQLite3数据库即可,使用其他的需要自行搭建数据库

应用基本设置,主要修改域名、SSH端口号和应用URL即可

Gogs使用

注册

配置好以后会直接跳转到登录界面,首先注册一个帐户

注册完成后,登录即可进入控制面板页面

创建仓库

直接使用仓库右侧的加号即可创建仓库,简单设置下仓库名称和可见性来完成创建

创建成功后直接使用克隆地址即可克隆该仓库

工单管理

这里的工单管理,有点类似Github上面的Issue的功能,我们可以通过创建工单按钮来创建

输入标题、内容和标签以后即可创建

添加用户

有时候管理员需要新建一些帐户来协作开发,此时我们只要点击头像->管理面板->用户管理即可打开用户管理界面

然后点击创建新的帐户,输入相关信息即可完成创建

管理协作者

创建完成后,我们可以在仓库页面的仓库设置中打开管理协作者功能

之后通过输入协作者账户,点击增加新的协作者并设置好权限即可,这样协作者即可访问并向该仓库提交代码

迁移外部仓库

Gogs还提供了从外部仓库迁移代码的功能,通过头像左侧的加号,然后选择迁移外部仓库即可

Gogs VS Gitlab

比较方面 Gogs Gitlab
Docker镜像大小 44MB 836MB
启动速度 很快,几秒 很慢,机器配置不好要10分钟
配置要求 很低,树莓派都可以 很高,吃内存,吃CPU
访问速度 够快 机器配置好也还可以
功能 功能较少 功能很丰富

Drone

Drone简介

Drone是一款基于容器技术的持续集成工具,使用简单的YAML配置文件即可完成复杂的自动化构建、测试、部署任务,在Github上已经有22K+Star。

Drone构建记录

Drone安装

接下来安装下Drone,不愧是基于容器的CI/DI工具,使用Docker安装很方便!

首先下载Drone的Server和Runner的镜像

1
2
3
4
# Drone的Server
docker pull drone/drone:1
# Drone的Runner
docker pull drone-runner-docker:1

这里有个Server和Runner的概念,我们先来理解下

  • Server:为Drone的管理提供了Web页面,用于管理从Git上获取的仓库中的流水线任务
  • Runner:一个单独的守护进程,会轮询Server,获取需要执行的流水线任务,之后执行

接下来我们来安装drone-server,使用如下命令即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run \
-v /mydata/drone:/data \
-e DRONE_AGENTS_ENABLED=true \
-e DRONE_GOGS_SERVER=http://192.168.5.78:10080 \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_SERVER_HOST=192.168.5.78:3080 \
-e DRONE_SERVER_PROTO=http \
-e DRONE_USER_CREATE=username:macro,admin:true \
-e TZ="Asia/Shanghai" \
-p 3080:80 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1

这里的配置参数比较多,下面统一解释下:

  • DRONE_GOGS_SERVER:用于配置Gogs服务地址
  • DRONE_RPC_SECRET:Drone的共享秘钥,用于验证连接到server的rpc连接,server和runner需要提供同样的秘钥
  • DRONE_SERVER_HOST:用于配置Drone server外部可访问的地址
  • DRONE_SERVER_PROTO:用于配置Drone server外部可访问的协议,必须是http或https
  • DRONE_USER_CREATE:创建一个管理员账号,该账号需要在Gogs中注册好

接下来安装drone-runner-docker,当有需要执行的任务时,会启动临时的容器来执行流水线任务:

1
2
3
4
5
6
7
8
9
10
11
12
docker run -d \
-v /var/run/docker.sock:/var/run/docker.sock \
-e DRONE_RPC_PROTO=http \
-e DRONE_RPC_HOST=192.168.5.78:3080 \
-e DRONE_RPC_SECRET=dronerpc666 \
-e DRONE_RUNNER_CAPACITY=2 \
-e DRONE_RUNNER_NAME=runner-docker \
-e TZ="Asia/Shanghai" \
-p 3000:3000 \
--restart always \
--name runner-docker \
drone/drone-runner-docker:1

这里的配置参数比较多,下面统一解释下:

  • DRONE_RPC_PROTO:用于配置连接到Drone server的协议,必须是http或https
  • DRONE_RPC_HOST:用于配置Drone server的访问地址,runner会连接到server获取流水线任务并执行
  • DRONE_RPC_SECRET:用于配置连接到Drone server的共享秘钥
  • DRONE_RUNNER_CAPACITY:限制runner并发执行的流水线任务数量
  • DRONE_RUNNER_NAME:自定义runner的名称

Drone使用

让我们来访问下Drone的控制台页面,第一次登录需要输入账号密码(在Gogs中注册的账号),访问地址:http://192.168.5.78:3080/

此时我们在Gogs中的项目会现在在列表中,如果没有的话可以点下SYNC按钮

接下来我们需要对仓库进行设置,将仓库设置为Trusted(否则Drone创建的容器无法挂载目录到宿主机),最后点击SAVE按钮保存

保存成功后会在Gogs中自动配置一个Web钩子,当我们推送代码到Gogs中去时,会触发这个钩子,然后执行在Drone中的流水线任务

拉到最下面,我们可以发送一个测试推送,推送成功会显示绿色的√

此时我们在Drone中发现其实流水线执行失败了,那是因为我们在脚本中引用了Secret中的ssh_password

在仓库的设置中添加一个Secret即可,Secret是专门用来存储密码的,此密码只能被使用或删除,无法被查看

ACTIVITY FEED中使用RESTART可以重新执行该流水线,发现已经成功执行

编写脚本

当我们向Git仓库Push代码时,会自动触发Web钩子,然后Drone就会从Git仓库Clone代码,再通过项目目录下的.drone.yml配置,执行相应的流水线,接下来我们来看看这个脚本是如何写的。

首先我们来了解下在.drone.yml中配置的工作流都有哪些操作,看下流程图就知道了:

Drone构建流程

再来一个完整的.drone.yml,配上详细的注解,看下就基本懂了!

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
kind: pipeline # 定义对象类型,还有secret和signature两种类型
type: docker # 定义流水线类型,还有kubernetes、exec、ssh等类型
name: mall-tiny-drone # 定义流水线名称

steps: # 定义流水线执行步骤,这些步骤将顺序执行
- name: package # 流水线名称
image: maven:3-jdk-8 # 定义创建容器的Docker镜像
volumes: # 将容器内目录挂载到宿主机,仓库需要开启Trusted设置
- name: maven-cache
path: /root/.m2 # 将maven下载依赖的目录挂载出来,防止重复下载
- name: maven-build
path: /app/build # 将应用打包好的Jar和执行脚本挂载出来
commands: # 定义在Docker容器中执行的shell命令
- mvn clean package # 应用打包命令
- cp target/mall-tiny-drone-1.0-SNAPSHOT.jar /app/build/mall-tiny-drone-1.0-SNAPSHOT.jar
- cp Dockerfile /app/build/Dockerfile
- cp run.sh /app/build/run.sh

- name: build-start
image: appleboy/drone-ssh # SSH工具镜像
settings:
host: 192.168.5.78 # 远程连接地址
username: root # 远程连接账号
password:
from_secret: ssh_password # 从Secret中读取SSH密码
port: 22 # 远程连接端口
command_timeout: 5m # 远程执行命令超时时间
script:
- cd /mydata/maven/build # 进入宿主机构建目录
- chmod +x run.sh # 更改为可执行脚本
- ./run.sh # 运行脚本打包应用镜像并运行

volumes: # 定义流水线挂载目录,用于共享数据
- name: maven-build
host:
path: /mydata/maven/build # 从宿主机中挂载的目录
- name: maven-cache
host:
path: /mydata/maven/cache

run.sh执行脚本可以实现打包应用和运行容器镜像

总结

对比Jenkins复杂的图形化界面操作,Drone使用脚本来定义流水线任务无疑更简单、更直观。Drone更加轻量级,内存占用少且响应速度快!

参考资料

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :