(替换jenkins)通过drone来自动化部署项目

741 阅读8分钟

jenkins虽好,但是占用内存过大,发现drone轻量级的自动化部署工具,来尝试一下

先看结果 我是两台机子所以分开查看

使用docker stats drone-server drone-runner查看 image.png docker stats myjenkins image.png

相比jenkins节约很多内存

drone-server(控制中心)

  • 核心大脑,负责:

  • Web 界面管理

  • 仓库配置存储

  • 流水线定义解析

  • 任务调度分配

  • 用户权限管理

  • 处理 Git 平台的 Webhook

  • 每个环境只需部署 1 个实例

drone-runner(执行引擎)

  • 分布式工作节点,负责:

  • 实际执行构建任务

  • 创建隔离的容器环境

  • 执行流水线步骤 (clone/build/test/deploy)

  • 实时上报日志和状态

  • 可横向扩展多个实例(支持 Docker/Kubernetes/SSH 等不同运行环境)

工作流程示例

graph LR
    Git平台 -->|Webhook| server
    server -->|分配任务| runner-docker
    runner-docker -->|执行构建| Docker守护进程
    runner-docker -->|上报状态| server

一:gitee准备

gitee.com/oauth/appli…

1. 新建应用

image.png

2.创建应用

image.png

3.保存密钥信息

image.png

二:安装drone镜像

docker pull drone/drone:latest 
docker pull drone/drone-runner-docker:latest
1. 生成共享密钥
openssl rand -hex 32

image.png

2. 创建docker-compose.yml文件

version: '3'  # Docker Compose 文件的版本,'3' 是较新的版本,适用于 Docker 17.06 及更高版本。

services:  # 定义多个服务
  drone-server:  # 定义 Drone 服务器(主服务)
    container_name: drone-server  # 容器名称,方便管理
    image: drone/drone:latest  # 使用 Drone 官方最新版本的镜像
    ports:
      - 18082:80  # 将宿主机的 18082 端口映射到容器的 80 端口,供外部访问
    volumes:
      - ./drone-data:/data  # 挂载数据目录,持久化 Drone 的配置信息和数据库
    environment:  # 配置环境变量
      - DRONE_LANG=zh-CN  # 设置 Drone 界面语言为中文(默认支持)
      # Gitee OAuth 应用的 Client ID(用于授权)
      - DRONE_GITEE_CLIENT_ID=9661854eef0b1a121b8216db03c577fdb631f8131c9b48eeca6d35ba5438b48a
      # Gitee OAuth 应用的 Client Secret(用于授权)
      - DRONE_GITEE_CLIENT_SECRET=0d48d1de3f2a72c9eb7177e95cec5fa6d4a853fae2cda9b7b0cb90ae4fc45b6a
      # Drone 服务器的公网访问地址(需要替换为实际的 IP 或域名)
      - DRONE_SERVER_HOST=117.72.47.219:18082
      # 服务器的通信协议,使用 HTTP(如果有 HTTPS 证书,可改为 `https`)
      - DRONE_SERVER_PROTO=http
      # 指定 Drone 使用 SQLite 作为数据库(适用于小型部署)
      - DRONE_DATABASE_DRIVER=sqlite3
      # SQLite 数据库存储路径,存放在 `/data/database.sqlite`
      - DRONE_DATABASE_DATASOURCE=/data/database.sqlite
      # Drone Server 和 Runner 之间的 RPC 认证密钥,需保持一致
      - DRONE_RPC_SECRET=1527e515919afb5729a1d1c05b6f3a485128cf1a1b27c1eeba8c874d0066094c
      # 创建默认管理员账户 `ming_super`,拥有管理员权限
      - DRONE_USER_CREATE=username:ming_super,admin:true
    restart: always  # 服务器异常退出后自动重启

  drone-runner-docker:  # 定义 Drone Runner(用于执行构建任务)
    container_name: drone-runner  # 容器名称
    image: drone/drone-runner-docker:latest  # 使用最新版本的 Drone Runner 镜像
    depends_on:
      - drone-server  # 依赖 drone-server 服务,确保其启动后再启动 Runner
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      # 挂载宿主机的 Docker 进程,允许 Runner 在宿主机上运行 Docker 容器
    environment:
      # Runner 通过 HTTP 连接到 Drone Server
      - DRONE_RPC_PROTO=http
      # 连接的 Drone Server 地址(容器内部访问)
      - DRONE_RPC_HOST=drone-server
      # 与 Drone Server 保持一致的 RPC 认证密钥
      - DRONE_RPC_SECRET=1527e515919afb5729a1d1c05b6f3a485128cf1a1b27c1eeba8c874d0066094c
      # 设置 Runner 的并发任务数上限(同时最多运行 2 个任务)
      - DRONE_RUNNER_CAPACITY=2
      # 设定 Drone 清理无用容器的时间间隔(10 分钟清理一次)
      - DRONE_REAPER_INTERVAL=10m
    restart: always  # 发生异常时自动重启

3.运行
docker-compose up -d
4.启动 http://ip:18082

image.png

5.点击继续,授权

image.png

6. 注册登录

image.png

7. 进入控制台

image.png

8. 随便激活一个项目试一下

image.png

9. 部署开启选项

针对部署只用开启这个选项,其他的不用改,后面在学习

image.png

10. 点击保存

image.png

其实这里gitee中的webhook中就已经有这个地址了

image.png

11. 编写.drone.yml配置文件 ,文件放在项目的根目录与.git文件同级

默认git clone 代码的存放目录地址是 /drone/src,也就是src里面就是代码内容 image.png

vue模板
# 声明这是一个Drone流水线配置
kind: pipeline
# 使用Docker执行器运行流水线
type: docker
# 流水线显示名称(在Web界面显示)
name: skr-oa
clone:  
  # 克隆分支
  branch: master
  # 默认路径
  path: /drone/src
# 全局环境变量
environment:
  WORKSPACE: /drone/src  # Drone默认克隆路径
steps:
  # 构建阶段开始
  - name: build  #🌟步骤名称(控制台可见)
    image: node:16.15.1-alpine  #🌟指定精确Node版本
    commands:  #🌟要执行的命令列表
      - npm install --force  # 强制安装依赖(解决peer依赖问题)
      - npm run build       # 执行项目构建
    volumes:  # 挂载卷配置
      - name: node-cache  # 引用已定义的卷
        path: /drone/src/node_modules  # 挂载到容器内的路径


  # # 部署阶段开始
  - name: to-nginx
    image: docker:cli  #🌟包含docker命令的官方镜像
    depends_on: [build]  #🌟确保在构建完成后执行
    volumes:
      - name: docker-sock  #🌟关键配置:挂载Docker套接字
        path: /var/run/docker.sock  # 容器内Docker连接路径
    commands:
      - docker cp /drone/src/dist nginx:/usr/share/nginx/html/  #🌟复制构建产物

volumes:  #🌟全局卷定义
  - name: node-cache
    host:   # 宿主机目录
      path: /root/docker/drone/drone-data/node-cache/skr-oa # 存储项目依赖文件,下次构建会快一点
  - name: docker-sock
    host:  #🌟映射宿主机路径
      path: /var/run/docker.sock  # 宿主机Docker套接字位置
java模板 使用的都是本地镜像,现在宿主机进行docker pull
kind: pipeline  # 声明 Drone CI/CD 的流水线
type: docker  # 使用 Docker 运行任务
name: build-and-deploy  # 流水线名称,方便管理

# 定义流水线的全局环境变量
environment:
  IMAGE_TAG: latest

  # 将所有模块的配置存储在一个环境变量中
  MODULE_TO_BUILD: oa-user-service   # 指定要构建的模块
  MODULE_PORT: 9002
  MODULE_PATH: sys-oa/oa-user-server

# 配置 Git 代码拉取方式
clone:
  image: drone/git:latest  # 使用本地缓存的 drone/git 镜像,避免重复拉取
  pull: if-not-exists  # 如果本地不存在才拉取 重新拉取 `drone/git:latest`,加快构建速度
  depth: 1  # 仅拉取最新的 commit,不获取完整的 Git 历史,减少拉取时间

steps:
  # 1. Maven 构建项目
  - name: build  # 步骤名称
    image: maven:3.8.8-eclipse-temurin-8  # 使用带 JDK 8 的 Maven 官方镜像
    pull: if-not-exists # 如果本地不存在才拉取
    volumes:
      - name: maven-cache  # 绑定 Maven 依赖缓存目录,避免重复下载
        path: /root/.m2/repository
    commands:
      - echo "开始构建项目:$MODULE_PATH"  # 输出日志,方便调试
      - mvn clean install -s /drone/src/settings.xml -pl $MODULE_PATH -am -amd -P prod -Dmaven.test.skip=true -ntp
        # 执行 Maven 构建:
        # - `clean install` 清理并编译安装项目
        # - `-s /drone/src/settings.xml` 使用指定的 Maven 配置文件(含国内镜像源)
        # - `-pl sys-oa/oa-user-server` 仅编译 `oa-user-server` 模块
        # - `-am -amd` 解决相关依赖模块
        # - `-P prod` 使用 `prod` 环境
        # - `-Dmaven.test.skip=true` 跳过测试,避免不必要的执行
        # - `-ntp` 关闭下载进度条,减少日志输出,提高可读性

  # 2️⃣ 构建 Docker 镜像
  - name: build-docker-image  # 步骤名称
    image: docker:dind  # 使用 `docker:dind` 允许在 Drone Runner 内部执行 Docker 命令
    pull: if-not-exists # 如果本地不存在才拉取
    volumes:
      - name: docker-sock  # 挂载 Docker 运行环境,使 Runner 可以管理 Docker
        path: /var/run/docker.sock
    commands:
      - echo "Building Docker image..."  # 输出日志,方便调试
      - cd /drone/src/$MODULE_PATH  # 进入需要构建 Docker 镜像的项目目录
      - docker build --pull=false -t $MODULE_TO_BUILD:$IMAGE_TAG .
        # 构建 Docker 镜像:
        # --pull=false 从本地获取from镜像
      # - `-t` 设定镜像名称和标签(如 `myapp:latest`)
      # - `.` 指定 Dockerfile 目录

  # 3️⃣ 运行 Docker 容器
  - name: deploy  # 步骤名称
    image: docker  # 运行 Docker 相关命令
    pull: if-not-exists # 如果本地不存在才拉取
    volumes:
      - name: docker-sock  # 挂载 Docker 运行环境,使 Runner 可以管理 Docker
        path: /var/run/docker.sock
    commands:
      - docker stop $MODULE_TO_BUILD || true
      # 停止已有的 `myapp` 容器(如果存在),防止端口冲突
      # `|| true` 避免容器不存在时报错
      - docker rm $MODULE_TO_BUILD || true
      # 删除旧的 `myapp` 容器,确保新版本可以运行
      - docker run -d --name $MODULE_TO_BUILD -p $MODULE_PORT:$MODULE_PORT $MODULE_TO_BUILD:$IMAGE_TAG
        # 启动新的 `myapp` 容器:
        # - `-d` 以后台模式运行
        # - `--name myapp` 设置容器名称
      # - `-p $PORT:$PORT` 端口映射
      # - `$IMAGE_NAME:$IMAGE_TAG` 指定镜像来源

  # 四 清理
  - name: clear  # 步骤名称
    image: docker  # 运行 Docker 相关命令
    pull: if-not-exists # 如果本地不存在才拉取
    volumes:
      - name: docker-sock  # 挂载 Docker 运行环境,使 Runner 可以管理 Docker
        path: /var/run/docker.sock
    commands:
      - docker image prune -f  # 删除所有悬挂(dangling)的 `<none>` 镜像
# 🗂️ 定义 Drone 构建过程中使用的本地存储卷
volumes:
  - name: maven-cache  # Maven 依赖缓存目录,避免重复下载
    host:
      path: /root/docker/drone/drone-data/maven-cache
  - name: docker-sock  # 允许 Drone Runner 直接控制宿主机的 Docker
    host:
      path: /var/run/docker.sock

在这里我遇到一个问题,就是没办法使用环境变量,例如使用

${WORKSPACE}/dist

程序运行的时候就读取不到WORKSPACE这个值,是个空值,输出出来是/dist,希望有大佬给指点一下

12. 提交代码测试一下

image.png

image.png

image.png

ok 前端自动构建就算完成了

java构建其实也差不多