【免费下载链接】susi_cortana_skill
A cortana skill which can be used to ask susi for answers: "Cortana, Ask Susi Who Are You"
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行):
- 清掉镜像中预装的旧
gcloud二进制; - 通过
curl https://sdk.cloud.google.com | bash安装最新版 GCloud SDK; 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.yml | CI 入口: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.md | GKE 集群从零到部署的完整图文指南 |
✅ 小结
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"
相关推荐
SUSI Skypebot的CI/CD流水线实战:Travis自动构建Docker镜像并更新K8s集群
SUSI Skypebot的CI/CD流水线实战:Travis自动构建Docker镜像并更新K8s集群 SUSI Skypebot 是一个基于 Bot Fram
susi_hangoutbot CI/CD实践:Travis CI如何自动构建镜像并一键更新Kubernetes中的AI机器人
susi_hangoutbot CI/CD实践:Travis CI如何自动构建镜像并一键更新Kubernetes中的AI机器人 susi_hangoutbot
Douyin Downloader 完全入门指南:快速批量下载无水印视频,整理你的收藏
Douyin Downloader 完全入门指南:快速批量下载无水印视频,整理你的收藏 你是不是也遇到过这样的场景:想保存某位创作者的抖音作品,只能一条一条复制
网页爬虫CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考