本篇主要是为了后面讲述CI/CD时用到的工具做一个说明,先奉上spkl的github地址,没听说过的可以去查看下,挺不错的工具。
我们主要用这个工具来部署WebResource, Plugin和Workflow Activities 以及后续的CI
首先从nuget上下载工具包,
下载完后会看到一个spkl的文件夹和一个spkl.json的配置文件
在WebResource目录下建了两个js用于测试
下一步就是去配置spkl.json,将文件映射到系统的解决方案下,这里贴出我的POC环境下的配置供参考, 关键的就是我注释的几个配置,
"webresources": [
{
"profile": "default,debug",
//相对于配置文件的目录的相对路径
"root": "./Webresources/",
//解决方案名称
"solution": "DevopsWebResource",
"files": [
{
"uniquename": "ava_/Contact.js",//系统中的webresource名称
"file": "scripts/Contact.js",//文件路径
"description": ""
}
]
},
{
"profile": "default,debug",
"root": "./Webresources/",
"solution": "DevopsWebResource",
"files": [
{
"uniquename": "ava_/Test.js",
"file": "scripts/Test.js",
"description": ""
}
]
}
]
以上都配置完后就可以去发布了,到spkl文件夹下双击webresource的批处理文件"deploy-webresources.bat"
首次打开会让你输入系统的登录信息,输入URL后会弹登录框让你登录
登录后就会根据配置文件自动发布了, 批处理脚本会判断JS是否有更改,有更改才会发布,没更改就直接跳过了
当然也可以采用unattended的命令执行方式,以管理员身份运行cmd, cd到批处理文件所在目录,执行deploy-webresources.bat "连接字符串",这种unattended的方式也是后续CI中会用到的执行方式
url=https://xx.crm5.dynamics.com/;AuthType =ClientSecret;ClientId=ssxxxx28f-a166-3b54179c3a86;ClientSecret=xxxxxx2u~nmHXQco~;AppId =xxxxx79c3a86; RedirectUri = app://343fd800-95a9-4f75-9c59-0dde4990de54;
以上WebResource的自动发布方式就介绍完了,下面再介绍下Plugin
spkl的包下载后会有个CrmPluginRegistrationAttribute的说明文件,可以看下里面的内容,定义了Plugin注册所用到的内容,只需要在我们的Plugin头上注明当前Plugin的注册信息即可
Plugin的相关配置文件很简单,指定你Assembly所在的文件目录即可
"plugins": [
{
/*
Required - assemblypath - Relative path (from this file or the path parameter above) to the assembies to deply
Can be either plugins or workflow activities
Create multiple entries for different profiles
*/
"profile": "default,debug",
"assemblypath": ".\\bin\\debug"
/*
Optional - defines the regex to use to detect a plugin or workflow activity when using a custom base class
*/
//"classRegex": "((public( sealed)? class (?'class'[\\w]*)[\\W]*?)((?'plugin':[\\W]*?((IPlugin)|(PluginBase)|(Plugin)))|(?'wf':[\\W]*?CodeActivity)))"
}
]
然后就是执行Plugin的批处理命令
最后去插件注册器看下,已成功注册上了,好处是不用你再打开插件注册器手工去注册Plugin和Step等了
最后附上常用的几个注册说明供参考,具体可查看参数提示
[CrmPluginRegistration(MessageNameEnum.Create, "account", StageEnum.PreValidation, ExecutionModeEnum.Synchronous, "", "Pre Create Account", 1, IsolationModeEnum.Sandbox)]
[CrmPluginRegistration(MessageNameEnum.Create, "account", StageEnum.PostOperation, ExecutionModeEnum.Synchronous, "", "Post Create Account", 1, IsolationModeEnum.Sandbox)]
[CrmPluginRegistration(MessageNameEnum.Update, "account", StageEnum.PreValidation, ExecutionModeEnum.Synchronous, "name",
"Pre Update Account", 1, IsolationModeEnum.Sandbox, Image1Attributes = "", Image1Name = "preimage", Image1Type = ImageTypeEnum.PreImage)]
[CrmPluginRegistration(MessageNameEnum.Update, "account", StageEnum.PostOperation, ExecutionModeEnum.Synchronous, "name", "Post Update Account", 1, IsolationModeEnum.Sandbox)]