一、为什么要把Drone和ArgoCD绑一起干活
1.1 你可能遇到过的麻烦事
假设你做了个简单的ToDo网页应用,写完代码推到GitHub,本来以为完事了,结果还要折腾一堆:拉代码、装依赖、构建Docker镜像、上传到镜像仓库,再手动去改ArgoCD部署配置里的镜像版本,把改好的配置推回Git,等ArgoCD自动同步,中间漏一步,要么镜像没更,要么配置改了没推,线上的ToDo还是旧版本,连用户反馈的bug都找不到对应版本,这种手动操作不仅慢,还容易出错。
1.2 联动的核心好处
把Drone和ArgoCD串起来,就能解决上面的麻烦:你只需要改代码推Git,Drone自动帮你跑完测试、打包镜像、修改部署配置,再把更新后的配置推回Git,ArgoCD盯着这个Git仓库,一有变更就自动同步到集群,全程不用人插手,还能通过Git提交记录查清楚哪个版本什么时候上线,出问题回滚也快,这就是GitOps的核心——用Git做所有部署变更的唯一可信源。
二、先搞懂两个工具的分工(大白话版)
2.1 Drone:你的自动流水线小弟
Drone是轻量的CI工具,相当于你给它定好规则:改代码推Git后,它自动执行指定步骤,比如跑单元测试、打包应用、生成镜像、推送镜像仓库,还能做一些校验,比如代码是否符合规范,测试有没有过。它跑在你的K8s集群里,不用额外搭复杂环境,配置也简单,用YAML就能写流水线。
2.2 ArgoCD:GitOps的同步守门人
ArgoCD是专门做GitOps的CD工具,它的工作逻辑很简单:盯着你存K8s部署配置的Git仓库,一旦仓库里的配置变了,就自动把K8s集群里的应用改成和配置一致的状态,比如你改了镜像版本,它就自动拉新镜像部署,不用你点手动同步,还能自动删掉过期的资源,保证集群和Git的状态完全一致。
三、实操:从代码提交到部署全链路打通
3.1 前置准备
需要的环境很简单:已经搭好的K8s集群、装好了Drone CI(v2.20)和ArgoCD(v2.8)、一个Git仓库(比如GitHub,存应用代码)、另一个Git仓库(存ArgoCD的部署配置)、一个Docker镜像仓库(比如Docker Hub,存打包好的应用镜像)。所有工具都关联这两个Git仓库和镜像仓库,确保权限正常。
3.2 Drone的CI配置:自动构建并更新部署配置
这里用单一技术栈(Drone CI + Kustomize),完整的配置文件存为.drone.yml,注释都标清楚每一步干啥:
# Drone CI配置:ToDo应用的全流程流水线
kind: pipeline
type: kubernetes
name: todo-app-end-to-end
steps:
# 第一步:克隆ArgoCD的部署配置仓库
- name: checkout-config-repo
image: alpine/git
commands:
- git clone https://${GIT_USER}:${GIT_TOKEN}@github.com/你的用户名/argo-todo-config.git argo-config
- cd argo-config/k8s
# 第二步:拉取应用代码(如果是同一仓库可以合并,这里分开更清晰)
- name: checkout-app-code
image: alpine/git
commands:
- cd ..
- git clone https://${GIT_USER}:${GIT_TOKEN}@github.com/你的用户名/todo-app.git app-code
- cd app-code
# 第三步:安装依赖并跑单元测试
- name: test-app
image: node:18-alpine
commands:
- npm install
- npm run test:unit # 自定义的单元测试脚本,没通过会直接终止流水线
# 第四步:构建Docker镜像并推送
- name: build-and-push-image
image: plugins/docker
settings:
username:
from_secret: docker_hub_username # Docker Hub用户名,存在Drone的secret里,不能明文写
password:
from_secret: docker_hub_password # Docker Hub密码,存在Drone的secret里
repo: 你的Docker Hub用户名/todo-app # 镜像仓库地址
tags:
- ${DRONE_COMMIT_SHORT} # 用commit短号当tag,保证唯一,避免latest的混乱
insecure: true # 本地测试用,生产环境建议用HTTPS仓库
# 第五步:更新ArgoCD的部署配置,把镜像版本改成新的commit短号
- name: update-argo-config
image: alpine:3.18
commands:
- cd ../argo-config/k8s
# 替换Deployment里的镜像tag,用sed命令匹配和修改
- sed -i "s|image: 你的Docker Hub用户名/todo-app:.*|image: 你的Docker Hub用户名/todo-app:${DRONE_COMMIT_SHORT}|" deployment.yaml
# 提交修改到配置仓库
- git config user.name "drone-auto-bot"
- git config user.email "ci@drone.io"
- git add deployment.yaml
- git commit -m "Auto update todo-app image to ${DRONE_COMMIT_SHORT} from CI"
- git push origin main
这个配置跑下来,只要你推代码到todo-app仓库,Drone自动完成测试、镜像打包,再去改ArgoCD用的配置仓库里的部署文件,把镜像版本更新成新的commit号,最后推回配置仓库。
3.3 ArgoCD的自动同步配置
接下来要给ArgoCD加一个Application,让它盯着刚才的配置仓库,一有变更就自动同步到集群,配置文件argocd-todo-app.yaml如下:
# ArgoCD Application配置:自动同步ToDo应用
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: todo-app
namespace: argocd # ArgoCD自己的命名空间
spec:
project: default
# 源:配置仓库的地址和路径
source:
repoURL: https://github.com/你的用户名/argo-todo-config.git
targetRevision: main
path: k8s # 部署文件在仓库里的路径
# 目标:集群和命名空间
destination:
server: https://kubernetes.default.svc # K8s集群的内部地址
namespace: default # 应用部署在default命名空间
# 自动同步规则,不用手动点按钮
syncPolicy:
automated:
prune: true # 删掉配置仓库里已经没有的旧资源,避免集群残留无用资源
selfHeal: true # 如果集群里的配置和Git不一致,自动修回Git里的状态
syncOptions:
- CreateNamespace=true # 如果namespace不存在,自动创建
把这个配置提交到ArgoCD的Application仓库,或者用ArgoCD CLI apply,搞定后,只要Drone推了配置,ArgoCD会在1分钟内自动同步,线上的应用就更成新版本了。
四、应用场景
4.1 适合的场景
这个方案特别适合中小团队的web应用、工具类应用的迭代,比如电商的活动页面、内部办公工具的小版本更新,需要快速发布、部署错误容忍度低的场景;也适合对部署可追溯性有要求的场景,比如金融类的轻量应用,要查清楚哪天哪个版本上线的,有没有改配置,Git的提交记录能完全满足需求。
4.2 不适合的场景
如果你的应用是需要复杂审批流程的,比如企业级的核心系统,部署前必须经过QA测试、安全扫描的多轮审批,自动同步会跳过这些流程;或者应用有特殊的部署逻辑,比如需要手动调整数据库参数、配置外部依赖,这种时候自动同步会出问题,需要人工干预,这套方案就不合适。
五、技术优缺点
5.1 优点
- 完全自动化:从代码提交到部署上线,全程不需要人工操作,减少了手动改配置的错误,比如之前经常忘改镜像版本的问题彻底解决。
- 可追溯性强:所有部署变更都在Git里,每次上线的版本、时间、操作人都能通过提交记录查到,出了问题能快速定位到对应版本。
- 成本低:Drone和ArgoCD都是开源工具,部署在自己的K8s集群里,不用花钱买商业CI/CD服务,适合预算有限的团队。
- 灵活可扩展:Drone的流水线可以加任何自定义步骤,比如代码安全扫描、性能测试、镜像安全校验,ArgoCD的同步规则也能根据需求调整,比如加审批环节。
5.2 缺点
- 配置门槛略高:刚开始要装两个工具、关联Git和镜像仓库、配置权限、写对YAML,容易踩坑,比如Drone有没有权限访问配置仓库,ArgoCD能不能拉到新配置。
- 依赖K8s环境:这套方案跑在K8s上,需要会用K8s的基本操作,要是不懂K8s,部署过程会很折腾。
- 仓库权限风险:配置仓库如果权限没管好,被人随便改,会导致自动部署出问题,需要给配置仓库加分支保护,比如PR审核后才能合并到主分支。
六、注意事项
6.1 安全方面
所有敏感信息(比如Docker密码、Git的个人访问令牌)都要存在Drone的秘密(secret)里,不能明文写在.drone.yml里;镜像仓库要用私有仓库,不要公开,避免被人下载恶意镜像;ArgoCD的权限要最小化,不要给所有人管理员权限,只授权给需要部署的成员。
6.2 版本控制方面
镜像标签用唯一的commit短号,绝对不要用latest,因为latest标签没法对应到具体的代码版本,出问题查不到;配置仓库的主分支要加分支保护,比如必须经过至少一个人的PR审核才能合并,避免误改部署配置。
6.3 调试方面
如果部署失败,先查Drone的日志,看流水线哪一步卡住了,比如有没有推送配置仓库成功,有没有权限;再查ArgoCD的日志,看有没有拉到新配置,有没有同步失败,比如镜像仓库地址写错,或者标签不存在,大部分问题都是权限或路径写错导致的。
七、总结
Drone和ArgoCD联动的方案,是中小团队做GitOps部署的轻量选择,虽然刚开始配置要花点时间,但稳定后能大幅减少人工部署的麻烦,提高上线效率,还能保证部署的可追溯性,适合需要快速迭代、对部署可靠性有要求的场景。只要注意安全、版本控制的细节,这套方案能帮你搭建一个靠谱的端到端交付链路,不用再在部署上浪费时间。
评论
围绕“Drone与ArgoCD联动实现GitOps交付:从CI构建到CD部署的端到端链路打通”参与讨论