惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
Spread Privacy
Spread Privacy
T
Tenable Blog
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Securelist
P
Privacy & Cybersecurity Law Blog
Know Your Adversary
Know Your Adversary
T
The Exploit Database - CXSecurity.com
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
I
Intezer
F
Fortinet All Blogs
Engineering at Meta
Engineering at Meta
Simon Willison's Weblog
Simon Willison's Weblog
The Register - Security
The Register - Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
Lohrmann on Cybersecurity
C
Cyber Attacks, Cyber Crime and Cyber Security
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
H
Help Net Security
T
Threat Research - Cisco Blogs
D
DataBreaches.Net
S
Schneier on Security
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
P
Privacy International News Feed
S
Secure Thoughts
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recorded Future
Recorded Future
C
Cybersecurity and Infrastructure Security Agency CISA
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
人人都是产品经理
人人都是产品经理
NISL@THU
NISL@THU
博客园 - Franky
T
Tor Project blog
G
GRAHAM CLULEY
博客园 - 【当耐特】
Jina AI
Jina AI
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
A
About on SuperTechFans
Hacker News - Newest:
Hacker News - Newest: "LLM"

会走路的三百块

part 4 踩坑记录 | 会走路的三百块 Unity-进阶知识 | 会走路的三百块 Unity-天命6源码 | 会走路的三百块 part 1 linux的历史节点 | 会走路的三百块 C的编译器 | 会走路的三百块 字符串常量存储 | 会走路的三百块 第三章 数据和C | 会走路的三百块 类型转换和缩减 | 会走路的三百块 零散知识点 | 会走路的三百块 DNS选择机制 | 会走路的三百块 网络八股Cache | 会走路的三百块 第三章-数据和C | 会走路的三百块 一些零散的知识点 | 会走路的三百块 自顶向下 | 会走路的三百块 linux简单速通 | 会走路的三百块 设计图的概述 | 会走路的三百块 AI和自动化暂存 | 会走路的三百块 第一章 初识C语言 | 会走路的三百块 Games101 | 会走路的三百块 Unity-Lua补充 | 会走路的三百块 Unity-个人Demo | 会走路的三百块 Unity-基础知识 | 会走路的三百块 Unity环境搭建 | 会走路的三百块 Unity-经典MMO | 会走路的三百块 Fastapi-Pydantic | 会走路的三百块 Fastapi-Sqlalchemy | 会走路的三百块 Scrapy-Redis分布式爬虫 | 会走路的三百块 Scrapy-Web集成 | 会走路的三百块 Scrapy爬虫 | 会走路的三百块 Twitter爬虫 | 会走路的三百块 Uinotes爬虫 | 会走路的三百块 PythonCheatSheet | 会走路的三百块 Python库 | 会走路的三百块 Python快速复习 | 会走路的三百块 Python语言进阶 | 会走路的三百块 Py自动化办公 | 会走路的三百块 Py踩坑记录 | 会走路的三百块 深入Python | 会走路的三百块 基本前端常识 | 会走路的三百块 文档分发与产品安全 | 会走路的三百块 跨平台应用脚手架 | 会走路的三百块 后端开发常见层式结构 | 会走路的三百块 mongodb | 会走路的三百块 PG-ep1 | 会走路的三百块 分库分表 | 会走路的三百块 docker常用知识 | 会走路的三百块 K3S | 会走路的三百块 后端常见安全措施 | 会走路的三百块 part 2 常用命令 | 会走路的三百块 part 3 shell脚本 | 会走路的三百块 服务器装机 | 会走路的三百块 测试与性能指标评估 | 会走路的三百块 缓存系统设计 | 会走路的三百块 Caddy | 会走路的三百块 Nginx-EP1 | 会走路的三百块 Nginx-EP2 | 会走路的三百块 EP1-设计模式 | 会走路的三百块 EP2-创建型模式 | 会走路的三百块 EP3-结构型模式 | 会走路的三百块 EP4-行为模式 | 会走路的三百块 EP5-其他 | 会走路的三百块 软件工程 | 会走路的三百块 日志模块设计 | 会走路的三百块 订单和支付模块 | 会走路的三百块 minio对象存储 | 会走路的三百块 Rustfs对象存储 | 会走路的三百块 一次性搞懂 | 会走路的三百块 基本硬件知识 | 会走路的三百块 开源协议 | 会走路的三百块 彩蛋收集 | 会走路的三百块 版本控制 | 会走路的三百块 项目管理 | 会走路的三百块 leetcode-EP1 | 会走路的三百块 第二章 C语言概述 | 会走路的三百块 第零章 计算机概论 | 会走路的三百块 爬虫基础 | 会走路的三百块 Sqlite | 会走路的三百块 README | 会走路的三百块 异步任务模块 | 会走路的三百块 用户和验权 | 会走路的三百块 通用数据库执行器 | 会走路的三百块 clickhouse | 会走路的三百块 会走路的三百块 Obsidian博客搭建 | 会走路的三百块 关于 | 会走路的三百块
CICD | 会走路的三百块
2026-05-27 · via 会走路的三百块

创建于 2026年1月22日 07:16:55 · 约935字

只做业务要用到的最简单的CICD。
基于LLM话疗和规模调研,最终选择的是 release分支->Drone自动打包->推送k3s。
选型比较:

  • github runner也是个不错的选择,但是这样镜像就得走一遍网络,而且会随着github的政策变化。
  • gitea runner也不错,出来的时间比较短,而且自定义程度不如drone。
  • jekins是行业标准但是java比较亲和,配置复杂度高了不止一点。
    Drone有大公司背书,活的时间也比较久,star多资料多,资源占用少,纯docker runner好限制和调整,带UI界面也是写yaml配置简单,适合我们小团队及格的使用。
    内部工具没那么严格,崩了大不了晚点上线。目前能考虑到的地方就是如果打包出错了,pod版本不一致,怎么做保证原子性。

原因:Submariner 默认仅支持导出 ClusterIP 类型的服务(或者 headless service)

Drone 推送 Harbor 镜像问题总结 ​

背景 ​

本仓库通过 Drone CI 使用 Kaniko 构建镜像,并推送到 Harbor:

txt

harbor.lometa.cn/frontend-dev/lometa/vitepress-doc-packer:latest

调试过程中先后遇到过两类现象:

  1. plugins/docker 镜像拉取卡住:

txt

latest: Pulling from plugins/docker
  1. Kaniko 推送 Harbor 时鉴权失败:

txt

UNAUTHORIZED: unauthorized to access repository: ..., action: push

现象 ​

一开始日志里看起来像 Harbor 账号没有权限:

txt

error checking push permissions  
UNAUTHORIZED: unauthorized to access repository

但加 debug 后发现,旧写法下 Drone 命令里的变量会被预处理,导致日志误导。例如:

yaml

- 'printf ''Harbor username length: %s\n'' "${#HARBOR_USERNAME}"'

这类 ${...} / ${#...} 表达式会先经过 Drone 的参数预处理,不一定是容器 shell 在运行时展开。结果可能显示为空或长度为 0,让人误以为 secret 没有注入。

原因 ​

Drone 会在 YAML 进入实际 shell 执行前做参数预处理。官方文档说明:如果不希望 Drone 提前求值,需要用 $$ 转义,让表达式原样交给 shell。

因此,在 commands 里要写:

yaml

- 'test -n "$${HARBOR_USERNAME}"'  
- 'printf ''length: %s\n'' "$${#HARBOR_USERNAME}"'

而不是:

yaml

- 'test -n "$HARBOR_USERNAME"'  
- 'printf ''length: %s\n'' "${#HARBOR_USERNAME}"'

另外,Harbor 机器人账号用户名里可能带 $,例如:

如果命令里没有正确转义,排查时很容易把 Drone 预处理、shell 展开、Harbor 权限三个问题混在一起。

验证过程 ​

这次排查做了几个对照:

  1. 切到 plugins/docker:构建卡在拉取插件镜像,不适合当前环境。
  2. 切回 Kaniko:能直接进入 Harbor 鉴权和镜像构建流程。
  3. 新建 harbor_devbot_username2 / harbor_devbot_password2:确认新 secret 可用。
  4. 使用 $${...}$${#...}:确认变量由容器 shell 展开,用户名长度和密码长度正常。
  5. 改回正确镜像路径:frontend-dev/lometa/vitepress-doc-packer 后,构建成功并推送镜像。

最终写法 ​

当前 .drone.yml 的关键写法:

yaml

environment:  
  HOME: /kaniko  
  HARBOR_USERNAME:  
    from_secret: harbor_devbot_username2  
  HARBOR_PASSWORD:  
    from_secret: harbor_devbot_password2  
commands:  
  - mkdir -p /kaniko/.docker  
  - 'test -n "$${HARBOR_USERNAME}" || { echo "HARBOR_USERNAME is empty"; exit 1; }'  
  - 'test -n "$${HARBOR_PASSWORD}" || { echo "HARBOR_PASSWORD is empty"; exit 1; }'  
  - 'echo "{\"auths\":{\"harbor.lometa.cn\":{\"username\":\"$${HARBOR_USERNAME}\",\"password\":\"$${HARBOR_PASSWORD}\"}}}" > /kaniko/.docker/config.json'  
  - '/kaniko/executor --dockerfile=Dockerfile --context=dir://. --destination=harbor.lometa.cn/frontend-dev/lometa/vitepress-doc-packer:v$${DRONE_BUILD_NUMBER} --destination=harbor.lometa.cn/frontend-dev/lometa/vitepress-doc-packer:latest'

排查要点 ​

遇到类似问题时,按这个顺序查:

  1. 先确认是否卡在拉取 CI 插件镜像,例如 plugins/docker
  2. 再确认 from_secret 的 secret 名字是否存在,并且对应仓库可用。
  3. commands 里使用 $${VAR},不要直接用 ${VAR}
  4. 如果要打印变量长度,也要写成 $${#VAR}
  5. Harbor 路径要确认清楚,本次最终路径是 frontend-dev/lometa/vitepress-doc-packer
  6. Debug 完后删除用户名和长度打印,避免日志里暴露账号信息。

参考资料 ​

  • Drone 官方文档:Environment syntax

    说明 step 级 environmentfrom_secret 的写法,并在 Common Problems 中明确提到参数展开会在 YAML 解析前预处理;如果不希望系统提前求值,需要使用 $$ 转义。

  • Drone 官方文档:Environment substitution

    说明 Drone 支持 ${parameter}${#parameter} 等类似 shell 的替换语法,并强调这些表达式会在 YAML 解析前求值;需要交给容器 shell 执行时,应写成 $${...}

  • Drone 官方文档:Repository secrets

    说明 repository secrets 的用途、创建位置,以及通过 environment.<NAME>.from_secret 注入 step 环境变量的方式。