• 使用Docker安装Drone和Gogs实现自动化部署


    1 基本介绍

    1.1 Drone简介

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

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

    1.2 Gogs简介

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

    # 官方网址:
    https://gogs.io/
    
    • 1
    • 2

    1.3 实现自动化部署的方案

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

    使用的软件版本(如果版本太高会出现很多问题):

    Docker版本:18.09.6
    gogs版本:0.12.0
    Drone版本:2.6.0
    drone-runner-docker版本:1.4.0
    
    • 1
    • 2
    • 3
    • 4

    2 Docker安装Gogs

    2.1 安装Gogs

    # 下载Gogs镜像
    docker pull gogs/gogs:0.12.0
    
    # 安装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.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.2 配置Gogs

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

    详细配置如下

    在这里插入图片描述

    2.3 使用Gogs

    (1)创建仓库

    在这里插入图片描述

    (2)创建完成的信息

    在这里插入图片描述
    注意:仓库创建完成后,创建一个Spring Boot的test测试项目,并提交到test仓库中。

    3 Docker安装Drone

    3.1 安装Drone-server

    # 下载Drone-server镜像
    docker pull drone/drone:2.6.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.6.0
    
    • 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

    3.2 安装Drone-runner-docker

    # 下载Drone-runner-docker镜像
    docker pull drone/drone-runner-docker:1.4.0
    
    # 安装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.4.0
    
    • 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

    查看Drone-runer是否安装成功

    docker logs -f drone-runner
    
    • 1

    在这里插入图片描述

    3.3 配置Drone

    (1)登录Drone

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

    在这里插入图片描述

    (2)配置drone

    点击“continue”

    在这里插入图片描述

    在这里插入图片描述

    (3)进入drone

    在这里插入图片描述

    4 配置Drone和Gogs的连接

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

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

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

    在这里插入图片描述

    ⚠️ 注意:

    1. 我部署的drone和应用在同一台主机上,因此使用appleboy/drone-ssh作脚本控制即可。如果部署的drone和应用在不同的主机上,可以使用appleboy/drone-scp作远程复制,即将drone上的内容复制到应用所在的主机上,使用方法参见https://plugins.drone.io/plugins/scp
    2. drone中的pipeline表示管道,使用drone/git从仓库上下载完数据后,流程线中的容器可以认为是操作同一个容器中的数据。

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

    kind: pipeline
    type: docker
    name: test-pipeline
    
    # 关闭自动设置Git镜像
    # 此处可以不设置,将获取最新的git镜像
    clone:
      disable: true
    
    steps:
    # 设置Git镜像版本,下载仓库文件
    # 如果上面没有设置clone,此处需要删除(如果不删除,在pipeline中将多一个clone,pipeline会出错)
    - name: clone
      image: drone/git:1.2.1
    
    # 构建和编译Java项目
    - name: test-build
      image: maven:3.8.4
      volumes:
        # Maven缓存目录
        - name: mvn-cache
          path: /root/.m2
    
      # 在Docker容器内执行的命令
      commands:
        - mvn clean install
    
    # 发布项目
    - name: test-deploy
      image: appleboy/drone-ssh:1.6.4
      settings:
        # 部署主机的IP  
        host: 192.168.108.200
        # 部署主机的登录账号,需从Drone中获取密钥名ssh_user的值,创建方式见下面
        username:
          from_secret: ssh_user
        # 部署主机的登录密码,需从Drone中获取密钥名ssh_pwd的值,创建方式见下面
        password:
          from_secret: ssh_pwd
        # 端口号
        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"下
          - cp /home/mvn/.m2/repository/com/example/test/0.0.1-SNAPSHOT/test-0.0.1-SNAPSHOT.jar .
          # 执行"/home/app"下的脚本(注意:需要在“/home/app”目录下创建start.sh文件)
          # - sh start.sh
    
    # 挂载宿主机目录,对应"test-build"的Maven容器的目录
    volumes:
      - name: mvn-cache
        host:
          path: /home/mvn/.m2
    
    # 对应Gogs仓库分支
    trigger:
      branch:
        - master
    
    • 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

    (2)在Drone中设置宿主机的登录账号和密码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4.2 在Drone中配置Gogs的test仓库

    (1)进入test仓库配置

    在这里插入图片描述

    (2)激活仓库

    在这里插入图片描述

    (3)配置仓库

    在这里插入图片描述

    4.3 测试项目

    (1)配置Web钩子
    注意:需要在Drone中配置完test仓库后,才会出现Web钩子的地址,否则地址为空。
    点击”管理Web钩子“,按照如下配置,推送到Drone Server

    在这里插入图片描述

    测试主动推送

    在这里插入图片描述

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

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

    在这里插入图片描述

    解决方法:
    方法1: 最好的办法是建议降低gogs版本;
    方法2: 修改Gogs容器中“/data/gogs/conf”目录下的“app.ini”文件

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

    在这里插入图片描述

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

    在这里插入图片描述

    解决方法:

    方法1: 降低drone-runner-docker版本;
    方法2: 升级Docker版本(我刚开始使用Docker版本比较低,所以出现以上错误);

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

    4.4 查看部署状态

    (1)在Gogs中查看

    在这里插入图片描述

    (2)在Drone Server中查看

    仓库的推送历史记录
    在这里插入图片描述

    Drone部署的执行过程如下:

    在这里插入图片描述

    发布完成
    在这里插入图片描述
    在我的宿主机的“/home/app”目录下,已经生成了test-0.0.1-SNAPSHOT.jar文件
    在这里插入图片描述

  • 相关阅读:
    vue2中实现右键菜单
    计算机毕业设计SSM城市智能公交系统【附源码数据库】
    PVA接枝键合聚苯乙烯二乙烯基苯交联微球/聚苯乙烯微球表面接枝聚合丙烯酸酯的改性方法
    个人记录jenkins编译ios过程 xcode是9.4.1
    JAVAWEB_实验三 Servlet 相关技术
    Alibaba架构师纯手工打造神仙级“2022版Java面试手册”
    数据结构篇:树
    java高级用法之:JNA中的回调
    笔记本风扇科普
    es针对nested类型数据无法进行过滤查询的问题记录
  • 原文地址:https://blog.csdn.net/make_progress/article/details/127593910