- 后端
- 云原生
- 微服务
【免费下载链接】kubeless
Kubernetes Native Serverless Framework
Kubeless 是一个 Kubernetes 原生的 Serverless 框架,其版本发布完全由 CI 流水线驱动:开发者只需给 master 分支打上 Git Tag,流水线便会自动构建多平台二进制、由 jsonnet 生成部署 YAML、创建 GitHub Release 草稿并上传全部资产。本文以 docs/release-flow.md 为主线,结合当前仓库中的 .circleci/config.yml、script/create_release.sh、script/release_utils.sh 与 Makefile 等实现,完整还原这套"打 Tag 即发布"的流水线设计,读完你可以掌握 Serverless 项目自动化发布的全链路细节,并可直接借鉴到自己的 Kubernetes 项目中。
发布产物与整体触发模型
一个 Kubeless Release 包由两部分组成:
- 多平台 kubeless 二进制:官方文档明确支持 linux 与 osx 两个平台;从当前仓库的 script/binary-cli 看,实际交叉编译范围已覆盖
darwin / linux / windows三个平台的amd64架构(对应OS_PLATFORM_ARG=(-os="darwin linux windows")、OS_ARCH_ARG=(-arch="amd64")),使用gox输出到bundles/kubeless_{{.OS}}-{{.Arch}}/kubeless。 - 部署 controller 的 YAML 文件:由 kubeless.jsonnet 等 jsonnet 模板通过
kubecfg转换而来,用于安装 kubeless-controller 及配套 CRD、RBAC 等资源。
发布流程的触发模型非常简单——一次 Git Tag 提交即触发一次完整发布。当 master 分支上的某个 commit 被打上标签后,CI 会启动一个专门的发布任务,构建并上传资产到 GitHub Releases 页面,以标签名作为新 Release 的名称。
需要说明的是:原始文档描述的流水线基于 Travis CI(其配置位于.travis.yaml的before_deploy与deploy段)。当前仓库已将该流程迁移至 CircleCI(仓库根目录仅有 .circleci/config.yml,未见.travis.yml),但流程骨架——打 Tag → CI 构建资产 → 创建 Draft Release → 人工审核发布——保持一致。下文先按文档讲解流程,再给出当前仓库的落地实现对照。
发布前的检查清单
在创建新 Release 之前,文档要求先做一轮回归验证,确保 Kubeless 生态内的相关项目不会因为新变更出现回归:
- 用最新 master 部署 Kubeless:基于 master 的最新 commit 部署,使用 tag 为
latest的 controller 镜像,并确认 Travis(现为 CI)构建的最新 controller 镜像正在被使用。 - 验证生态项目兼容性:手工测试以下两个项目对最新版本的支持情况:
- Serverless Plugin(serverless-kubeless)
- Kubeless UI(kubeless-ui)
- 如果在手工测试中发现任何错误,必须在发布前修复。
这一环节的本质是"镜像先行、生态验证、再打 Tag":只有latest镜像与生态项目都验证通过,才允许触发正式版本发布。
触发机制与发布条件
Release 由 GitHub Tag 触发,其启用条件定义在 CI 配置的on段(Travis 时代)或 workflow 的filters(CircleCI 时代),文档给出了三条明确规则:
| 条件 | 说明 |
|---|---|
| 提交被打了 Tag | 只有 tag 提交才触发发布,普通分支提交不触发 |
仓库为kubeless/kubeless | 保证 fork 仓库的构建不会误发正式 Release |
仅os: linux、go: 1.8的 Travis job 可执行发布 | 限定单一发布执行者,避免多 job 并发重复创建 Release |
对照当前仓库 .circleci/config.yml 中的releasejob:
- release: filters: tags: only: /v.*/ # 仅 /v.*/ 形式的 tag 触发 branches: ignore: /.*/ # 任何分支提交都不触发 requires: - minikube - minikube_build_functions - GKE可以看出当前实现把触发条件收紧为"标签必须以v开头(/v.*/)且忽略所有分支",并且发布 job 会等待 minikube、函数构建、GKE 等测试全部通过后才执行,进一步保证了"发布前测试必须全绿"的约束。此外,当前 CI 使用的 Go 版本也从文档时代的 1.8 演进为circleci/golang:1.15镜像(.circleci/config.yml)。
资产准备阶段:构建与打包
在正式发布前,需要先准备两类资产:kubeless 二进制与部署 YAML,同时构建并推送 controller 镜像。
多平台二进制构建
控制器二进制通过 script/binary-controller 构建(默认linux/amd64,目标为kubeless-function-controller),CLI 二进制则通过 script/binary-cli 交叉编译:
OS_PLATFORM_ARG=(-os="darwin linux windows") OS_ARCH_ARG=(-arch="amd64") GIT_COMMIT=$(git describe --tags --dirty) BUILD_FLAGS=(-ldflags="-w -X github.com/kubeless/kubeless/pkg/version.Version=${GIT_COMMIT}") gox "${OS_PLATFORM_ARG[@]}" "${OS_ARCH_ARG[@]}" \ -output="bundles/kubeless_{{.OS}}-{{.Arch}}/kubeless" \ "${BUILD_FLAGS[@]}" \ ./cmd/kubeless关键点是版本号通过-ldflags在编译期注入:pkg/version.Version是一个在 pkg/version/version.go 中声明的空字符串变量(注释明确写着 "Version will be set automatically by the build system via -ldflags"),构建时由git describe --tags --dirty得到的值填充,因此每个 Release 的二进制都能准确报告自己的版本。
从 jsonnet 生成部署 YAML
部署 YAML 并非手写,而是由 jsonnet 模板经kubecfg渲染生成。这一转换规则直接定义在 Makefile 中:
%.yaml: %.jsonnet $(KUBECFG) show -U https://raw.githubusercontent.com/kubeless/runtimes/master -o yaml $< > $@.tmp mv $@.tmp $@ all-yaml: kubeless.yaml kubeless-non-rbac.yaml kubeless-openshift.yaml仓库中的 kubeless.jsonnet、kubeless-non-rbac.jsonnet、kubeless-openshift.jsonnet 就是三个 YAML 的源模板:它们定义了 controller 的 Deployment、ServiceAccount、CRD(functions.kubeless.io、httptriggers.kubeless.io、cronjobtriggers.kubeless.io)、kubeless-config ConfigMap 以及(在 RBAC 版本中)controller 所需的 ClusterRole 规则。例如kubeless-non-rbac.jsonnet中的 ConfigMap 即通过configMap.data(...)注入runtime-images、ingress-enabled、service-type等运行参数。
controller 镜像与 sha256 digest 更新
kubeless-controller 会以 Docker 镜像形式构建并推送到 Bitnami 的 DockerHub 仓库(当前 docker/function-controller/Dockerfile 基于bitnami/minideb:jessie构建)。文档特别强调了一个细节:Kubeless 使用 sha256 digest 来标注部署时拉取的镜像,因此新版本发布时必须同步更新这些 digest。
这一点在当前仓库中可以找到实例证据:kubeless-non-rbac.jsonnet 的 ConfigMap 中:
configMap.data({"provision-image": "kubeless/unzip@sha256:e867f9b366ffb1a25f14baf83438db426ced4f7add56137b7300d32507229b5a"})即provision-image以镜像@sha256:<digest>的不可变形式引用,正是文档所说"用 sha256 digest 标注待部署镜像"的实际体现——升级版本时这些 digest 必须随之更新,否则安装的仍是旧镜像。
另外,当前 CircleCI 的buildjob 会通过 sed 将 manifest 中的:latest批量替换为版本 Tag(sed -i.bak 's/:latest/'":${CONTROLLER_TAG}"'/g' ${f}.yaml),并持久化到 workspace 供后续 job 使用;push_latest_imagesjob 则负责在 master 分支把新镜像重新打上latest标签并推送,这正是"发布前检查"中提到的latest镜像来源。
发布阶段:创建 Draft 并上传资产
发布阶段的核心动作在 script/create_release.sh 中实现,其工作流为:
- 校验 GitHub Token(
ACCESS_TOKEN)是否存在; - 校验目标仓库存在;
- 调用 GitHub Releases API 创建一个DraftRelease(
"draft": true); - 为每个 manifest(
kubeless、kubeless-non-rbac、kubeless-openshift)复制出${f}-${TAG}.yaml并作为资产上传; - 遍历
bundles/kubeless_*.zip,把各平台二进制包一并上传。
对应的当前 CircleCIreleasejob:
- run: make VERSION=${CIRCLE_TAG} binary-cross - run: for d in bundles/kubeless_*; do zip -r9 $d.zip $d/; done - run: ./script/create_release.sh ${CIRCLE_TAG} "${MANIFESTS}"其中MANIFESTS: kubeless kubeless-non-rbac kubeless-openshift(.circleci/config.yml)定义了随 Release 发布的三个部署清单。
加密 API Key 与权限要求
文档说明deploy段使用加密后的 GitHub Token,其 scope 为public_repo(足以创建 Release 并上传公开资产)。在 script/create_release.sh 中可以看到 Token 以Authorization: token $ACCESS_TOKEN的形式注入 GitHub API 请求,用于创建 Release(POST /repos/{owner}/{repo}/releases)与上传资产(POST /repos/{owner}/{repo}/releases/{id}/assets)。
Release Notes 的自动生成
一个很实用的细节在 script/release_utils.sh 中:commit_list函数通过 GitHub API 获取上一个 Tag,然后用git log $previous_tag..$tag --oneline拉取两个版本之间的全部提交作为发布说明;get_release_body则把说明组装进 Release 的 JSON body 中,并固定设置:
"tag_name": "'$tag'", "target_commitish": "master", "name": "'$tag'", "draft": true, "prerelease": false这意味着流水线创建的永远是一个Draft(草稿),不会自动对外公开;同时 body 中还会附带三套安装指引(带 RBAC / 不带 RBAC / OpenShift),分别提示使用kubectl create -f或oc create -f安装对应版本的<manifest>-<tag>.yaml清单。创建完成后,Draft 会出现在 Releases 页面。
发布后的人工审核与 Publish
由于流水线生成的是 Draft,最终是否对外发布掌握在维护者手中。文档要求执行以下人工审核:
- 核对 Release Notes:检查自动生成的提交列表,并补充本次版本变更的摘要;
- 删除无用信息:清理对用户没有价值的内部提交记录;
- 突出破坏性变更(breaking changes):如果有不兼容变更,必须在说明中显著标注;
- 完成审核后点击Publish,新版本即对所有用户可见。
这一"自动创建 + 人工发布"的设计既保证了发布效率,又给维护者留出了质量把关的窗口,是开源项目发布流程的常见最佳实践。
发布后同步升级生态项目
新版本公开后,还有若干生态项目/文件需要同步指向最新版本。文档明确指出这些步骤适合放到发布 job 中自动化,具体包括:
| 目标 | 需要做的更新 |
|---|---|
| Kubeless 文档站点 | 在 kubeless-website 项目上重建最后一次 CI 构建,使 kubeless.io 文档指向最新版本 |
| Kubeless chart | 更新本仓库chart目录中各镜像的引用或其他必要变更 |
| Serverless Plugin | 在其.travis文件中把KUBELESS_VERSION环境变量更新为最新版本 |
| Brew 配方(可选) | homebrew-core仓库会自动生成包含新版本与 commit ID 的 PR;除非配方需要破坏性变更,通常由 homebrew 团队处理更新;特殊情况才需手工修改配方 |
其中 Serverless Plugin 的KUBELESS_VERSION是一个值得注意的联动点:插件正是靠这个变量感知 kubeless CLI 的版本范围,从而决定生成的配置是否兼容当前集群,因此"先发版本、再同步插件"的先后顺序不能颠倒。
当前仓库实现对照速览
为了方便读者直接在仓库中追踪整个发布链路,这里按执行顺序给出关键文件的对照清单:
- 流水线入口与触发过滤:.circleci/config.yml(
releasejob、/v.*/tag 过滤、MANIFESTS定义) - 二进制交叉编译:script/binary-cli、script/binary-controller(gox +
-ldflags注入pkg/version.Version) - YAML 生成:Makefile 的
%.yaml: %.jsonnet规则 + kubeless.jsonnet、kubeless-non-rbac.jsonnet(含 sha256 digest 镜像引用) - 版本注入点:pkg/version/version.go
- 发布与资产上传:script/create_release.sh
- Release Notes 生成与 Draft 属性:script/release_utils.sh
小结
Kubeless 的发布流程向我们展示了一条"低人工干预、高可控性"的自动化发布流水线:Git Tag 触发 → 多平台交叉编译 → jsonnet 渲染 YAML → 镜像推送与 digest 更新 → 创建 Draft Release 并上传资产 → 人工审核后 Publish → 同步升级生态项目。其中三个设计点尤其值得复用:一是用-ldflags在编译期注入版本号,保证二进制与 Tag 一一对应;二是用 jsonnet 模板 + kubecfg 渲染部署清单,让 YAML 的生成可编程、可复用;三是始终先创建 Draft 而非直接公开,把最终质量决策留给维护者。对于任何以 Kubernetes 为底座、需要频繁发布的项目,这套流程都有直接的参考价值。
- 后端
- 云原生
- 微服务
【免费下载链接】kubeless
Kubernetes Native Serverless Framework
相关推荐
hls.js 发布流程指南:从 Git Tag 到 npm / GitHub Release 的自动化实践
hls.js 发布流程指南:从 Git Tag 到 npm / GitHub Release 的自动化实践 导读 本文以 docs/release proces
音视频前端GitHub Release Notes 技能详解:从 Git Tag 到发布说明的完整自动化流程
GitHub Release Notes 技能详解:从 Git Tag 到发布说明的完整自动化流程 导读 本文基于 React Cosmos 仓库内置的 gh
开发工具前端测试mitmproxy 版本发布全流程解析:从 Release Checklist 到多平台自动分发
mitmproxy 版本发布全流程解析:从 Release Checklist 到多平台自动分发 本文基于 mitmproxy 仓库中的官方发布检查清单( re
网络安全网络开发工具接口测试
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考