Drone 教程

Drone 相对于常见的 Jenkins,选中 Drone 的原因在于它非常简洁,不像 Jenkins 那样复杂,同时它拥有可以满足基本需求的能力,并且提供了许多实用的插件。
而且 Jenkins 包含了大量的图形化界面,虽然大而全,但是在有时候只想简单的做一个 CI 的容器时就显得有些笨重,本文简单的介绍使用 docker 搭建 drone 项目,并发布一个 SpringBoot 的 Java 项目。

Drone 文档给出了相对于不同git仓库和部署方式的方案,支持的git仓库有:GitHub,GitLab,Gitea,Gogs 等,本文使用 Gogs 仓库

使用 Docker 安装 Drone

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

docker pull drone/drone:2
docker pull drone/drone-runner-docker:1

Server:为 Drone 的管理提供了 Web 页面,用于管理从 Git 上获取的仓库中的流水线任务

Runner:一个单独的守护进程,会轮询 Server,获取需要执行的流水线任务,之后执行

安装 drone-server

sudo docker run \
  --volume=/home/cl/drone:/data \
  --env=DRONE_AGENTS_ENABLED=true \
  --env=DRONE_GOGS_SERVER=http://192.168.50.228:13000 \
  --env=DRONE_RPC_SECRET=rpc_secret \
  --env=DRONE_SERVER_HOST=192.168.50.228:3080 \
  --env=DRONE_SERVER_PROTO=http \
  --env=DRONE_USER_CREATE=username:chenglong,admin:true \
  --publish=3080:80 \
  --publish=443:443 \
  --restart=always \
  --detach=true \
  --name=drone \
  drone/drone:2

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 中注册好,否则在后面无法将仓库设置为Trusted

安装 drone-runner-docker

sudo docker run --detach \
  --volume=/var/run/docker.sock:/var/run/docker.sock \
  --env=DRONE_RPC_PROTO=http \
  --env=DRONE_RPC_HOST=192.168.50.228:3080 \
  --env=DRONE_RPC_SECRET=rpc_secret \
  --env=DRONE_RUNNER_CAPACITY=2 \
  --env=DRONE_RUNNER_NAME=docker-runner \
  --publish=3000:3000 \
  --restart=always \
  --name=runner \
  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中注册的账号),访问地址就是刚刚制定的 DRONE_SERVER_HOST 的地址。此时我们在Gogs中的项目会现在在列表中

点击项目后点击 Activate Repository

接下来我们需要对仓库进行设置,将仓库设置为 Trusted,最后点击SAVE按钮保存

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

这里要注意,现在 Gogs 的 WebHooks 是没有办法测试的,点击后会提示 io timeout,这是由于我们项目中还没有配置 .drone.yml 文件导致的,添加后即可正常调用

剩下的就是 .drone.yml 脚本的编写了,这个脚本要放在项目的根目录下,我这里简单的演示一下在项目的部署。

.drone.yml

kind: pipeline
type: docker
name: house-pipeline

steps:
  - name: build image
    image: maven:3-jdk-11
    volumes:
      - name: maven-cache
        path: /root/.m2/repository
      - name: maven-build
        path: /app/build
    commands:
      - mvn install -DskipTests=true -Dmaven.javadoc.skip=true
      - mv -f /drone/src/target/*.jar /app/build/house.jar

  - name: build-start
    image: appleboy/drone-ssh
    settings:
      host: 192.168.50.228
      username: cl
      password:
        from_secret: ssh_password
      port: 22
      command_timeout: 5m
      script:
        - cd /home/cl/maven-build
        - chmod +x run.sh
        - sh run.sh
volumes:
  - name: maven-cache
    host:
      path: /home/cl/repository
  - name: maven-build
    host:
      path: /home/cl/maven-build

run.sh

#!/bin/bash

source /etc/profile
nohup java -jar -Xmx1024M -Xms256M -Duser.timezone=GMT+8 house.jar --server.port=5188 > house.log 2>&1 &

注意 yml 的语法,使用空格而不是 Tab 可以减少看不见的错误
在使用 shell 脚本发布项目的时候,如果提示 java command not found,需要先执行一下 source 一下环境变量,这样就能正常使用了

简单解释一下 .drone.yml,具体的使用请参考官网 demo,这里不做详细说明

挂载容器的 /root/.m2/repository 和 /app/build 到宿主机,方便重复使用 .m2 仓库以及保存打包好的 jar 文件

使用 appleboy/drone-ssh 这个镜像远程到制定的服务器中,然后调用 shell 脚本发布项目

成果

配置好后,每当我提交代码到指定分支后,drone 就会帮我们自动部署项目啦。

posted @ 2022-02-26 10:10  LiuChengloong  阅读(3964)  评论(0编辑  收藏  举报