当前位置: 首页 > news >正文

Drone+gitee

在ubuntu22系统,搭建docker,并部署drone服务,配合Gitee实现轻量级的CI/CD操作

docker搭建

需要安装docker、docker-compose
需要配置docker的网络代理 重要


#更新系统包索引
sudo apt-get update#安装依赖包
sudo apt-get install ca-certificates curl gnupg lsb-release#添加 Docker 官方 GPG 密钥
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg#再次更新包索引
sudo apt-get update#安装 Docker Engine、CLI、Containerd 和 Docker Compose Plugin
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin#验证
docker --version
docker compose version#配置 Docker 网络代理
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf# 填入以下配置并保存
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:10808"
Environment="HTTPS_PROXY=http://127.0.0.1:10808"
Environment="NO_PROXY=localhost,127.0.0.1"#重新加载 systemd 配置并重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker#验证
sudo systemctl show --property=Environment docker

drone服务安装配置

需要下载启动drone镜像
增加compose跟.env文件
Gitee需要创建三方应用并获取CLINT ID、CLINT SECRET、用户名、linux系统生成RPC secret

docker-compose文件

# docker-compose
services:drone-server:image: drone/drone:2.28.2container_name: drone-serverports:- "8081:80"volumes:- ./drone-data:/data         # 数据持久化restart: alwaysenvironment:# Gitee OAuth 配置- DRONE_GITEE_CLIENT_ID=- DRONE_GITEE_CLIENT_SECRET=- DRONE_GITEE_SERVER=https://gitee.com- DRONE_SERVER_HOST=<你的drone服务网址>- DRONE_SERVER_PROTO=http #跟服务网址一样# RPC 通信密钥- DRONE_RPC_SECRET=# 用户管理- DRONE_USER_CREATE=username:<gitee用户名>,admin:true- DRONE_OPEN=true            # 允许新用户注册drone-runner:image: drone/drone-runner-docker:1container_name: drone-runnerrestart: alwaysdepends_on:- drone-servervolumes:- /var/run/docker.sock:/var/run/docker.sock   # 让 Runner 能启动容器environment:- DRONE_RPC_PROTO=http- DRONE_RPC_HOST=drone-server                # 同 compose 网络内通信- DRONE_RPC_SECRET=<对应drone-server中的RPC_SECRET>- DRONE_RUNNER_CAPACITY=2                    # 并发任务数

.env 文件(与 docker-compose.yml 同目录

# .env 文件
DRONE_GITEE_CLIENT_ID=
DRONE_GITEE_CLIENT_SECRET=
DRONE_SERVER_HOST=<drone服务网站的域名>
DRONE_SERVER_PROTO=http
DRONE_RPC_SECRET=
DRONE_ADMIN=

springboot应用配置

需要在项目根目录创建.drone.yml配置文件

.drone.yml

# ============================================  
# 管道基础配置  
# ============================================  # kind: 固定值,告诉 Drone 这是一个 CI/CD 管道  
kind: pipeline  # type: 执行引擎类型,docker 表示每个步骤在临时容器中运行  
type: docker  # name: 管道名称,会显示在 Drone UI 界面上  
name: first-drone  # ============================================  
# 步骤列表(按顺序执行)  
# ============================================  
steps:  # ---------- 第一步:编译打包 ----------  - name: build & package  # image: 使用哪个 Docker 镜像来运行此步骤  # maven:3.9-eclipse-temurin-21 包含: JDK 21 + Maven 3.9  # 容器环境与宿主机完全隔离,不受宿主机 JDK 版本影响  image: maven:3.9-eclipse-temurin-21  # commands: 在容器内依次执行的 shell 命令  commands:  # mvn clean package: 清理旧产物并打包成 jar      # -DskipTests: 跳过单元测试(因为你说不需要)  - mvn clean package -DskipTests  # mkdir -p: 创建共享目录(-p 表示父目录不存在时自动创建)  # /tmp/drone-jar: 用于在步骤间传递 jar 文件的临时目录  - mkdir -p /tmp/drone-jar  # cp: 复制生成的 jar 文件到共享目录  # target/*.jar: Maven 打包后 jar 文件的位置  # /tmp/drone-jar/app.jar: 目标位置,并重命名为 app.jar      - cp target/*.jar /tmp/drone-jar/app.jar  # volumes: 挂载目录(容器内路径 ↔ 宿主机路径)  volumes:  # name: maven-cache 对应下方 volumes 中定义的宿主机路径  # 作用: 缓存 Maven 依赖,下次构建不用重新下载  - name: maven-cache  # path: 容器内的路径  # /root/.m2 是 Maven 默认的本地仓库位置  path: /root/.m2  # name: jar-share 对应下方定义的宿主机路径  # 作用: 让 jar 文件能在步骤之间传递  - name: jar-share  path: /tmp/drone-jar  # when: 条件控制,满足条件时才执行此步骤  when:  # branch: 只监听特定分支  branch:  - main    # 推送到 main 分支时触发  - master  # 或推送到 master 分支时触发  # ---------- 第二步:部署到 Docker ----------  - name: deploy to docker  # image: alpine:latest 是一个极小 Linux 镜像(约 5MB)  # 为什么用 alpine?因为只需要运行 docker 命令,不需要完整操作系统  image: alpine:latest  environment:  HTTP_PROXY: http://192.168.255.1:10808  #可选网络代理配置HTTPS_PROXY: http://192.168.255.1:10808 #可选网络代理配置 commands:  # apk: alpine 的包管理器(类似 Ubuntu 的 apt)  # add docker-cli: 安装 Docker 命令行工具  # --no-cache: 不缓存包索引,减小镜像体积  - apk add --no-cache docker-cli  # docker stop: 停止正在运行的容器(如果存在)  # springboot-app: 容器名称  # || true: 如果容器不存在导致命令失败,也继续执行(不中断流水线)  - docker stop springboot-app || true  # docker rm: 删除容器(如果存在)  # 先停后删,保证每次都是全新启动  - docker rm springboot-app || true  # docker run: 启动新容器  # -d: 后台运行(detach 模式)  # --name springboot-app: 指定容器名称  # -p 8080:8080: 端口映射,宿主机 8080 → 容器 8080      # -v /tmp/drone-jar:/app: 挂载 jar 目录,宿主机目录 → 容器内 /app      # eclipse-temurin:21-jre: JDK 21 运行环境(精简版 JRE)  # java -jar /app/app.jar: 启动 Spring Boot 应用  - docker run -d --name springboot-app -p 8080:8086 -v /tmp/drone-jar:/app eclipse-temurin:21-jre java -jar /app/app.jar  volumes:  # name: docker-socket 对应下方定义的宿主机路径  # 作用: 让容器内的 docker 命令能控制宿主机的 Docker      - name: docker-socket  path: /var/run/docker.sock  # Docker 守护进程的接口文件  # name: jar-share 对应下方定义的宿主机路径  # 作用: 获取第一步生成的 jar 文件  - name: jar-share  path: /tmp/drone-jar  when:  branch:  - main  - master  # ============================================  
# 卷定义(把上面 steps 中用到的 name 映射到宿主机真实路径)  
# ============================================  
volumes:  # name: maven-cache 对应的宿主机路径  - name: maven-cache  host:  # 宿主机上的实际目录,可以随意指定  path: /tmp/drone-maven-cache  # name: docker-socket 对应的宿主机路径  - name: docker-socket  host:  # /var/run/docker.sock 是 Docker 的标准接口文件  # 挂载此文件后,容器内执行 docker 命令 = 宿主机执行  path: /var/run/docker.sock  # name: jar-share 对应的宿主机路径  - name: jar-share  host:  # 宿主机上的临时目录,用于步骤间传递 jar 文件  path: /tmp/drone-jar

结尾

完成之后 只需要push代码到主分支 gitee就会触发webhook给drone 然后触发.drone.yml中配置的流程

http://www.jsqmd.com/news/708122/

相关文章:

  • 从心理学到经济学:中介效应分析的‘前世今生’与在Python/R中的现代实践
  • Star 1.4k,开源 AI 小说工作台:多模型可接入,长篇创作不再遗忘上下文
  • AWS App Mesh服务网格:微服务治理的终极解决方案
  • 市面上的AI写作工具鱼龙混杂,有些只能帮你换个同义词,有些号称“一键生成”却满篇是幻觉。好写作AI凭借全流程覆盖的学术写作解决方案,正在成为越来越多科研人的首选。
  • 从电摩到共享单车:拆解4类电动两轮车BMS设计,聊聊TI BQ769x2的“降本增效”玩法
  • Hudson River Trading首届实习生名单曝光!奥赛、量化出身者成AI创业新贵
  • 【困难】公式字符串求值-Java
  • 别再只盯着波形了!HSPICE .option list与.model_info的隐藏用法,精准提取MOSFET模型参数
  • ROS小车/自动驾驶项目必备:手把手教你用socketcan_bridge和cantools打通CAN总线通信
  • XWPFTemplate动态表格填坑实录:当你的数据List里不仅有文字,还有图片和金额格式
  • 掌握Python处理DXF文件的5个关键技巧:ezdxf完全指南
  • 10分钟搞定!Degrees of Lewdity中文版完整安装与配置终极指南
  • 杭州力果公司geo优化系统效果如何? - GrowthUME
  • 游戏地图与CGAL:如何用2D三角网格生成技术优化你的地形系统(附C++/CGAL代码)
  • MySQL数据库安装教程
  • 别再死记硬背了!Allegro16.6封装命名规则与焊盘补偿实战(以DC座子为例)
  • Awesome Codex Skills中的文件组织器:保持工作空间整洁的自动化工具
  • 终极指南:如何用MouseClick实现跨平台鼠标自动化,告别重复点击烦恼
  • 如何快速上手Dantotsu:3分钟完成Anilist账号绑定与个性化设置
  • Particalground跨平台兼容性:桌面与移动端最佳实践指南
  • 造相-Z-Image-Turbo 批量生成与自动化:使用Python脚本管理队列任务
  • RAK空气质量开发套件:LoRaWAN物联网环境监测方案
  • RePKG深度解析:Wallpaper Engine资源包逆向工程与高级提取技术
  • cordova-sqlite-storage版本对比分析:如何选择最适合的插件版本
  • 逆向工程师的瑞士军刀:用r0capture一键抓取安卓App的WebSocket和Protobuf流量
  • 终极指南:如何用免费开源工具深度调试与超频控制AMD Ryzen处理器
  • CasRel开源大模型实操案例:某三甲医院临床指南知识图谱构建纪实
  • 杭州力果公司geo优化服务商怎么样 - GrowthUME
  • DNS解析过程详解:从域名到IP地址的完整转换指南
  • Xilinx GT收发器64B66B协议详解:块同步状态机与字节对齐实战指南