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


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版本:18.09.6
gogs版本:0.12.0
Drone版本:2.6.0
drone-runner-docker版本:1.4.0

2 使用步骤

2.1 Docker安装Gogs

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

# 安装Gogs容器
# 对外映射的端口是1202213000,目录是/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

2.2 配置Gogs

在浏览器中输入以下IP地址,进入配置页面
http://192.168.108.200:13000/
详细配置如下:
在这里插入图片描述

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: GogsWeb服务地址;
# DRONE_SERVER_HOST: Drone ServerWeb服务地址;
# DRONE_SERVER_PROTO: Drone ServerWeb访问协议;
# 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

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 ServerWeb服务地址;
# 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

查看Drone-runer是否安装成功

docker logs -f drone-runner

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/

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

在这里插入图片描述
注意:

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

kind: pipeline
type: docker
name: dayunhui-pipeline

# 关闭自动设置Git镜像
# 此处可以不设置,将获取最新的git镜像
clone:
  disable: true

steps:
# 设置Git镜像版本,下载仓库文件
# 如果上面没有设置clone,此处需要删除(如果不删除,在pipeline中将多一个clone,pipeline会出错)
- name: clone
  image: dhub.kubesre.xyz/drone/git:1.2.1

# 构建和编译Java项目
- name: maven-build
  image: dhub.kubesre.xyz/maven:3.8.4
  volumes:
    # Maven缓存目录
    - name: mvn-cache
      path: /root/.m2

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

# 发布项目
- name: dayunhui
  image: dhub.kubesre.xyz/appleboy/drone-ssh:1.6.4
  settings:
    # 部署主机的IP  11
    host: 47.94.90.251
    # 部署主机的登录账号,需从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/feiyi/project/dayunhui/0.0.1-SNAPSHOT/dayunhui-0.0.1-SNAPSHOT.jar . 
      # 执行"/home/app"下的脚本(注意:需要在“/home/app”目录下创建dayunhui.sh文件)
      - export PATH=$PATH:/usr/local/jdk1.8.0_401/bin
      - sh dayunhui.sh restart
      #- nohup java -jar /home/app/dayunhui-0.0.1-SNAPSHOT.jar > /dev/null 2> /dev/null &
     
      #- export PATH=$PATH:/usr/local/jdk1.8.0_401/bin

     # - java -jar /home/app/dayunhui-0.0.1-SNAPSHOT.jar 


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

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

后端配置(多模块)

kind: pipeline
type: docker
name: smart-pipeline

# 关闭自动设置Git镜像
# 此处可以不设置,将获取最新的git镜像
clone:
  disable: true

steps:
# 设置Git镜像版本,下载仓库文件
# 如果上面没有设置clone,此处需要删除(如果不删除,在pipeline中将多一个clone,pipeline会出错)
- name: clone
  image: dhub.kubesre.xyz/drone/git:1.2.1

# 构建和编译Java项目
- name: maven-build
  image: dhub.kubesre.xyz/maven:3.8.4
  volumes:
    # Maven缓存目录
    - name: mvn-cache
      path: /root/.m2

  # 在Docker容器内执行的命令
  commands:
    - export PATH=/usr/local/jdk1.8.0_401/bin:$PATH
    - java -version
    - cd common
    - mvn clean install
    - cd ../visitor
    - mvn clean install
    - cd ../ucenter
    - mvn clean install

# 发布项目
- name: visitor
  image: dhub.kubesre.xyz/appleboy/drone-ssh:1.6.4
  settings:
    # 部署主机的IP  11
    host: 47.94.90.251
    # 部署主机的登录账号,需从Drone中获取密钥名ssh_user的值,创建方式见下面
    username:
      from_secret: ssh_user
    # 部署主机的登录密码,需从Drone中获取密钥名ssh_pwd的值,创建方式见下面
    password:
      from_secret: ssh_pwd
    # 端口号
    port: 22
    # 设置超时
    command_timeout: 10m
    # 编写脚本,可根据具体情况编写
    script:
      - export PATH=$PATH:/usr/local/jdk1.8.0_401/bin
      # 进入宿主机的“/home/app”目录(注意:先在宿主机上创建app目录)
      - cd /home/app
      # 检查 visitor JAR 是否在运行,并杀掉它
      - if ps -ef | grep "[v]isitor-0.0.1-SNAPSHOT.jar" | grep -v grep > /dev/null;
        then echo "Visitor process is running, killing it...";
        kill -9 $(ps -ef | grep "[v]isitor-0.0.1-SNAPSHOT.jar" |grep -v grep | awk '{print $2}');
        else
        echo "Visitor is not running";
        fi
       # 删除jar包,我测试的工程名是test
      # - rm -rf test.0.0.1-SNAPSHOT.jar
      # 将编译后的jar包复制到"/home/app"- cp /home/mvn/.m2/repository/com/crcc/visitor/visitor/0.0.1-SNAPSHOT/visitor-0.0.1-SNAPSHOT.jar .
      - nohup java -jar /home/app/dayunhui-0.0.1-SNAPSHOT.jar > /dev/null 2> /dev/null &
      #- java -jar /home/app/visitor-0.0.1-SNAPSHOT.jar
      # 执行"/home/app"下的脚本(注意:需要在“/home/app”目录下创建dayunhui.sh文件)
      #- sh dayunhui.sh restart


  # 发布项目
- name: ucenter
  image: dhub.kubesre.xyz/appleboy/drone-ssh:1.6.4
  settings:
    # 部署主机的IP  11
    host: 47.94.90.251
    # 部署主机的登录账号,需从Drone中获取密钥名ssh_user的值,创建方式见下面
    username:
      from_secret: ssh_user
    # 部署主机的登录密码,需从Drone中获取密钥名ssh_pwd的值,创建方式见下面
    password:
      from_secret: ssh_pwd
    # 端口号
    port: 22
    # 设置超时
    command_timeout: 10m
    # 编写脚本,可根据具体情况编写
    script:
      - export PATH=$PATH:/usr/local/jdk1.8.0_401/bin
      # 进入宿主机的“/home/app”目录(注意:先在宿主机上创建app目录)
      - cd /home/app
      - # 检查 visitor JAR 是否在运行,并杀掉它
      - if ps -ef | grep "[u]center-0.0.1-SNAPSHOT.jar" | grep -v grep > /dev/null;
        then echo "ucenter process is running, killing it...";
        kill -9 $(ps -ef | grep "[u]center-0.0.1-SNAPSHOT.jar" |grep -v grep | awk '{print $2}');
        else
        echo "ucenter is not running";
        fi
      # 删除jar包,我测试的工程名是test
      # - rm -rf test.0.0.1-SNAPSHOT.jar
      # 将编译后的jar包复制到"/home/app"- cp /home/mvn/.m2/repository/com/crcc/ucenter/1.0.1/ucenter-1.0.1.jar .
      - nohup java -jar /home/app/ucenter-1.0.1.jar > /dev/null 2> /dev/null &
      # 执行"/home/app"下的脚本(注意:需要在“/home/app”目录下创建dayunhui.sh文件)
      #- sh dayunhui.sh restart
      #- nohup java -jar /home/app/dayunhui-0.0.1-SNAPSHOT.jar > /dev/null 2> /dev/null &


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

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

前端配置(未验证)
具体使用链接:简单使用gogs+drone搭建ci/cd自动化部署VUE代码

kind: pipeline
type: docker
name: build
steps:
- name: 编译文件
  image: node:10.16
  pull: if-not-exists # always never
  commands:
    - node -v
    - npm -v
    - yarn --version
    - yarn config set cache-folder .yarn-cache
    - yarn install
    - yarn run build

- name: 同步文件
  image: drillster/drone-rsync
  settings:
    user: root
    key:
      from_secret: ssh_key
    hosts:
      - 172.17.0.1
    # 来源项目目录
    source: ./dist/*
    # 目标服务器目录
    target: /www/wwwroot/www
    script:
      - cd /www/wwwroot/www
      - ls

 - name: 钉钉推送
   pull: if-not-exists # always never
   image: guoxudongdocker/drone-dingtalk
   settings:
     token:
       from_secret: dingding_token
     type: markdown
     message_color: true
     message_pic: true
     sha_link: true
   when:
     status: [failure, success]

(2)在Drone中设置宿主机的登录账号和密码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2 在Drone中配置Gogs的test仓库

(1)进入test仓库配置

在这里插入图片描述

(2)激活仓库

在这里插入图片描述

(3)配置仓库

在这里插入图片描述

4.3 测试项目

(1)配置Web钩子

注意:需要在Drone中配置完test仓库后,才会出现Web钩子的地址,否则地址为空。
点击”管理Web钩子“,按照如下配置,推送到Drone Server
在这里插入图片描述
测试主动推送
在这里插入图片描述

4.4 查看部署状态

(1)在Gogs中查看

在这里插入图片描述

(2)在Drone Server中查看

仓库的推送历史记录
在这里插入图片描述
Drone部署的执行过程如下:

在这里插入图片描述
发布完成
在这里插入图片描述

  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值