news 2026/10/13 10:52:16

SUSI Cortana Skill CI/CD流水线:Travis CI自动构建Docker镜像并滚动更新GKE集群

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SUSI Cortana Skill CI/CD流水线:Travis CI自动构建Docker镜像并滚动更新GKE集群

【免费下载链接】susi_cortana_skill

A cortana skill which can be used to ask susi for answers: "Cortana, Ask Susi Who Are You"

项目地址:https://gitcode.com/gh_mirrors/su/susi_cortana_skill
点击查看免费下载

SUSI Cortana Skill 是一个让微软语音助手 Cortana 直接调用开源智能问答引擎 SUSI AI 的技能(Skill):对 Cortana 说 "Ask Susi, Who Are You",机器人就能给出答案。本文带你拆解这套项目的CI/CD 流水线:如何通过 Travis CI 自动构建 Docker 镜像,并推送到 Google Kubernetes Engine(GKE)集群完成滚动更新(Rolling Update),全程无需人工登录服务器。

🤖 它是什么:一个会查 SUSI AI 的 Cortana 技能

整个机器人只有一个入口文件 app.js:基于restify起一个监听 8080 端口的 HTTP 服务,接收 Bot Framework 发来的POST /api/messages请求,把用户问题转发给 SUSI API,再把文字答案、表格卡片(HeroCard)等回传给用户。依赖项定义在 package.json 中(botbuilder、restify、request),启动命令就是npm start。

正因为核心逻辑如此轻量,它非常适合做成容器,由 CI/CD 流水线自动发布:

🏗️ 流水线全景:一次 master 推送触发什么

推送到 master │ ▼ Travis CI 构建 ──► 成功 ──► after_success 执行 deploy.sh │ ┌──────────────────────┤ ▼ ▼ 安装 GCloud SDK / kubectl 用 openssl 解密服务账号密钥 │ │ └──────────┬───────────┘ ▼ docker build(打入 COMMIT_HASH) ▼ docker push(tag: 提交号 + latest-master) ▼ kubectl set image ──► GKE 滚动更新 Pod

触发器定义在项目根目录的 .travis.yml 中:语言为node_js,启用docker服务,构建成功后执行after_success: bash kubernetes/travis/deploy.sh,所有部署逻辑集中在 kubernetes/travis/deploy.sh 一个脚本里。

🚦 第一关:只允许 master 分支部署生产环境

deploy.sh 开头就设置了三道"保险闸":

export DEPLOY_BRANCH=${DEPLOY_BRANCH:-master}

只有同时满足以下三个条件才继续,否则直接exit 0跳过:

  • 不是 Pull Request(TRAVIS_PULL_REQUEST == false)
  • 仓库必须是fossasia/susi_cortana_skill
  • 当前分支必须是master(可用DEPLOY_BRANCH覆盖)

💡 对新手来说这是一个很好的实践:用分支和仓库名做前置判断,避免测试分支或 PR 误触发生产部署。

☁️ 第二关:在 CI 环境里自助准备云工具链

Travis 的容器里并没有现成的 Google Cloud 环境,脚本会"就地组装"(见 deploy.sh 第10-21行):

  1. 清掉镜像中预装的旧gcloud二进制;
  2. 通过curl https://sdk.cloud.google.com | bash安装最新版 GCloud SDK;
  3. gcloud components install kubectl装好集群管理工具。

接着是关键一步——解密服务账号密钥。GCP 的服务账号 JSON 文件是敏感凭据,不能明文放进仓库,所以项目里只存放一份用 AES-256 加密的文件 susi-telegrambot-85cf0ec296e9.json.enc,由 Travis 的加密环境变量encrypted_..._key/encrypted_..._iv在构建时解密:

openssl aes-256-cbc -K $encrypted_abb5833c4ae5_key \ -iv $encrypted_abb5833c4ae5_iv \ -in ./kubernetes/travis/susi-telegrambot-85cf0ec296e9.json.enc \ -out susi-telegrambot-85cf0ec296e9.json -d

随后gcloud auth activate-service-account完成认证,gcloud container clusters get-credentials bots把 kubectl 对接到名为bots的 GKE 集群(详见 docs/installations/gce-kubernetes.md 的集群准备步骤)。

🐳 第三关:构建可复现的 Docker 镜像

镜像构建定义在 kubernetes/images/generator/Dockerfile,基于node:boron,并通过ARG接收三个构建参数:

参数作用
COMMIT_HASH锁定代码到具体提交,保证镜像与代码一一对应
BRANCH默认master,克隆后 checkout 的分支
REPOSITORY要克隆的仓库地址

配套的 setup.sh 会在镜像内克隆仓库、git checkout $BRANCH,如果传入了COMMIT_HASH还会git reset --hard精确对齐到该提交,最后npm install并删除.git目录。最终CMD ["npm", "start"]启动机器人服务。

deploy.sh 第32-36行 展示了完整的构建与推送动作:

docker build --build-arg COMMIT_HASH=$TRAVIS_COMMIT \ --build-arg BRANCH=$DEPLOY_BRANCH --no-cache \ -t fossasia/susi_skypebot:$TRAVIS_COMMIT . docker tag fossasia/susi_skypebot:$TRAVIS_COMMIT \ fossasia/susi_skypebot:latest-$DEPLOY_BRANCH docker push fossasia/susi_skypebot

⭐双 tag 策略是亮点:$TRAVIS_COMMIT(提交号)保证可回滚、可追溯;latest-master方便 Deployment 引用"最新稳定版"。

🔄 第四关:kubectl 触发 GKE 滚动更新

推完镜像后,只需一条命令就能让集群换新(deploy.sh 第38行):

kubectl set image deployment/skype --namespace=skype \ skype=fossasia/susi_skypebot:$TRAVIS_COMMIT

对应的 Deployment 定义在 kubernetes/yamls/application/deployment.yaml:imagePullPolicy: Always确保节点始终拉取新镜像,appId/appPassword通过环境变量注入,Pod 监听 8080 端口。kubectl set image会更新 Deployment 的镜像标签,Kubernetes 随即按滚动策略逐个替换旧 Pod——新 Pod 就绪后才终止旧 Pod,实现零停机发布。脚本结尾还会rm掉解密出的凭据文件,避免敏感信息残留在构建环境。

🔐 补充:手工部署与自动 HTTPS 证书

除自动流水线外,项目也提供一键脚本 kubernetes/deploy.sh 用于在 GKE 集群上完整搭建环境:

  • bash kubernetes/deploy.sh create all:按顺序创建nginx(Ingress 控制器)、lego(自动签发 Let's Encrypt 证书)、application(机器人本体)三个命名空间及对应资源,先挂 ingress-notls.yaml 提供 HTTP 入口,证书就绪后切换为 ingress-tls.yaml(带kubernetes.io/tls-acme: "true"注解);
  • bash kubernetes/deploy.sh delete all:一键清理整个集群资源;
  • 证书签发邮箱在 kubernetes/yamls/lego/configmap.yaml 的lego.email中配置。

📁 关键文件速查

文件职责
.travis.ymlCI 入口:Node 构建 + 成功后执行部署
kubernetes/travis/deploy.sh云环境准备、密钥解密、镜像构建推送、滚动更新
kubernetes/images/generator/Dockerfile镜像构建定义(含 COMMIT_HASH 参数)
kubernetes/images/generator/setup.sh镜像内克隆代码并锁定提交
kubernetes/deploy.sh手工 create / delete 集群资源
kubernetes/yamls/application/应用命名空间、Deployment、Service、Ingress
kubernetes/yamls/nginx/、lego/Nginx Ingress 控制器与证书自动签发
docs/installations/gce-kubernetes.mdGKE 集群从零到部署的完整图文指南

✅ 小结

SUSI Cortana Skill 用一个不到 40 行的脚本,串起了开源项目 CI/CD 的完整闭环:分支守卫 → 云工具链自助安装 → 密钥解密认证 → 可复现镜像构建 → 双 tag 推送 → kubectl 滚动更新。对想学习 DevOps 的读者来说,这是一份"麻雀虽小、五脏俱全"的参考范本:把 kubernetes/travis/deploy.sh 和 Dockerfile 对照阅读,你就能在自己的项目里复刻这条自动发布流水线。

【免费下载链接】susi_cortana_skill

A cortana skill which can be used to ask susi for answers: "Cortana, Ask Susi Who Are You"

项目地址:https://gitcode.com/gh_mirrors/su/susi_cortana_skill
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 10:51:34

Windows原生部署OpenClaw:接入DeepSeek与飞书,打造群聊AI助手

最近在几个开发者社群里,常看到有人问:能不能在 Windows 原生系统上安装 OpenClaw,然后一接 DeepSeek、一接飞书,直接在群聊里跑一个自己的 AI 助手?我以前主要是在 Linux 环境里折腾这类框架,直到有一次临…

作者头像 李华
网站建设 2026/10/13 10:49:57

基于SpringBoot+Vue的旅游管理系统设计与实战部署解析

1. 技术选型背后的那笔账:为什么是这套组合先把结论放在前面:这套源码的定位是"企业级",它不是那种只有一个景点列表和登录注册的教学Demo,而是真正扔到服务器上能持续跑业务、能扛住日常并发、能让人事后来改代码的完整…

作者头像 李华
网站建设 2026/10/13 10:49:46

机器视觉与机械臂智能跟随:从手眼标定到卡尔曼滤波实战

简介:面向计算机科学与技术专业毕业设计或课程作业的完整项目包,聚焦基于机器视觉的机械臂智能跟随系统,涵盖图像采集、目标检测与跟踪、机械臂控制、软硬件接口等关键环节。压缩包共616个文件,约52.72MB,类型以Python…

作者头像 李华
网站建设 2026/10/13 10:49:13

VS Code使用Anaconda conda环境全攻略:解释器切换与终端激活

很多人从PyCharm转到VS Code之后,第一个问的问题就是:我在Anaconda里明明建好了环境,怎么VS Code里找不到,或者找到了又不生效?PyCharm里只要在设置里指一下Interpreter就能用的体验,在VS Code里到底能不能…

作者头像 李华
网站建设 2026/10/13 10:48:19

SpringBoot+Vue实验报告管理系统:从部署到二次开发全流程实战

拿到这套基于SpringBoot和Vue的实验报告管理系统源码时,我第一反应是典型的教学管理类全栈项目。但真正动手把它从代码仓库变成能跑通、能交付的完整系统,才发现里面涉及的坑远比想象中多。这篇文章不打算写泛泛的架构科普,而是记录我从零开始…

作者头像 李华