技术文档收录
ASCII
Tcpdump
IPV4保留地址段
深入理解以太网网线原理 - 三帛的世界
Linux
WireGuard 一键安装脚本 | 秋水逸冰
SSH Config 那些你所知道和不知道的事 | Deepzz's Blog
Linux 让终端走代理的几种方法
ubuntu 20.04 server 版设置静态 IP 地址 - 链滴
Linux 挂载 Windows 共享磁盘的方法 - 技术学堂
将 SMB/CIFS 网络硬盘永久的挂载到 Ubuntu 上 - 简书
linux 获取当前脚本的绝对路径 | aimuke
[Linux] Linux 使用 / dev/urandom 生成随机数 - piaohua's blog
Linux 生成随机数的多种方法 | Just Do It
Linux 的 Centos7 版本下忘记 root 或者普通用户密码怎么办?
Git 强制拉取覆盖本地
SSH 安全加固指南 - FreeBuf 网络安全行业门户
Linux 系统安全强化指南 - FreeBuf 网络安全行业门户
Linux 入侵排查 - FreeBuf 网络安全行业门户
sshd_config 配置详解 - 简书
SSH 权限详解 - SegmentFault 思否
CentOS 安装 node.js 环境 - SegmentFault 思否
如何在 CentOS 7 上安装 Node.js 和 npm | myfreax
几款 ping tcping 工具总结
OpenVpn 搭建教程 | Jesse's home
openvpn 一键安装脚本 - 那片云
OpenVPN 解决 每小时断线一次 - 爱开源
OpenVPN 路由设置 – 凤曦的小窝
OpenVPN 设置非全局代理 - 镜子的记录簿
TinyProxy 使用帮助 - 简书
Ubuntu 下使用 TinyProxy 搭建代理 HTTP 服务器_Linux_运维开发网_运维开发技术经验分享
Linux 软件包管理工具 Snap 常用命令 - 简书
linux systemd 参数详解
Systemd 入门教程:命令篇 - 阮一峰的网络日志
记一次 Linux 木马清除过程
rtty:在任何地方通过 Web 访问您的终端
02 . Ansible 高级用法 (运维开发篇)
终于搞懂了服务器为啥产生大量的 TIME_WAIT!
巧妙的 Linux 命令,再来 6 个!
77% 的 Linux 运维都不懂的内核问题,这篇全告诉你了
运维工程师必备:请收好 Linux 网络命令集锦
一份阿里员工的 Java 问题排查工具单
肝了 15000 字性能调优系列专题(JVM、MySQL、Nginx and Tomcat),看不完先收
作业调度算法(FCFS,SJF,优先级调度,时间片轮转,多级反馈队列) | The Blog Of WaiterXiaoYY
看了这篇还不会 Linux 性能分析和优化,你来打我
2019 运维技能风向标
更安全的 rm 命令,保护重要数据
求你了,别再纠结线程池大小了!
Linux sudo 详解 | 失落的乐章
重启大法好!线上常见问题排查手册
sudo 使用 - 笨鸟教程的博客 | BY BenderFly
shell 在手分析服务器日志不愁? - SegmentFault 思否
sudo 与 visudo 的超细用法说明_陈发哥 007 的技术博客_51CTO 博客
ESXI 下无损扩展 Linux 硬盘空间 | Naonao Blog
Linux 学习记录:su 和 sudo | Juntao Tan 的个人博客
使用者身份切换 | Linux 系统教程(笔记)
你会使用 Linux 编辑器 vim 吗?
在 Windows、Linux 和 Mac 上查看 Wi-Fi 密码
linux 隐藏你的 crontab 后门 - 简书
Linux 定时任务详解 - Tr0y's Blog
linux 的 TCP 连接数量最大不能超过 65535 个吗,那服务器是如何应对百万千万的并发的?_一口 Linux 的博客 - CSDN 博客_tcp 连接数多少正常
万字长文 + 28 张图,一次性说清楚 TCP,运维必藏
为什么 p2p 模式的 tunnel 底层通常用 udp 而不是 tcp?
记一次服务器被入侵挖矿 - tlanyan
shell 判断一个变量是否为空方法总结 - 腾讯云开发者社区 - 腾讯云
系统安装包管理工具 | Escape
编译代码时动态地链接库 - 51CTO.COM
甲骨文 Oracle Cloud 添加新端口开放的方法 - WirelessLink 社区
腾讯云 Ubuntu 添加 swap 分区的方法_弓弧名家_玄真君的博客 - CSDN 博客
Oracle 开放全部端口并关闭防火墙 - 清~ 幽殇
谁再说不熟悉 Linux 命令, 就把这个给他扔过去!
即插即用,运维工程师必会正则表达式大全
Shell脚本编写及常见面试题
Samba 文件共享服务器
到底一台服务器上最多能创建多少个 TCP 连接 | plantegg
SSH 密钥登录 - SSH 教程 - 网道
在 Bash 中进行 encodeURIComponent/decodeURIComponent | Harttle Land
使用 Shell 脚本来处理 JSON - Tom CzHen's Blog
Docker
「Docker」 - 保存镜像 - 知乎
终于可以像使用 Docker 一样丝滑地使用 Containerd 了!
私有镜像仓库选型:Harbor VS Quay - 乐金明的博客 | Robin Blog
exec 与 entrypoint 使用脚本 | Mr.Cheng
Dockerfile 中的 CMD 与 ENTRYPOINT
使用 Docker 配置 MySQL 主从数据库 - 墨天轮
Alpine vs Distroless vs Busybox – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
再见,Docker!
docker save 与 docker export 的区别 - jingsam
如何优雅的关闭容器
docker 储存之 tmpfs 、bind-mounts、volume | 陌小路的个人博客
Dockerfile 中 VOLUME 与 docker -v 的区别是什么 - 开发技术 - 亿速云
理解 docker 容器的退出码 | Vermouth | 博客 | docker | k8s | python | go | 开发
【Docker 那些事儿】容器监控系统,来自 Docker 的暴击_飞向星的客机的博客 - CSDN 博客
【云原生】Docker 镜像详细讲解_微枫 Micromaple 的博客 - CSDN 博客_registry-mirrors
【云原生】Helm 架构和基础语法详解
CMD 和 Entrypoint 命令使用变量的用法
实时查看容器日志 - 苏洋博客
Traefik 2 使用指南,愉悦的开发体验 - 苏洋博客
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
【云原生】镜像构建实战操作(Dockerfile)
Docker Compose 中的 links 和 depends_on 的区别 - 编程知识 - 白鹭情
Python
Pipenv:新一代Python项目环境与依赖管理工具 - 知乎
Python list 列表实现栈和队列
Python 各种排序 | Lesley's blog
Python 中使用 dateutil 模块解析时间 - SegmentFault 思否
一个小破网站,居然比 Python 官网还牛逼
Python 打包 exe 的王炸 - Nuitka
Django - - 基础 - - Django ORM 常用查询语法及进阶
[Python] 小知識:== 和 is 的差異 - Clay-Technology World
Window
批处理中分割字符串 | 网络进行时
Windows 批处理基础命令学习 - 简书
在Windows上设置WireGuard
Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
windows 重启 rdpclip.exe 的脚本
中间件
Nginx 中的 Rewrite 的重定向配置与实践
RabbitMQ 的监控
RabbitMq 最全的性能调优笔记 - SegmentFault 思否
为什么不建议生产用 Redis 主从模式?
高性能消息中间件——NATS
详解:Nginx 反代实现 Kibana 登录认证功能
分布式系统关注点:仅需这一篇,吃透 “负载均衡” 妥妥的
仅需这一篇,妥妥的吃透” 负载均衡”
基于 nginx 实现上游服务器动态自动上下线——不需 reload
Nginx 学习书单整理
最常见的日志收集架构(ELK Stack)
分布式之 elk 日志架构的演进
CAT 3.0 开源发布,支持多语言客户端及多项性能提升
Kafka 如何做到 1 秒处理 1500 万条消息?
Grafana 与 Kibana
ELK 日志系统之通用应用程序日志接入方案
ELK 简易 Nginx 日志系统搭建: ElasticSearch+Kibana+Filebeat
记一次 Redis 连接池问题引发的 RST
把 Redis 当作队列来用,你好大的胆子……
Redis 最佳实践:业务层面和运维层面优化
Redis 为什么变慢了?常见延迟问题定位与分析
好饭不怕晚,扒一下 Redis 配置文件的底 Ku
rabbitmq 集群搭建以及万级并发下的性能调优
别再问我 Redis 内存满了该怎么办了
Nginx 状态监控及日志分析
uWSGI 的安装及配置详解
uwsgi 异常服务器内存 cpu 爆满优化思路
Uwsgi 内存占用过多 - 简书
Nginx 的 limit 模块
Nginx 内置模块简介
Redis 忽然变慢了如何排查并解决?_redis_码哥字节_InfoQ 写作社区
领导:谁再用 redis 过期监听实现关闭订单,立马滚蛋!
Nginx 限制 IP 访问频率以及白名单配置_问轩博客
Nginx $remote_addr 和 $proxy_add_x_forwarded_for 变量详解
Caddy 部署实践
一文搞定 Nginx 限流
数据库
SqlServer 将数据库中的表复制到另一个数据库_MsSql_脚本之家
SQL Server 数据库同步,订阅、发布、复制、跨服务器
sql server 无法删除本地发布 | 辉克's Blog
SQLite全文检索
SQL 重复记录查询的几种方法 - 简书
SQL SERVER 使用订阅发布同步数据库(转)
Mysql 查看用户连接数配置及每个 IP 的请求情况 - 墨天轮
优化 SQL 的 21 条方案
SQL Server 连接时好时坏的奇怪问题
MS SQL 执行大脚本文件时,提示 “内存不足” 的解决办法 - 阿里云开发者社区
防火墙-iptables
iptables 常用规则:屏蔽 IP 地址、禁用 ping、协议设置、NAT 与转发、负载平衡、自定义链
防火墙 iptables 企业防火墙之 iptables
Linux 防火墙 ufw 简介
在 Ubuntu 中用 UFW 配置防火墙
在 Ubuntu20.04 上怎样使用 UFW 配置防火墙 - 技术库存网
监控类
开箱即用的 Prometheus 告警规则集
prometheus☞搭建 | zyh
docker 部署 Prometheus 监控服务器及容器并发送告警 | chris'wang
PromQL 常用命令 | LRF 成长记
prometheus 中使用 python 手写 webhook 完成告警
持续集成CI/CD
GitHub Actions 的应用场景 | 记录干杯
GithubActions · Mr.li's Blog
工具类
GitHub 中的开源网络广告杀手,十分钟快速提升网络性能
SSH-Auditor:一款 SHH 弱密码探测工具
别再找了,Github 热门开源富文本编辑器,最实用的都在这里了 - srcmini
我最喜欢的 CLI 工具
推荐几款 Redis 可视化工具
内网代理工具与检测方法研究
环境篇:数据同步工具 DataX
全能系统监控工具 dstat
常用 Web 安全扫描工具合集
给你一款利器!轻松生成 Nginx 配置文件
教程类
Centos7 搭建神器 openvpn | 运维随笔
搭建 umami 收集个人网站统计数据 | Reorx’s Forge
openvpn安装教程
基于 gitea+drone 完成小团队的 CI/CD - 德国粗茶淡饭
将颜色应用于交替行或列
VMware Workstation 全系列合集 精简安装注册版 支持 SLIC2.6、MSDM、OSX 更新 16.2.3_虚拟机讨论区_安全区 卡饭论坛 - 互助分享 - 大气谦和!
在 OpenVPN 上启用 AD+Google Authenticator 认证 | 运维烂笔头
Github 进行 fork 后如何与原仓库同步:重新 fork 很省事,但不如反复练习版本合并 · Issue #67 · selfteaching/the-craft-of-selfteaching
卧槽,VPN 又断开了!!- 阿里云开发者社区
Grafana Loki 学习之踩坑记
zerotier 的 planet 服务器(根服务器)的搭建踩坑记。无需 zerotier 官网账号。
阿里云 qcow2 镜像转 vmdk,导入 ESXi - 唐际忠的博客
Caddy 入门 – 又见杜梨树
【Caddy2】最新 Caddy2 配置文件解析 - Billyme 的博客
Web 服务器 Caddy 2 | Haven200
手把手教你打造高效的 Kubernetes 命令行终端
Keras 作者:给软件开发者的 33 条黄金法则
超详细的网络抓包神器 Tcpdump 使用指南
使用 fail2ban 和 FirewallD 黑名单保护你的系统
linux 下 mysql 数据库单向同步配置方法分享 (Mysql)
MySQL 快速删除大量数据(千万级别)的几种实践方案
GitHub 上的优质 Linux 开源项目,真滴牛逼!
WireGuard 教程:使用 Netmaker 来管理 WireGuard 的配置 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Tailscale 基础教程:Headscale 的部署方法和使用教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang | 云原生
Nebula Graph 的 Ansible 实践
改进你的 Ansible 剧本的 4 行代码
Caddy 2 快速简单安装配置教程 – 高玩梁的博客
切换至 Caddy2 | 某不科学的博客
Caddy2 简明教程 - bleem
树莓派安装 OpenWrt 突破校园网限制 | Asttear's Blog
OpenVPN 路由设置 – 凤曦的小窝
个性化编译 LEDE 固件
盘点各种 Windows/Office 激活工具
[VirtualBox] 1、NAT 模式下端口映射
VirtualBox 虚拟机安装 openwrt 供本机使用
NUC 折腾笔记 - 安装 ESXi 7 - 苏洋博客
锐捷、赛尔认证 MentoHUST - Ubuntu 中文
How Do I Use A Client Certificate And Private Key From The IOS Keychain? | OpenVPN
比特记事簿: 笔记: 使用电信 TR069 内网架设 WireGuard 隧道异地组网
利用 GitHub API 获取最新 Releases 的版本号 | 这是只兔子
docsify - 生成文档网站简单使用教程 - SegmentFault 思否
【干货】Chrome 插件 (扩展) 开发全攻略 - 好记的博客
一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
【计算机网络】了解内网、外网、宽带、带宽、流量、网速_墩墩分墩 - CSDN 博客
mac-ssh 配置 | Sail
如何科学管理你的密码
VirtualBox NAT 端口映射实现宿主机与虚拟机相互通信 | Shao Guoliang 的博客
CentOS7 配置网卡为静态 IP,如果你还学不会那真的没有办法了!
laisky-blog: 近期折腾 tailscale 的一些心得
使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书 · Ruby China
acme 申请 Let’s Encrypt 泛域名 SSL 证书
从 nginx 迁移到 caddy
使用 Caddy 替代 Nginx,全站升级 https,配置更加简单 - Diamond-Blog
http.proxy - Caddy 中文文档
动手撸个 Caddy(二)| Caddy 命令行参数最全教程 | 飞雪无情的总结
Caddy | 学习笔记 - ijayer
Caddy 代理 SpringBoot Fatjar 应用上传静态资源
使用 graylog3.0 收集 open××× 日志进行审计_年轻人,少吐槽,多搬砖的技术博客_51CTO 博客
提高国内访问 github 速度的 9 种方法! - SegmentFault 思否
VM16 安装 macOS 全网最详细
2022 目前三种有效加速国内 Github
How to install MariaDB on Alpine Linux | LibreByte
局域网内电脑 - ipad 文件共享的三种方法 | 岚
多机共享键鼠软件横向测评 - 尚弟的小笔记
VLOG | ESXI 如何升级到最新版,无论是 6.5 还是 6.7 版本都可以顺滑升级。 – Vedio Talk - VLOG、科技、生活、乐分享
远程修改 ESXi 6.7 管理 IP 地址 - 腾讯云开发者社区 - 腾讯云
几乎不要钱自制远程 PLC 路由器方案
traefik 简易入门 | 个人服务器运维指南 | 山月行
更完善的 Docker + Traefik 使用方案 - 苏洋博客
MicroSD·TF 卡终极探秘 ·MLC 颗粒之谜 1 三星篇_microSD 存储卡_什么值得买
macOS 绕过公证和应用签名方法 - 走客
MiscSecNotes / 内网端口转发及穿透. md at master · JnuSimba/MiscSecNotes
我有特别的 DNS 配置和使用技巧 | Sukka's Blog
SEO:初学者完整指南
通过 OpenVPN 实现流量审计
OpenVPN-HOWTO
OpenVPN Server · Devops Roadmap
Linux 运维必备的 13 款实用工具, 拿好了~
linux 平台下 Tomcat 的安装与优化
Linux 运维跳槽必备的 40 道面试精华题
Bash 脚本进阶,经典用法及其案例 - alonghub - 博客园
推荐几个非常不错的富文本编辑器 - 走看看
在 JS 文件中加载 JS 文件的方法 - 月光博客
#JavaScript 根据需要动态加载脚本并设置自定义参数
笔记本电脑 BIOS 修改及刷写教程
跨平台加密 DNS 和广告过滤 personalDNSfilter · LinuxTOY
AdGuard Home 安装及使用指北
通过 Amazon S3 协议挂载 OSS
记一次云主机如何挂载对象存储
本文档发布于https://mrdoc.fun
-
+
首页
基于 gitea+drone 完成小团队的 CI/CD - 德国粗茶淡饭
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.ctq6.cn](https://www.ctq6.cn/gitea_drone/) 持续集成和构建的工具有很多,除了著名的 Jenkins,Travis,CircleCI,还有最近比较热门的 Github Action 和 Gitlab CI/CD。但是这些工具面对私人项目不是要收费就是占用大量服务器资源,作为个人开发者的私人项目如果想要使用并不友好。那么开源免费的 Drone CI 是个不错选择,它不但非常轻量,而且十分强大。并可以结合私有代码仓库自动编译、构建服务,几行脚本即可实现自动化部署。本文讲述 Drone CI 的具体实践,结合 Gitea,怎么在 VPS 里从零开始搭建一个基于 Gitea + Drone CI 的持续集成系统。 Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证 Gitea 的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。采用 Go 作为后端语言,只要生成一个可执行程序即可。并且他还支持跨平台,支持 Linux, macOS 和 Windows 以及各种架构,除了 x86,amd64,还包括 ARM 和 PowerPC. ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACbklEQVRoQ+2aMU4dMRCGZw6RC1CSSyQdLZJtKQ2REgoiRIpQkCYClCYpkgIESQFIpIlkW+IIcIC0gUNwiEFGz+hlmbG9b1nesvGW++zxfP7H4/H6IYzkwZFwQAUZmpJVkSeniFJKA8ASIi7MyfkrRPxjrT1JjZ8MLaXUDiJuzwngn2GJaNd7vyP5IoIYY94Q0fEQIKIPRGS8947zSQTRWh8CwLuBgZx479+2BTkHgBdDAgGAC+fcywoyIFWqInWN9BSONbTmFVp/AeA5o+rjKRJ2XwBYRsRXM4ZXgAg2LAPzOCDTJYQx5pSIVlrC3EI45y611osMTHuQUPUiYpiVooerg7TWRwDAlhSM0TuI+BsD0x4kGCuFSRVzSqkfiLiWmY17EALMbCAlMCmI6IwxZo+INgQYEYKBuW5da00PKikjhNNiiPGm01rrbwDwofGehQjjNcv1SZgddALhlJEgwgJFxDNr7acmjFLqCyJuTd6LEGFttpmkYC91Hrk3s1GZFERMmUT01Xv/sQljjPlMRMsxO6WULwnb2D8FEs4j680wScjO5f3vzrlNJszESWq2LYXJgTzjZm56MCHf3zVBxH1r7ftU1splxxKYHEgoUUpTo+grEf303rPH5hxENJqDKQEJtko2q9zGeeycWy3JhpKhWT8+NM/sufIhBwKI+Mta+7pkfxKMtd8Qtdbcx4dUQZcFCQ2I6DcAnLUpf6YMPxhIDDOuxC4C6djoQUE6+tKpewWZ1wlRkq0qUhXptKTlzv93aI3jWmE0Fz2TeujpX73F9TaKy9CeMk8vZusfBnqZ1g5GqyIdJq+XrqNR5AahKr9CCcxGSwAAAABJRU5ErkJggg==) **Gitea 功能特性** * 支持活动时间线 * 支持 SSH 以及 HTTP/HTTPS 协议 * 支持 SMTP、LDAP 和反向代理的用户认证 * 支持反向代理子路径 * 支持用户、组织和仓库管理系统 * 支持添加和删除仓库协作者 * 支持仓库和组织级别 Web 钩子(包括 Slack 集成) * 支持仓库 Git 钩子和部署密钥 * 支持仓库工单(Issue)、合并请求(Pull Request)以及 Wiki * 支持迁移和镜像仓库以及它的 Wiki * 支持在线编辑仓库文件和 Wiki * 支持自定义源的 Gravatar 和 Federated Avatar * 支持邮件服务 * 支持后台管理面板 * 支持 MySQL、PostgreSQL、SQLite3、MSSQL 和 TiDB(MySQL) 数据库 * 支持多语言本地化(21 种语言) Drone 是一款基于 Docker 的 CI/CD 工具,所有编译、测试、发布的流程都在 Docker 容器中进行. 开发者只需在项目中包含 .drone.yml 文件,将代码推送到 git 仓库,Drone 就能够自动化的进行编译、测试、发布。 ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACbklEQVRoQ+2aMU4dMRCGZw6RC1CSSyQdLZJtKQ2REgoiRIpQkCYClCYpkgIESQFIpIlkW+IIcIC0gUNwiEFGz+hlmbG9b1nesvGW++zxfP7H4/H6IYzkwZFwQAUZmpJVkSeniFJKA8ASIi7MyfkrRPxjrT1JjZ8MLaXUDiJuzwngn2GJaNd7vyP5IoIYY94Q0fEQIKIPRGS8947zSQTRWh8CwLuBgZx479+2BTkHgBdDAgGAC+fcywoyIFWqInWN9BSONbTmFVp/AeA5o+rjKRJ2XwBYRsRXM4ZXgAg2LAPzOCDTJYQx5pSIVlrC3EI45y611osMTHuQUPUiYpiVooerg7TWRwDAlhSM0TuI+BsD0x4kGCuFSRVzSqkfiLiWmY17EALMbCAlMCmI6IwxZo+INgQYEYKBuW5da00PKikjhNNiiPGm01rrbwDwofGehQjjNcv1SZgddALhlJEgwgJFxDNr7acmjFLqCyJuTd6LEGFttpmkYC91Hrk3s1GZFERMmUT01Xv/sQljjPlMRMsxO6WULwnb2D8FEs4j680wScjO5f3vzrlNJszESWq2LYXJgTzjZm56MCHf3zVBxH1r7ftU1splxxKYHEgoUUpTo+grEf303rPH5hxENJqDKQEJtko2q9zGeeycWy3JhpKhWT8+NM/sufIhBwKI+Mta+7pkfxKMtd8Qtdbcx4dUQZcFCQ2I6DcAnLUpf6YMPxhIDDOuxC4C6djoQUE6+tKpewWZ1wlRkq0qUhXptKTlzv93aI3jWmE0Fz2TeujpX73F9TaKy9CeMk8vZusfBnqZ1g5GqyIdJq+XrqNR5AahKr9CCcxGSwAAAABJRU5ErkJggg==) * 功能灵活强大:构建、测试、发布、部署,你想干什么都可以,一套系统全搞定 * 兼容性好:支持所有 SCM、所有平台、所有语言 * 环境部署简单:原生支持 Docker 容器,启动两个容器就完成了部署,其它构建、测试、部署工具在使用时会自动从 docker 仓库拉取 * 扩展性强:强大的插件系统,丰富的插件可以免费使用,也可以自定义 * 配置简单:正如官方宣传的那样,“configuration as a code”,所有功能、步骤、工具、命令,一个 yaml 配置文件全搞定 * 维护简单:直接复用 SCM 的账号体系和权限管理,无需注册用户、分配权限 1、首先到各大公有云厂商提供的云平台上购买对应的机器,配置可以选择 1 核 2g,或者 2 核 2g,不需要购买太大的配置。 2、机器开通完成后,部署 docker 环境,可以选择手动部署,或者使用 Ansible 脚本部署,本次使用 Ansible 部署,部署脚本如下:(docker-install.yaml) ``` --- - name: Remove Docker system yum: name: - docker-client - docker-client-latest - docker-common - docker-latest - docker-latest-logrotate - docker-logrotate - docker-selinux - docker-engine-selinux - docker-engine state: absent tags: - cicd - docker_remove - name: Remove Docker files shell: | rm -rf /etc/systemd/system/docker.service.d rm -rf /var/lib/docker rm -rf /var/run/docke rm -rf /etc/docker tags: - cicd - docker_remove - name: Install Docker yum yum: name: - yum-utils - device-mapper-persistent-data - lvm2 state: present tags: - cicd - docker_install - name: Install yum manager shell: | yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo tags: - cicd - docker_install - name: Install Docker yum: name: docker-ce state: present tags: - cicd - docker_install - name: Configure Docker for files file: path: "{{ item }}" state: directory with_items: - /etc/docker - /etc/systemd/system/docker.service.d tags: - cicd - docker_install - name: Configure Docker for config template: src: "{{ item.name }}" dest: "{{ item.dest }}" loop: - { name: "daemon.json.j2", dest: "/etc/docker/daemon.json" } - { name: "docker.service.j2", dest: "/usr/lib/systemd/system/docker.service" } tags: - cicd - docker_install - name: Started Docker systemd: name: docker enabled: yes state: started tags: - cicd - docker_install - name: Install Docker-Compose environment: DOCKER_COMPOSE_VERSION: 1.25.0-rc2 shell: | curl -L https://get.daocloud.io/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose tags: - cicd - docker_install - name: Install Docker Swarm shell: docker swarm init --advertise-addr {{ groups['pankuibo'][0] }} tags: - cicd - docker_install ``` 3、安装 docker 环境,由于本次 Ansible 为剧本形式,所以执行如下命令来安装 docker: ``` ansible-playbook --inventory-file='./../inventory/inventory.ini' ./deploy.yml -e target='test' --tags='docker_remove,docker_install,docker_compose' --forks=5 --user='root' ``` **这里说明一下:** 1、由于定义了不同的 tags,来执行不同的操作 2、部署文件、主机文件、角色文件单独分开,更加灵活方便 Gitea 在其 Docker Hub 组织内提供自动更新的 Docker 镜像。可以始终使用最新的稳定标签或使用其他服务来更新 Docker 镜像,安装的配置文件如下 (docker-compose-gitea.yaml): ``` version: "3.8" services: gitea: image: gitea/gitea:1.16.5 environment: - USER_UID=1000 - USER_GID=1000 - DB_TYPE=mysql - DB_HOST=localhost:3306 - DB_NAME=gitea - DB_USER=gitea - SSH_PORT=2224 volumes: - /data/gitea:/data - /etc/localtime:/etc/localtime:ro ports: - "3000:3000" - "2224:2224" networks: - "default" deploy: mode: replicated replicas: 1 labels: - "traefik.enable=true" - "traefik.docker.network=default" - "traefik.http.services.gitea_gitea.loadbalancer.server.port=3000" # http 80 - "traefik.http.routers.gitea.rule=Host(`gitea.localhost.com`)" - "traefik.http.routers.gitea.entrypoints=web" placement: constraints: [node.role == manager] restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s networks: default: external: name: traefik_default ``` 由于依赖于数据库,所以需要先安装 Mysql 服务到环境中,使用 Mysql 的安装配置文件如下 (docker-compose-mysql.yaml) ``` version: "3.8" services: mysql: image: mysql:5.7.37 environment: - MYSQL_ROOT_PASSWORD=PWD command: --default-authentication-plugin=mysql_native_password volumes: - /data/mysql:/var/lib/mysql - /etc/localtime:/etc/localtime:ro ports: - "3306:3306" networks: - "default" deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s networks: default: external: name: traefik_default ``` 要基于 docker-compose 启动 gitea,请执行 docker-compose up -d,以在后台启动 Gitea。使用 docker-compose ps 将显示 Gitea 是否正确启动。可以使用 docker-compose logs 查看日志。 要停止 gitea,请执行 docker-compose down。这将停止并杀死容器。这些卷将仍然存在。 本次使用如下命令来安装 Gitea,目前环境中使用 Docker Swarm 集群,所以使用如下命令安装即可,关于 Docker Swarm 的使用说明可以参照 [Docker Swarm 使用说明](https://www.ctq6.cn/dockerswarm%E5%AE%9E%E8%B7%B5%E5%8F%8A%E5%8E%9F%E7%90%86/) ``` 1、docker stack deploy -c docker-compose-mysql.yaml mysql 2、docker stack deploy -c docker-compose-gitea.yaml gitea ``` 以上设置中 Gitea 的端口号为 3000,因此本地环境浏览器进入 localhost:3000 即可访问页面,建议配置域名和 Nginx 或 Caddy 反向代理访问。本次使用的代理组件是 traefik 代理,更多关于 traefik 的使用说明请参考 [traefik 使用说明](https://www.ctq6.cn/traefikingressroute%E9%85%8D%E7%BD%AE/) 要将 Gitea 与 MySQL 数据库结合使用,请将这些更改应用于上面创建的 docker-compose-gitea.yaml 文件 ``` version: "3.8" services: gitea: image: gitea/gitea:1.16.5 environment: + - DB_TYPE=mysql + - DB_HOST=localhost:3306 + - DB_NAME=gitea + - DB_USER=gitea ``` * APP_NAME:“Gitea: Git with a cup of tea”:应用程序名称,在页面标题中使用。 * RUN_MODE:prod:应用程序运行模式,会影响性能和调试。“dev”,“prod"或"test”。 * DOMAIN:localhost:此服务器的域名,用于 Gitea UI 中显示的 http 克隆 URL。 * SSH_DOMAIN:localhost:该服务器的域名,用于 Gitea UI 中显示的 ssh 克隆 URL。如果启用了安装页面,则 SSH 域服务器将采用以下形式的 DOMAIN 值(保存时将覆盖此设置)。 * SSH_PORT:22:克隆 URL 中显示的 SSH 端口。 * SSH_LISTEN_PORT:%(SSH_PORT)s:内置 SSH 服务器的端口。 * DISABLE_SSH:false:如果不可用,请禁用 SSH 功能。如果要禁用 SSH 功能,则在安装 Gitea 时应将 - SSH 端口设置为 0。 * HTTP_PORT:3000:HTTP 监听端口。 * ROOT_URL:"":覆盖自动生成的公共 URL。如果内部 URL 和外部 URL 不匹配(例如在 Docker 中),这很有用。 * LFS_START_SERVER:false:启用 git-lfs 支持。 * DB_TYPE:sqlite3:正在使用的数据库类型 [mysql,postgres,mssql,sqlite3]。 * DB_HOST:localhost:3306:数据库主机地址和端口。 * DB_NAME:gitea:数据库名称。 * DB_USER:root:数据库用户名。 * DB_PASSWD:"” :数据库用户密码。如果您在密码中使用特殊字符,请使用 “您的密码” 进行引用。 * INSTALL_LOCK:false:禁止访问安装页面。 * SECRET_KEY:"" :全局密钥。这应该更改。如果它具有一个值并且 INSTALL_LOCK 为空,则 INSTALL_LOCK 将自动设置为 true。 * DISABLE_REGISTRATION:false:禁用注册,之后只有管理员才能为用户创建帐户。 * REQUIRE_SIGNIN_VIEW:false:启用此选项可强制用户登录以查看任何页面。 * USER_UID:1000:在容器内运行 Gitea 的用户的 UID(Unix 用户 ID)。如果使用主机卷,则将其与 /data - 卷的所有者的 UID 匹配(对于命名卷,则不需要这样做)。 * USER_GID:1000:在容器内运行 Gitea 的用户的 GID(Unix 组 ID)。如果使用主机卷,则将其与 /data 卷的所有者的 GID 匹配(对于命名卷,则不需要这样做) 创建一个 Gitea 的 OAuth2 应用程序,“客户端 ID”和 “客户端密钥” 用于授权访问 Gitea 的资源。 重定向 URI 配置必须按照下面示例的格式和路径,并且必须是真实存在的 ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACbklEQVRoQ+2aMU4dMRCGZw6RC1CSSyQdLZJtKQ2REgoiRIpQkCYClCYpkgIESQFIpIlkW+IIcIC0gUNwiEFGz+hlmbG9b1nesvGW++zxfP7H4/H6IYzkwZFwQAUZmpJVkSeniFJKA8ASIi7MyfkrRPxjrT1JjZ8MLaXUDiJuzwngn2GJaNd7vyP5IoIYY94Q0fEQIKIPRGS8947zSQTRWh8CwLuBgZx479+2BTkHgBdDAgGAC+fcywoyIFWqInWN9BSONbTmFVp/AeA5o+rjKRJ2XwBYRsRXM4ZXgAg2LAPzOCDTJYQx5pSIVlrC3EI45y611osMTHuQUPUiYpiVooerg7TWRwDAlhSM0TuI+BsD0x4kGCuFSRVzSqkfiLiWmY17EALMbCAlMCmI6IwxZo+INgQYEYKBuW5da00PKikjhNNiiPGm01rrbwDwofGehQjjNcv1SZgddALhlJEgwgJFxDNr7acmjFLqCyJuTd6LEGFttpmkYC91Hrk3s1GZFERMmUT01Xv/sQljjPlMRMsxO6WULwnb2D8FEs4j680wScjO5f3vzrlNJszESWq2LYXJgTzjZm56MCHf3zVBxH1r7ftU1splxxKYHEgoUUpTo+grEf303rPH5hxENJqDKQEJtko2q9zGeeycWy3JhpKhWT8+NM/sufIhBwKI+Mta+7pkfxKMtd8Qtdbcx4dUQZcFCQ2I6DcAnLUpf6YMPxhIDDOuxC4C6djoQUE6+tKpewWZ1wlRkq0qUhXptKTlzv93aI3jWmE0Fz2TeujpX73F9TaKy9CeMk8vZusfBnqZ1g5GqyIdJq+XrqNR5AahKr9CCcxGSwAAAABJRU5ErkJggg==) ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACbklEQVRoQ+2aMU4dMRCGZw6RC1CSSyQdLZJtKQ2REgoiRIpQkCYClCYpkgIESQFIpIlkW+IIcIC0gUNwiEFGz+hlmbG9b1nesvGW++zxfP7H4/H6IYzkwZFwQAUZmpJVkSeniFJKA8ASIi7MyfkrRPxjrT1JjZ8MLaXUDiJuzwngn2GJaNd7vyP5IoIYY94Q0fEQIKIPRGS8947zSQTRWh8CwLuBgZx479+2BTkHgBdDAgGAC+fcywoyIFWqInWN9BSONbTmFVp/AeA5o+rjKRJ2XwBYRsRXM4ZXgAg2LAPzOCDTJYQx5pSIVlrC3EI45y611osMTHuQUPUiYpiVooerg7TWRwDAlhSM0TuI+BsD0x4kGCuFSRVzSqkfiLiWmY17EALMbCAlMCmI6IwxZo+INgQYEYKBuW5da00PKikjhNNiiPGm01rrbwDwofGehQjjNcv1SZgddALhlJEgwgJFxDNr7acmjFLqCyJuTd6LEGFttpmkYC91Hrk3s1GZFERMmUT01Xv/sQljjPlMRMsxO6WULwnb2D8FEs4j680wScjO5f3vzrlNJszESWq2LYXJgTzjZm56MCHf3zVBxH1r7ftU1splxxKYHEgoUUpTo+grEf303rPH5hxENJqDKQEJtko2q9zGeeycWy3JhpKhWT8+NM/sufIhBwKI+Mta+7pkfxKMtd8Qtdbcx4dUQZcFCQ2I6DcAnLUpf6YMPxhIDDOuxC4C6djoQUE6+tKpewWZ1wlRkq0qUhXptKTlzv93aI3jWmE0Fz2TeujpX73F9TaKy9CeMk8vZusfBnqZ1g5GqyIdJq+XrqNR5AahKr9CCcxGSwAAAABJRU5ErkJggg==) * 应用名称 - Drone CI * 重定向 URI - 指向 Drone 的登陆 URI * 客户端 ID * 客户端密钥 创建一个新的共享密钥,用于授权 Runners 和 Drone Server 之间进行通信。 可以使用 openssl 命令生成一个共享密钥: ``` openssl rand -hex 16 61379d57490fe37822267e7984acc934 ``` Drone Server 以轻量级的 Docker 镜像的形式发布,镜像是自包含的,没有任何外部依赖。 ``` docker pull drone/drone ``` Drone 服务器使用环境变量进行配置。本文引用了配置选项的子集,定义如下。有关[配置](https://docs.drone.io/server/reference/)选项的完整列表,请参阅配置 * DRONE_GITEA_CLIENT_ID 必需的字符串值提供您的 Gitea oauth 客户端 ID * DRONE_GITEA_CLIENT_SECRET 必需的字符串值提供您的 Gitea oauth 客户端密码 * DRONE_GITEA_SERVER 必需的字符串值提供您的 Gitea 服务器地址。例如 https://gitea.company.com,请注意,http(s)否则您将看到来自 Gitea 的 “不支持的协议方案” 错误 * DRONE_RPC_SECRET 必需的字符串值提供在上一步中生成的共享密钥。这用于验证服务器和运行器之间的 rpc 连接。必须为服务器和运行器提供相同的秘密值 * DRONE_SERVER_HOST 必需的字符串值提供您的外部主机名或 IP 地址。如果使用 IP 地址,您可以包括端口。例如 drone.company.com * DRONE_SERVER_PROTO 必需的字符串值提供您的外部协议方案。此值应设置为 http 或 https。如果您配置 ssl 或 acme,此字段默认为 https * DRONE_DATABASE_DATASOURCE ``` DRONE_DATABASE_DATASOURCE=root:password@tcp(1.2.3.4:3306)/drone?parseTime=true ``` 可选的字符串值。配置数据库连接字符串。默认值为嵌入的 sqlite 数据库文件的路径 * DRONE_DATABASE_DRIVER 可选字符串值。配置数据库驱动程序名称。默认值为 sqlite3 驱动程序。替代驱动程序是 postgres 和 mysql * DRONE_GITEA_SKIP_VERIFY 布尔值在建立与远程 Gitea 服务器的连接时禁用 tls 验证。默认值为假 * DRONE_RUNNER_CAPACITY 可选数字值。限制运行器可以执行的并发管道的数量。这并不限制可以在单个远程实例上执行的并发管道的数量 * DRONE_USER_CREATE ``` $ openssl rand -hex 16 55f24eb3d61ef6ac5e83d550178638dc DRONE_USER_CREATE=username:octocat,machine:false,admin:true,token:55f24eb3d61ef6ac5e83d550178638dc ``` 在启动时创建的可选用户帐户。这应该用于使用管理帐户为系统播种。它可以是真实账户(即真实的 GitHub 用户),也可以是机器账户 * DRONE_USER_FILTER 可选的以逗号分隔的帐户列表。注册仅限于此列表中的用户,或属于此列表中组织成员的用户 * DRONE_RPC_HOST 提供 Drone Server 的网络地址(可以带上端口号),Drone Runner 会根据地址连接到 Drone Server 以接收来自 Server 的 piplines 任务 * DRONE_RPC_SECRET 提供在上一步中生成的共享密钥。这用于验证服务器和运行器之间的 rpc 连接。必须为服务器和运行器提供相同的秘密值 * DRONE_RPC_PROTO 填 http 或者 https。 取决于访问 Drone Server 的地址是否使用 https * DRONE_RUNNER_CAPACITY 一次可以执行几个 job,不可为 0 * DRONE_RUNNER_NAME 可选的字符串值。设置 Runnner 的名字。Runner 名称存储在服务器中,可用于将构建追溯到特定 Runner * DRONE_RUNNER_LABELS 可选的字符串映射。提供一组标签,用于将管道路由到特定机器或一组机器 * DRONE_LOGS_DEBUG 启用调试日志记录。此配置参数是布尔类型,是可选的 * DRONE_LOGS_PRETTY 启用日志作为默认 json 格式的替代。此配置参数是布尔类型,是可选的 * DRONE_LOGS_NOCOLOR 启用日志的颜色格式;与漂亮的打印日志一起使用。此配置参数是布尔类型,是可选的 一旦 Drone 服务已启动并运行,可以安装 runners 来执行构建流水线 (pipeline). Drone runners 轮询服务器以查找要执行的工作任务,这里提供了几种不同的 runners 针对不同用户场景和运行时环境进行了优化,可以根据情况安装一个或多个,一种或多种。 ``` 1、Docker Runner 2、kubernetes Runner 3、Exec Runner 4、SSH Runner 5、Digital Ocean Runner 6、Macstadium Runner ``` Docker runner 是一个守护进程,它在一个短生命周期容器中执行流水线(pipeline)任务。可以安装一个单独的 Docker runner,或者在多台机器上安装来创建一个构建集群。 Docker runner 是一个通用的 runner,针对可以在无状态容器中运行测试和编译代码的项目进行了优化。 Docker runner 不太适合不能在容器内运行测试或编译代码的项目,包括以 Docker 不支持的操作系统或体系结构为目标的项目,如 macOS 安装的配置文件如下 (docker-compose-drone.yaml): ``` version: "3.8" services: drone: image: drone/drone:2.0.0 #不要用latest,latest并非稳定版本 ports: - "7000:80" networks: - "drone" volumes: - /data/drone/:/var/lib/drone/:rw - /var/run/docker.sock:/var/run/docker.sock:rw environment: #- "DB_PASSWD_FILE=/run/secrets/db_passwd" - DRONE_DEBUG=true - DRONE_DATABASE_DATASOURCE=drone:123456@tcp(localhost:3306)/drone?parseTime=true #mysql配置,要与上边mysql容器中的配置一致 - DRONE_DATABASE_DRIVER=mysql - DRONE_GITEA_SKIP_VERIFY=false - DRONE_GITEA_CLIENT_ID=xxxxxx - DRONE_GITEA_CLIENT_SECRET=xxxxxx - DRONE_GITEA_SERVER=http://localhost:3000/ - DRONE_TLS_AUTOCERT=false - DRONE_RUNNER_CAPACITY=2 - DRONE_RPC_SECRET=48f11fe546a25099cde4a05ce35a4815 #RPC秘钥 - DRONE_SERVER_PROTO=http #这个配置决定了你激活时仓库中的webhook地址的proto - DRONE_SERVER_HOST=localhost:7000 - DRONE_USER_CREATE=username:root,admin:true #管理员账号,是你想要作为管理员的Gitea用户名 - DRONE_USER_FILTER=root - DRONE_DATADOG_ENABLE=false deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s drone-runner: image: drone/drone-runner-docker:1.6.3 networks: - "drone" depends_on: - drone volumes: - /var/run/docker.sock:/var/run/docker.sock:rw environment: - DRONE_RPC_HOST=localhost:7000 - DRONE_RPC_SECRET=48f11fe546a25099cde4a05ce35a4815 - DRONE_RPC_PROTO=http - DRONE_RUNNER_CAPACITY=4 - DRONE_RUNNER_NAME=runner - DRONE_RUNNER_LABELS=machine1:runner1 - DRONE_DEBUG=true - DRONE_LOGS_DEBUG=true - DRONE_LOGS_PRETTY=true - DRONE_LOGS_NOCOLOR=false deploy: mode: replicated replicas: 1 placement: constraints: [node.role == manager] restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s networks: drone: external: true name: traefik_default ``` 如果是使用 docker-compose 方式启动,只需要在 docker-compose-drone.yaml 的目录下输入`docker-compose up -d` 即可 本次通过以下命令可以启动 Drone 服务,容器通过环境变量配置,如果想要查看完整的配置参数,请查看配置参考 ([https://docs.drone.io/server/reference](https://docs.drone.io/server/reference)) ``` docker stack deploy -c docker-compose-drone.yaml drone ``` 以上设置中 Server 的端口号为 7000,因此本地环境浏览器进入 localhost:7000 即可访问管理页面,建议配置域名和 Nginx 或 Caddy 反向代理访问。本次使用的代理组件是 traefik 代理,更多关于 traefik 的使用说明请参考 [traefik 使用说明](https://www.ctq6.cn/traefikingressroute%E9%85%8D%E7%BD%AE/) Drone 的登录账号默认是绑定 Gitea 账号的,因此只要登录了 Gitea,Drone 也会自动登录。 在打开并登录 Drone 后,你的 Repositories 应该是空的,因为没有同步 Gitea 的代码仓库到 Drone CI 里,只要在首页里的右上角点击 SYNC 按钮,Drone 便会自动开始同步 Gitea 的代码仓库。同步完成后需要激活仓库,配置完成后,会自动到对应的私有仓库中创建 Webhook 构建钩子。 ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACbklEQVRoQ+2aMU4dMRCGZw6RC1CSSyQdLZJtKQ2REgoiRIpQkCYClCYpkgIESQFIpIlkW+IIcIC0gUNwiEFGz+hlmbG9b1nesvGW++zxfP7H4/H6IYzkwZFwQAUZmpJVkSeniFJKA8ASIi7MyfkrRPxjrT1JjZ8MLaXUDiJuzwngn2GJaNd7vyP5IoIYY94Q0fEQIKIPRGS8947zSQTRWh8CwLuBgZx479+2BTkHgBdDAgGAC+fcywoyIFWqInWN9BSONbTmFVp/AeA5o+rjKRJ2XwBYRsRXM4ZXgAg2LAPzOCDTJYQx5pSIVlrC3EI45y611osMTHuQUPUiYpiVooerg7TWRwDAlhSM0TuI+BsD0x4kGCuFSRVzSqkfiLiWmY17EALMbCAlMCmI6IwxZo+INgQYEYKBuW5da00PKikjhNNiiPGm01rrbwDwofGehQjjNcv1SZgddALhlJEgwgJFxDNr7acmjFLqCyJuTd6LEGFttpmkYC91Hrk3s1GZFERMmUT01Xv/sQljjPlMRMsxO6WULwnb2D8FEs4j680wScjO5f3vzrlNJszESWq2LYXJgTzjZm56MCHf3zVBxH1r7ftU1splxxKYHEgoUUpTo+grEf303rPH5hxENJqDKQEJtko2q9zGeeycWy3JhpKhWT8+NM/sufIhBwKI+Mta+7pkfxKMtd8Qtdbcx4dUQZcFCQ2I6DcAnLUpf6YMPxhIDDOuxC4C6djoQUE6+tKpewWZ1wlRkq0qUhXptKTlzv93aI3jWmE0Fz2TeujpX73F9TaKy9CeMk8vZusfBnqZ1g5GqyIdJq+XrqNR5AahKr9CCcxGSwAAAABJRU5ErkJggg==) ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACbklEQVRoQ+2aMU4dMRCGZw6RC1CSSyQdLZJtKQ2REgoiRIpQkCYClCYpkgIESQFIpIlkW+IIcIC0gUNwiEFGz+hlmbG9b1nesvGW++zxfP7H4/H6IYzkwZFwQAUZmpJVkSeniFJKA8ASIi7MyfkrRPxjrT1JjZ8MLaXUDiJuzwngn2GJaNd7vyP5IoIYY94Q0fEQIKIPRGS8947zSQTRWh8CwLuBgZx479+2BTkHgBdDAgGAC+fcywoyIFWqInWN9BSONbTmFVp/AeA5o+rjKRJ2XwBYRsRXM4ZXgAg2LAPzOCDTJYQx5pSIVlrC3EI45y611osMTHuQUPUiYpiVooerg7TWRwDAlhSM0TuI+BsD0x4kGCuFSRVzSqkfiLiWmY17EALMbCAlMCmI6IwxZo+INgQYEYKBuW5da00PKikjhNNiiPGm01rrbwDwofGehQjjNcv1SZgddALhlJEgwgJFxDNr7acmjFLqCyJuTd6LEGFttpmkYC91Hrk3s1GZFERMmUT01Xv/sQljjPlMRMsxO6WULwnb2D8FEs4j680wScjO5f3vzrlNJszESWq2LYXJgTzjZm56MCHf3zVBxH1r7ftU1splxxKYHEgoUUpTo+grEf303rPH5hxENJqDKQEJtko2q9zGeeycWy3JhpKhWT8+NM/sufIhBwKI+Mta+7pkfxKMtd8Qtdbcx4dUQZcFCQ2I6DcAnLUpf6YMPxhIDDOuxC4C6djoQUE6+tKpewWZ1wlRkq0qUhXptKTlzv93aI3jWmE0Fz2TeujpX73F9TaKy9CeMk8vZusfBnqZ1g5GqyIdJq+XrqNR5AahKr9CCcxGSwAAAABJRU5ErkJggg==) 如果 Steps 需要挂载宿主机的文件夹,需要在 Drone 对应项目中的 SETTINGS 里的 Project settings 里需要勾选 Trusted,这意味着开启容器的特权模式去挂载宿主机的文件夹。开启这个设置用户的权限必须是 admin ,其他用户没有权限开启。 在项目代码的根目录新建一个. drone.yml 文件,一旦代码上传到代码仓库 (github, gitlab, gitea 等),git 仓库会通过 Drone 预先埋好的 Webhoot 钩子发送事件请求给 Drone,Drone 接收到事件请求后会找到仓库项目根目录中的. drone.yml 文件进行解析并根据文件的描述执行任务。 Drone CI 构建的每个 step 都会根据镜像产生一个 Docker 容器,并在容器里运行指定任务。 首先每个 Pipline 都有的头描述部分: ``` kind: pipeline # Pipeline 的类型,其他的还有 secret and signature。 type: docker # 定义了执行任务的类型,这里会使用 Docker 执行。 name: web # 定义 Pipline 的名字,一个 .drone.yml 可以有多个不同名字的 Pipeline。 ``` 然后是描述任务的每个步骤,steps 属性后描述此步骤的 name (名字) 和 image (镜像),每一步都会用到一个镜像,任务进行时会根据提供的镜像名字拉取镜像并生成一个临时 Docker 容器运行任务指令,步骤完成后自动删除。 ``` steps: - name: build-imaeg # 步骤名 image: docker # 步骤需要用到的镜像 ``` 下面是一个 vue 前端程序打包成 Docker 镜像并部署到服务器的例子。文中介绍的范例主要想覆盖常见的坑,对于新手可能会比较复杂,如果看不懂,没关系,可以直接跳过这一节,自己尝试动手安装 Drone CI 后回头再细品。 ``` kind: pipeline type: docker #在docker runner中运行 name: web #定义setups,每个setup有属于自己的name,最后会显示在Drone CI管理页面的侧边栏 steps: - name: restore-cache # 把之前缓存好的数据取出 image: drillster/drone-volume-cache settings: restore: true mount: # 缓存挂载的文件夹 - ./.npm-cache - ./node_modules volumes: - name: cache path: /cache - name: compile #编译 image: node:12 commands: - yarn config set registry https://registry.npm.taobao.org -g - yarn config set cache ./.npm-cache --global - yarn install - yarn run build - name: build image #打成docker镜像 image: docker failure: ignore volumes: - name: sock path: /var/run/docker.sock commands: - docker build -t localhost:v1.0 -f Dockerfile . - docker image prune -f --filter "dangling=true" # 清理无用镜像 - name: rebuild-cache # 把依赖和 npm 缓存放到缓存里 image: drillster/drone-volume-cache settings: rebuild: true mount: - ./.npm-cache - ./node_modules volumes: - name: cache path: /cache - name: deploy #部署到服务器上 image: docker failure: ignore volumes: - name: sock path: /var/run/docker.sock commands: - docker service ls|grep test || export SERVICE=down #先检查服务是否存在,存在更新,不存在创建 - | if [ "$SERVICE" != "down" ] then docker service update --image test:v1.0 test_test else docker stack deploy -c deploy.yaml autocd-web fi # 循环检测服务是否启动成功 - | while true do docker service ps test_test|awk '{print $6}'|awk 'NR==2'|grep 'Running' || export SERVICE=down if [ "$SERVICE" == "down" ] then echo -e "\033[5;35;40m 正在启动中请稍后 ... \033[0m" export SERVICE=up continue else docker service logs -n 200 test_test sleep 3 break fi done # 挂载宿主机文件到docker容器中 volumes: - name: sock host: path: /var/run/docker.sock - name: cache host: path: /tmp/cache # 创建触发器,绑定分支及事件及上一次成功时才运行 trigger: branch: - master event: - pull_request - push status: - success - failure node: machine1:runner1 ``` ``` # 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像 # 这里会直接调用宿主机的密钥登录私有仓库。 FROM nginx:1.19.2-alpine # 编译项目,使用npm安装程序的所有依赖,利用taobao的npm安装,并打包编译成静态文件 # 这两步在drone里已经完成 # 复制所有静态文件到 /usr/share/nginx/html下。 # 拷贝配置文件到nginx配置目录中 COPY dist/ /usr/share/nginx/html/ ADD nginx.conf /etc/nginx/nginx.conf ADD default.conf /etc/nginx/conf.d/default.conf # 暴露container的端口 EXPOSE 80 # 运行命令 CMD ["nginx", "-g", "daemon off;"] ``` **上面的范例有 5 个 Steps** * restore-cache * compile * build image * rebuild-cache * deploy **简单整理一下每一步 (详细的上面注释都有解释)** 1、clone 克隆私有仓库代码 (默认自动添加); 2、restore-cache 步骤会把之前缓存的文件从宿主机中取出; 3、compile 步骤时 yarn 或 npm 跳过已经安装过的依赖; 4、build 步骤会时根据仓库中的 dockerfile 打成本地镜像包,由于不需要推送到 docker 私有镜像仓库即并没有使用 plugins/docker 插件; 5、rebuild-cache 步骤把缓存通过挂载文件放到宿主机中; 6、deploy 步骤使用 将应用部署到容器中; 因为一次构建每一个 steps 都会新生成一个容器并在容器里运行构建,沙盒环境里没有缓存数据。通过 restore-cache 和 rebuild-cache 这两个 steps 建立宿主机与容器的缓存,把 vue 的依赖 node_modules 目录和 yran 缓存通过 volumes 映射到宿主机上,在下一次构建并安装依赖时 yarn 会自动跳过没有变化的依赖包,从而加快构建速度。 实际在构建过程中,Drone CI 会默认在所有 setup 最前面添加一个克隆代码的 setup(clone), 使用自建的 Gitea 服务内网拉取可以极致地加快构建速度,等代码克隆完成后才会开始执行预定义的一些 setup,如果中途报错,即会直接报错退出整个 pipeline 流水线流程。 在 docker-compose-drone.yaml 文件中定义 Runner 的 DRONE_RUNNER_LABELS 环境变量可以为 Runner 加上标签,在定义 .drone.yml 时通过这个标签让 pipeline 路由到不同的 Runner 执行任务。 例如我有两个不同的机器放在不同的地方,在这两台机器上运行 Runner 并使用 DRONE_RUNNER_LABELS 环境变量分别定义这两个 Runner 的标签,例如在第一个 Runner 里 DRONE_RUNNER_LABELS=nodeA:runnerA,另一个 Runner 里 DRONE_RUNNER_LABELS=nodeB:runnerB,那么在. drone.yml 文件中我们可以定义 ``` kind: pipeline type: docker name: default steps: - name: build image: golang commands: - go build - go test node: nodeA: runnerA ``` 那么这个任务就只会在标签是 nodeA:runnerA 的 Runner 里运行。 如果想要在两个节点中运行,可以把这两个标签都加上,例如: ``` node: nodeA: runnerA nodeB: runnerB ``` 因为 Runner 会主动心跳连接 Server 并在 Server 上注册自己,不需要固定的网络地址而且足够轻量, 因此这个 Runner 节点可以是你的 PC 机、笔记本,甚至是树莓派。
Jonny
June 6, 2022, 11:41 a.m.
490
0 条评论
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
如遇文档失效,可评论告知,便后续更新!
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
【阿里云】2核2G云服务器新老同享 99元/年,续费同价(不要✓自动续费)
Markdown文件
Word文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码
有效期