Custom Container 的 CI/CD 最佳实践案例
在实际生产过程中,我们往往会遇到这样一个通用的项目持续发布的流程:
Git Clone -> Docker Build -> Docker Push -> Deploy Function
这样一个简单的流程,却在很多工具中难以实现,或者过于复杂,那么在 Serverless 架构下,通过 Serverless devs 如果来解决这个流程呢?
准备一个 Github 仓库
这个仓库包括了以下的内容:
用户的代码
构建镜像所需要的 Dockerfile
部署所需要的资源描述文件
一些流程脚本
以仓库anycodes/CustomContainerDemo 为例,可以看到这是一个 Node.js 的项目,其中:
用户的代码
server.js
package.json
构建镜像所需要的 Dockerfile
Dockerfile
部署所需要的资源描述文件
s.yaml
一些流程脚本
setup.sh
其他文件
Github Action 文件
version(描述景象 tag 的文件)
关于一些流程
在整个项目中,包括两个流程:
Github Action 的流程
自定义 Setup.sh 流程
Github Action 的流程
这个流程主要是一些环境的初始化等:
整个过程为确定 nodejs 环境,安装 Serverless Devs,配置密钥信息(可以参考如何通过Github Action使用Serverless Devs做CI/CD - 账号信息配置)
完成上述的初始化和密钥配置之后,可以直接执行我们的流程./setup.sh
自定义 Setup.sh 流程
该流程也是比较简单的,主要做了几个事情:
明确我的镜像 registry 地址和 tag(此处 tag 是从 version 文件读取的)
通过 serverless devs fc 组件提供的 build 能力,进行构建操作
通过 deploy 方法进行项目部署
这里有一个问题:谁给我进行的 docker build 以及谁给我进行的 docker push?
在本例子中
docker build
行为是由 serverless devs 帮做的,但是此出也可以不选择s build
,可以选择更为原生的docker build
在本例子中,在进行
s deploy
的时候,会有一个参数叫做--push-registry acr-internet
,此时可以注意该参数有两个可选:
可以根据自己需求,选择:
'acr-internet': 目标 registry 地址设为公网地址。
'acr-vpc': 目标 registry 地址设为专有网络(vpc)地址。
'${registry url}': 自定义 registry 地址。
关于上述整个操作的基本流程:
整个流程基本是:
项目测试
由于我在 Github Action 中声明的是:
所以,此时我只需要 push 代码,即可触发发布流程:
部署后的地址效果:
案例总结与注意事项
在上面的步骤中,我们进行了密钥的配置:
这里面其实最后有一个参数是-a publish_access
,它的含义是为当前密钥指定一个别名,因为 Serverless Devs 支持多密钥的,所以为当前密钥配置一个别名,在以后的使用过程中可以指定,例如在当前的 Yaml 中,第三行有:
用来指定使用该密钥,测试的 Yaml 配置如下:
完整的 Yaml 配置可以参考:https://github.com/devsapp/fc/blob/main/docs/Others/yaml.md
在上面的 Yaml 中,其实可以看到image: ${env(image)}
,其实 Serverless Devs 的 Yaml 支持多种形式的变量:
获取当前机器中的环境变量:{env(secretId)}
获取外部文档的变量:{file(./path)}
获取全局变量:${vars.*}
获取其他项目的变量:${projectName.props.*}
获取 Yaml 中其他项目的结果变量:${projectName.output.*}
实战举例,例如当我需要访问数据库等,此时我并不想把密钥明文配置到 Yaml 中,此时可以考虑,将密钥配置到环境变量中,进行直接使用。
关于 构建 问题:
如果使用 s build --use-docker
构建镜像,则需要确保 s.yml 中的 codeUri
字段指向的目录中包含 Dockerfile
。
关于 权限 问题:
如果配置的密钥权限不够(例如是子账号),则可能会导致用户无法创建某些权限,进而导致部署不成功,这个时候可以考虑让主账号创建好相关的 Role,并且在此处指定:
关于密钥最小权限:
AliyunFCFullAccess
AliyunContainerRegistryFullAccess
关于所绑定的 Role 的最小权限:
AliyunContainerRegistryReadOnlyAccess
版权声明: 本文为 InfoQ 作者【刘宇】的原创文章。
原文链接:【http://xie.infoq.cn/article/3901b8d05ed86bd95655970a9】。文章转载请联系作者。
评论