选项 1
假设您正在开发 Node Serverless 应用程序,部署一组具有相同 git 提交 ID 和 package-lock.json/yarn.lock 的新代码应该会产生相同的环境。这可以通过对不同阶段执行多个部署命令来实现,例如
sls deploy -s dev
sls deploy -s prod
有多种因素可能导致部署的环境不同,但这种风险应该非常低。这是您可以实施的最简单的 CI/CD 解决方案。
选项 2
如果您想不惜一切代价避免选项 1 带来的风险,您可以在管道中拆分包和部署阶段。在从已签出的代码库部署之前创建包:
sls package -s dev --package build/dev
sls package -s prod --package build/prod
根据需要存档,然后进行部署:
sls deploy -s dev --package build/dev
sls deploy -s prod --package build/prod
选项 3
这是选项 2 的改进版本。我没有尝试过这个解决方案,但它应该 theoretically be possible。 选项 2 的问题是您必须多次执行打包命令,这可能不可取 YMMV。为避免多次打包,请先创建包:
sls package -s dev --package build
然后部署:
# Execute a script to modify build/cloudformation-template-update-stack.json to match dev environment
sls deploy -s dev --package build
# Execute a script to modify build/cloudformation-template-update-stack.json to match prod environment
sls deploy -s prod --package build
如果您在build/cloudformation-template-update-stack.json 中有以下资源,例如:
"MyBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "myapp-dev-bucket"
}
},
你在sls deploy之前执行的脚本结果应该将CF资源修改为:
"MyBucket": {
"Type": "AWS::S3::Bucket",
"Properties": {
"BucketName": "myapp-prod-bucket"
}
},
这个选项当然意味着您的应用程序中不能有任何硬编码的资源名称,每个资源名称都必须从 serverless.yml 注入到您的 Lambda 中。