jenkins虽好,但是占用内存过大,发现drone轻量级的自动化部署工具,来尝试一下
先看结果 我是两台机子所以分开查看
使用docker stats drone-server drone-runner查看
docker stats myjenkins
相比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准备
1. 新建应用
2.创建应用
3.保存密钥信息
二:安装drone镜像
docker pull drone/drone:latest
docker pull drone/drone-runner-docker:latest
1. 生成共享密钥
openssl rand -hex 32
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
5.点击继续,授权
6. 注册登录
7. 进入控制台
8. 随便激活一个项目试一下
9. 部署开启选项
针对部署只用开启这个选项,其他的不用改,后面在学习
10. 点击保存
其实这里gitee中的webhook中就已经有这个地址了
11. 编写.drone.yml配置文件 ,文件放在项目的根目录与.git文件同级
默认git clone 代码的存放目录地址是 /drone/src,也就是src里面就是代码内容
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. 提交代码测试一下
ok 前端自动构建就算完成了
java构建其实也差不多