本文主要介绍镜像构建部署场景,多环境镜像晋级/复用最佳实践,保证“所发即所测”。
场景介绍
应用研发场景有效地管理镜像产物是确保软件快速、安全、可靠部署的关键环节。通常一个应用研发需要经过测试、预发、生产各个阶段,一种常用的研发模式如下:
测试阶段:流水线部署特性 feature 分支构建、部署,进行测试环境开发验证。
预发阶段:经过测试验证的 feature 分支通过 MR 代码合并请求提交到 master 分支,以主干分支构建镜像、部署预发布环境并提交测试验收。
生产阶段:预发布环境测试验收通过,直接以验收通过的镜像进行生产发布,保证“所发即所测”。
上述流程中,怎么知道哪个镜像版本是预发验收通过的、可用于生产发布的呢?基于云效 Flow 流水线,我们有以下两种实践。
实践1:通过「Flow流水线源」获取上一条流水线镜像产物
预发阶段流水线配置和运行:从代码源开始,拉取 master 分支构建镜像并推送到镜像仓库、并部署到预发环境进行预发布验收。预发布验收完成通常可由测试同学、发布负责同学共同点击确认「验证通过」。
生产阶段流水线配置:
添加 Flow流水线 源,选择上述预发流水线作为源,默认使用 最后一次成功执行 的版本。
生产环境部署任务,以 Kubernetes 镜像升级 任务为例,选择预发流水线的镜像产物进行部署。
生产发布运行:
选择预发 最后一次成功执行 版本运行生产流水线。
生产发布人工卡点验证通过。
生产环境部署任务直接拉取预发流水线最后一次验证通过的镜像发布。
此外,Flow 支持流水线运行事件自动触发下一条流水线运行。通常适用于测试、预发镜像传递场景,测试环境验收通过后,自动触发预发环境部署。
实践2:通过「ACR」制品源获取镜像
预发阶段流水线配置:从代码源开始,拉取 master 分支构建镜像并推送到镜像仓库;镜像标签可通过环境变量定义,如定义镜像版本号环境变量
R_VERSION
。
预发阶段流水线运行:运行预发流水线时,指定版本号构建部署。预发布验收完成通常可由测试同学、发布负责同学共同点击确认「验证通过」。
生产阶段流水线配置:
添加 制品源,选择 ACR 镜像仓库,指定本应用的仓库,指定默认版本号。
环境部署任务,以 Kubernetes 镜像升级 任务为例,选择 ACR 镜像地址部署。同时支持公网地址和VPC地址。
生产阶段发布运行:
选择指定 镜像版本 运行生产流水线。
生产发布人工卡点验证通过。
生产环境部署任务拉取指定镜像发布。
此外,为了降低生产发布版本号选择错误的风险,还可以额外开启版本号 过滤规则,约束仅满足规则的镜像版本才可用于生产部署。如仅满足myapp-V*
的才可用于生产发布。
进阶实践:引入 ACR 镜像扫描进行安全合规性检查
集成安全扫描工具是一种常用的安全合规性检查手段,在镜像推送至仓库前后进行自动扫描,检测潜在的安全漏洞、许可证问题和恶意软件。Flow 流水线支持集成 ACR 镜像扫描能力,开启制品源自动触发,支持 ACR 镜像扫描完成 后自动触发流水线运行,以保障只有扫描通过的镜像才可用于部署。典型使用场景如下:预发阶段镜像构建完成并推送到 ACR、自动触发 ACR 镜像扫描、ACR镜像扫描通过后自动触发预发环境部署。
配置预发 CI 流水线,从代码开始构建镜像并推送到 ACR 镜像仓库。
配置预发 CD 流水线:
流水线 ACR 制品源,开启制品源触发,触发事件选择 镜像扫描完成。
复制上述 Webhook 地址。
访问阿里云容器镜像服务控制台,进入流水线中配置的镜像仓库实例,点击事件通知->创建规则;设置事件规则名称、设置事件通知触发的事件类型(目前 Flow 仅接收镜像扫描完成和镜像推送完成两个事件自动触发)、设置事件生效范围(可设置镜像版本过滤的正则规则,在该镜像仓库下只有符合正则规则的镜像版本才会触发事件通知);下一步,通知方式选择HTTP,并将复制的 Webhook 地址配置到通知地址后保存即可。
配置预发环境部署任务,同上。
点击运行 CI 流水线构建镜像,推送到 ACR 镜像仓库,自动触发 ACR 镜像扫描,可以查看安全扫描结果。
镜像扫描通过,自动触发预发 CD 流水线运行,自动部署预发环境进行验证。