1 基本介绍

1.1 Drone简介

Drone是基于GO语言开发的持续集成(Continuous integration,CI)引擎,它可以借助Docker容器技术,用于自动化测试与构建,满足持续交付的基本需求,适合小团队开发。Drone具有简洁、轻量级、启动快、资源占用等特点。 Jenkins也是CI引擎,它的特点是文档丰富、功能丰富、插件丰富、配置功能强大等特点,但资源占用较高。Drone比Jenkins轻量级,对云原生支持较好。

# 官方网址:
https://www.drone.io/

1.2 Gogs简介

Gogs是基于GO语言开发的代码仓库管理系统。它可以借助Docker容器技术,为开发人员提供Git服务,适合小团队开发。Gogs具有最简单、最快速和最轻松的极易搭建Git服务的特点。GitLab也是代码仓库管理系统,它的具有功能强大、开源社区庞大、文档丰富等特点,但资源占用较高,维护成本较高。Gogs比GitLab轻量级,对云原生支持较好,且是国人开发。

# 官方网址:
https://gogs.io/

1.3 实现自动化部署的方案

针对大型团队推荐使用Gitlab+Jenkins,小团队推荐使用Gogs+Drone。

使用的软件版本:

​ Docker版本:20.10.0

​ gogs版本:0.12.10

​ Drone版本:2.12.0

​ drone-runner-docker版本:1.8.2

2 Docker安装Gogs

2.1 安装Gogs

# 下载Gogs镜像
docker pull gogs/gogs:0.12.10

# 安装Gogs容器
# 对外映射的端口是12022和13000,目录是/home/gogs/data
# 22是ssh端口,3000是web访问端口
docker run -itd \
--name=gogs \
--restart=always \
--privileged \
-p 12022:22 \
-p 13000:3000 \
-v /home/gogs/data:/data \
gogs/gogs:0.12.10

2.2 配置Gogs

# 在浏览器中输入以下IP地址,进入配置页面
http://192.168.108.200:13000/

详细配置如下

2.3 使用Gogs

(1)创建仓库

(2)创建完成的信息

3 Docker安装Drone

3.1 安装Drone-server

# 下载Drone-server镜像
docker pull drone/drone:2.12.0

# 安装Drone-server和配置gogs的参考文档
https://docs.drone.io/server/provider/gogs/

# 安装容器
# 注意:不同的仓库有不同的配置参数,gitlab和gogs的配置参数不同
# 参数说明:
# DRONE_AGENTS_ENABLED: 启动代理;
# DRONE_GOGS_SERVER: Gogs的Web服务地址;
# DRONE_SERVER_HOST: Drone Server的Web服务地址;
# DRONE_SERVER_PROTO: Drone Server的Web访问协议;
# DRONE_USER_CREATE: Drone Server的管理员账号,尽量与Gogs的管理员账号一直,一定要配置;
# DRONE_RPC_SECRET: Drone Server的共享秘钥,为Drone runner提供RPC提供远程过程调用;
docker run -itd \
--env=DRONE_AGENTS_ENABLED=true \
--env=DRONE_GOGS_SERVER=http://192.168.108.200:13000 \
--env=DRONE_SERVER_PROTO=http \
--env=DRONE_SERVER_HOST=192.168.108.200:20080 \
--env=DRONE_USER_CREATE=username:administrator,admin:true \
--env=DRONE_RPC_SECRET=123456 \
--name=drone-server \
--restart=always \
-p 20080:80 \
-v /home/drone/server/data:/data \
drone/drone:2.12.0

3.2 安装Drone-runner-docker

# 下载Drone-runner-docker镜像
docker pull drone/drone-runner-docker:1.8.2

# 安装Drone-runner-docker的参考文档
https://docs.drone.io/runner/docker/installation/linux/

# 创建容器
# 参数说明:
# DRONE_RPC_PROTO: 连接到Drone server的Web访问协议;
# DRONE_RPC_HOST:  Drone Server的Web服务地址;
# DRONE_RPC_SECRET: Drone Server的共享秘钥;
# DRONE_RUNNER_CAPACITY: Drone runner流水线并发执行的任务量;
# DRONE_RUNNER_NAME: Drone runner的名称;
# 注意:映射目录必须这样写“/var/run/docker.sock:/var/run/docker.sock”
docker run -itd \
--env=DRONE_RPC_PROTO=http \
--env=DRONE_RPC_HOST=192.168.108.200:20080 \
--env=DRONE_RPC_SECRET=123456 \
--env=DRONE_RUNNER_CAPACITY=2 \
--env=DRONE_RUNNER_NAME=drone-runner-line \
--name=drone-runner \
--restart=always \
-p 23000:3000 \
-v /var/run/docker.sock:/var/run/docker.sock \
drone/drone-runner-docker:1.8.2

3.3 配置Drone

(1)登录Drone

# 在浏览器中输入以下IP地址
http://192.168.108.200:20080/

(2)配置drone

点击“continue”

(3)进入drone

4 配置Drone和Gogs的连接

4.1 在Gogs中配置test仓库的”.drone.yml“文件

# 官网不同语言的配置例子
https://docs.drone.io/pipeline/docker/examples/

在Gogs的test仓库中创建”.drone.yml“文件

”.drone.yml“文件编辑的内容如下:

kind: pipeline
name: test-pipeline
 
steps:

# 构建和编译Java项目
- name: test-build
  image: maven:3.8.4
  volumes:
    # Maven缓存目录
    - name: mvn-cache
      path: /root/.m2
    # Maven打包后的目录
    - name: mvn-build
      path: /app/build

  # 在Docker容器内执行的命令
  commands:
    - mvn clean install

# 发布项目
- name: test-deploy
  image: appleboy/drone-ssh:1.6.4
  settings:
    # 部署主机的IP  
    host: 192.168.108.200
    # 部署主机的登录账号
    username:
      from_secret: root
    # 部署主机的登录密码
    password:
      from_secret: 123456
    # 端口号
    port: 22
    # 设置超时
    command_timeout: 10m
    # 编写脚本,可根据具体情况编写
    script:
      # 进入宿主机的“/home/app”目录(先在宿主机上创建app目录)
      - cd /home/app
      # 删除jar包,我测试的工程名是test
      - rm -rf test.0.0.1-SNAPSHOT.jar
      # 将编译后的jar包复制到"/home/app"下
      - mv /home/mvn/build/test/test.0.0.1-SNAPSHOT.jar test.0.0.1-SNAPSHOT.jar
      # 执行"/home/app"下的脚本
      - sh start.sh

# 挂载宿主机目录,对应"test-build"的Maven容器的目录
volumes:
  - name: mvn-cache
    host:
      path: /home/mvn/.m2
  - name: mvn-build
    host:
      path: /home/mvn/build

# 对应Gogs仓库分支
trigger:
  branch:
    - master

4.2 在Drone中配置Gogs的test仓库

(1)进入test仓库配置

(2)激活仓库

(3)配置仓库

4.3 测试项目

(1)配置Web钩子

点击”管理Web钩子“,按照如下配置,推送到Drone Server

测试主动推送

(2)测试推送出现的问题

(1)出现“Payload URL resolved to a local network address that is implicitly blocked.”,或者“推送URL被解析到默认禁用的本地网络地址”,如下:

解决方法:

修改Gogs容器中“/data/gogs/conf”目录下的“app.ini”文件

# 在“security”下添加“LOCAL_NETWORK_ALLOWLIST”属性,设置为本地IP地址,如果是多个IP用逗号分开
[security]
LOCAL_NETWORK_ALLOWLIST = 192.168.108.200

(2)Drone Server中出现“Error response from daemon: client version 1.40 is too new. Maximum supported API version is 1.39”,如下:

解决方法:

升级Docker版本,或者降低Drone版本(我刚开始使用Docker版本比较低,所以出现以上错误)

 # Centos7中升级指定版本的docker
 yum install docker-ce-20.10.0-3.el7

4.4 查看部署状态

(1)在Gogs中查看

(2)在Drone Server中查看

在执行过程中如下: