本篇参考:https://architect.salesforce.com/decision-guides/migrate-change
https://developer.salesforce.com/docs/atlas.en-us.sfdx_dev.meta/sfdx_dev/sfdx_dev_dev2gp.htm
很偶然看到了这篇文章,一下子就被吸引住了。尽管项目中的一些部署方式有用到过,考SF认证也有很多相关的靠题,也能二二三三的讲出点不同场景以及优缺点,但总不是很全面的了解,所以基于这篇进行一下翻译,也顺便让自己学习一下了。英语好的,直接看原文即可。
背景: 我们做项目不管是国内项目还是对日欧美项目,除了开发以外,少不了的要部署。可能针对一个字段的创建,直接生产创建,然后手动配置了FLS,或者部署一个 report type / report基于change set,又或者需要删除一个 apex class,通过 metadata api,比如使用ant,又或者是一个一两年的大型项目,使用 CI + CD的metadata api 部署。当然国内项目大部分都是二次开发为主,如果你是一个ISV,可能还要用到 managed package等等,那什么时候用到哪种部署方式呢? 作为新手可能想着是项目规定的,如果作为老手的话,还是可以基于官方的 best practice来进行一些参考,按照官方的建议,有七种不同的部署选项,从简单但不太可扩展的技术到更复杂但高度可扩展的方法依次是:
1. Manual Changes in Production
2. Change Sets
3. Metadata API: Direct Deployments
4. Metadata API: Deployment with Source Control + Continuous Integration
5. Org Dependent Packages
6. Unlocked Packaged
7. Managed Packages
下图中从左到右代表着部署方式更加的可扩展性。可扩展性意味着支持:
当然,在实际的项目中或者工作中,并不一定要求更高的可扩展性,因为需要可扩展性,一定需要牺牲或者需要付出一些东西,比如:
至少对于目前的场景来说, change set / metadata api / CI & CD metadata api可以搞定大部分项目的需要。
以下例举的是不同的部署模式所支持和不支持的选项。
1.Org-dependent package是Winter '21 release发布的测试版。
2.即使不使用scratch org创建包,它也必须能够部署到scratch org,否则包创建将失败。
3.每个依赖项必须在包中或另一个包中。
4.可以通过命令上的标志跳过包版本创建时的验证,以减少包构建时间。
后续内容是针对不同的场景下,每种部署方式的限制,优缺点(何时选择,何时不选择)以及如何减轻部署的风险。
一. Manual Change In Production
1. 限制: 最大的限制莫过于没法直接更改 apex class,实际项目中很少会遇见不更改 apex class的项目,所以如果有 apex class相关的更改,则忽略此种方式。
2. 什么场景下选择此种部署方式(优点):以下场景可以参考。
3. 什么场景下不建议选择此种部署方式。以下场景可以参考。
4. 减轻手动更改可能面临的风险:如果有只能手动完成的更改,则可以通过首先在sandbox中完成更改的步骤,测试结果,然后在生产中重复相同的一系列步骤来验证这些更改。总体来说就是在sandbox多测试。
二. Change Set
此种部署方式应该是小型项目中经常遇见的方式。
1. 限制:
2. 什么场景下选择此种部署方式(优点):以下场景可以参考。
3. 什么场景下不建议选择此种部署方式。以下场景可以参考。
4. 基于changeset部署转向到基于 metadata 部署:如果你的团队一直在使用change set,但正在考虑转移到基于源代码的部署,则可以通过Salesforce CLI检索change set。然后,一个CLI用户或脚本可以使用CLI命令通过名字检索change set并提取source。在这种情况下,我们便不使用 changeset方式进行部署,而是基于 metadata deploy方式。
三. Metadata API: Direct Deployments
Salesforce Metadata API 允许我们迁移metadata。当然我们实际场景中很少直接用 Metadata API,而是使用Ant脚本或者CLI。通过基于metadata部署方式,我们只需要针对我们想要部署的资源来添加或者修改即可。部署也只针对我们整理的资源,其他不在package.xml或者不在整理中的资源不会做任何操作。
1. 限制:
2. 什么场景下选择此种部署方式(优点):以下场景可以参考。
3. 什么场景下不建议选择此种部署方式。以下场景可以参考。
4. 减轻手动更改可能面临的风险:部署人员减少,找专人进行部署,当然这个在减轻风险的情况下,也可能出现瓶颈问题。
四. Metadata API: Deployment With Source Control And Continuous Integration
这种部署方式应该是作为开发人员最舒服的方式,程序员只需要关注自己的功能做好,然后创建自己的分支,上传自己的资源,merge到主分支即可。部署人员通过CI/CD的一些工具(Jenkins,dockers等)即可进行持续继承持续部署。
1. 限制(和第三个相同):
2. 什么场景下选择此种部署方式(优点):以下场景可以参考。
3. 什么场景下不建议选择此种部署方式。以下场景可以参考。
以下内容讲的是基于包的部署,那先来说一下包(package)的背景。
Salesforce自AppExchange推出以来就一直使用软件包,大多数管理员都熟悉在环境中安装的各种 managed package,比如conga什么的。第一代管理包主要是为这种ISV使用情况设计的。管理包的限制性很强;一旦你发布了一个包,有很多改变就不再被允许,因为开发者无法知道客户组织可能建立了什么依赖关系。也有一些客户使用非管理型软件包,这些软件包是不可能升级的。
第二代软件包是从源代码创建的,而不是从一个org的内容中创建的。现在的官方文档中,除了特意说明是第一代管理包之外,其他的说的package都是二代包(second-generation package),官方也建议除历史情况,否则都使用二代包。针对二代包的情况下,我们常说的有两种: unlocked & managed。接下来进入包部署的这几种情况。
包的基础知识
包的概念是有一个是有版本的metadata的子集。拥有以下特性
其他知识如下:
五. Org-Dependent Packages
Org-dependent 包在技术上是在创建时带有特殊标志(-skipvalidation)的unlocked package。它们依赖你的组织中的某些东西。比如你的 package的资源有一个flow,flow引用了自定义的notification type,这个 notifycation type还不支持打包。这种场景下这个包部署在你的环境中,只能乐观的认为你的环境存在 notification type。如果不存在,则抛出自定义异常。
1. 限制:
2. 什么场景下选择此种部署方式(优点):以下场景可以参考。
3. 什么场景下不建议选择此种部署方式。以下场景可以参考。
注: 老实说,项目中还没有用到过 Org-dependent package,感觉这种大部分场景都可以被 unlocked package取代而且unlocked package还很好使用。
六. Unlocked Packages
1. 限制:
2. 什么场景下选择此种部署方式(优点):以下场景可以参考。
3. 什么场景下不建议选择此种部署方式。以下场景可以参考。
4. 减轻手动更改可能面临的风险:对于打算用于非生产环境的软件包,你可以跳过软件包验证步骤在新窗口打开链接。这加快了打包过程,所以你可以更快部署并获得测试结果。如果你正在使用自动化测试和频繁的构建,这可能是有用的。
七. Managed Packages
Managed Package比Unlocked Package有更多的限制。它们通常是由AppExchange的合作伙伴使用的,他们希望防止客户在设计时没有被依赖的代码或组件上创建依赖关系。
1. 限制:
2. 什么场景下选择此种部署方式(优点):以下场景可以参考。
3. 什么场景下不建议选择此种部署方式。以下场景可以参考。
总结:上述内容为SF官方整理的一些部署方式以及这些部署方式的适用场景以及不适用场景。文中后续还有很多其他知识的介绍,感兴趣的小伙伴可以自行查看。我们实际项目中,可能manual / changeset/ metadata部署使用的较多。基于 package的话 unlocked package偶尔也会使用。其他两种目前本人还没有使用过,当然好的部署模式不如好的部署习惯。找一个自己最擅长的,最不出错的更佳。篇中有错误地方欢迎指出,有问题欢迎留言。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章