上文提到,基于CRM的二次开发是必不可少的,可是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不一样,若是对Salesforce进行持续集成和持续部署呢?git
结合找到的各类资源,并加上以前Java和Python的CI/CD经验,这里设计了一套简单的模版,若有错误,望各位大佬斧正。服务器
这里的设计,主要利用了Ant的代码迁移功能。性能
详细知识可参考:https://developer.salesforce.com/docs/atlas.en-us.daas.meta/daas/meta_development.htmui
这里选择构建一个自由风格的软件项目url
这里选择Git,找到对应的Git库,而后clone其HTTP的连接,将其复制至Repository URLspa
建立凭据时,你能够在Credentials后面点击Add按钮,而后选择对应的项目库,输入用户名和密码,cs-jenkins.gen/******。设计
注意:这里添加的凭据仅适用于该item,若是想要建立一个全局的凭据,须要在Jenkins项目的凭据栏添加全局凭据。固然添加的方式有多种,最经常使用的即是用户名/密码与公钥/私钥方式,若是感兴趣能够自行查阅相关资料。code
【Repository Setting】 --> 【Repository Permissions】 --> 【User access】server
点击git库设置(左下角),而后点击库权限,添加可访问用户cs-jenkins.genxml
注意:除了添加单个用户外,还可选择添加某个用户组,选择Group access便可。
接触过Jenkins的都知道,它有多种触发方式,但业内经常使用的方式通常为两种:定时器和轮询SCM。
定时器:顾名思义,每隔一段时间便从Git上拉取代码,而后触发构建。
轮询SCM:每隔一段时间,便向Git发送查询信息,查看指定分支代码是否改变,若是不变则跳过,若是代码变化,则触发构建。
这里选择轮询SCM,而且设置每隔五分钟便向Git查询一次(时间太长,会致使CI不及时;时间过短,调用API过于频繁形成性能损耗)
构建模块,是jenkins的核心,不一样于Java的Mvn打包的构建方式,这里采用Invoke Ant,直接将Sandbox1的代码迁移到Sandbox2中。
这里分为两步:ant迁移代码,将Jenkins工做空间代码提交至Git
关于ant在salesfroce中是如何作到代码迁移的,请参考:https://developer.salesforce.com/docs/atlas.en-us.daas.meta/daas/meta_development.htm
build.xml
1 <project name="Code Backup Without Folders" default="retrieve" basedir="." xmlns:sf="antlib:com.salesforce"> 2 <property file="build.properties"/> 3 <property environment="env"/> 4 5 <taskdef uri="antlib:com.salesforce" 6 resource="com/salesforce/antlib.xml" 7 classpath="ant-salesforce.jar"/> 8 9 <target name="deploy"> 10 <sf:deploy 11 username="${Sandbox2.username}" 12 password="${Sandbox2.password}" 13 serverurl="${sfProduction.serverurl}" 14 deployRoot="${Sandbox2.retrieveTarget}" 15 runAllTests="true" /> 16 </target> 17 <target name="retrieve"> 18 <git command='checkout' dir=""> 19 <args> 20 <arg value="${git.release}" /> 21 </args> 22 </git> 23 <git command="remote" dir=""> 24 <args> 25 <arg value="set-url" /> 26 <arg value="origin" /> 27 <arg value="https://${git.userName}:${git.password}@bitbucket/scm/cs-digitalization/sp.git" /> 28 </args> 29 </git> 30 <git command="pull" dir="" /> 31 <sf:retrieve username="${Sandbox1.username}" 32 password="${Sandbox1.password}" 33 serverurl="${sfSandbox.serverurl}" 34 retrieveTarget="./" 35 unpackaged="package.xml"/> 36 <echo message="Commiting all changes with message ${git.commitMessage}" /> 37 </target> 38 39 <macrodef name="git"> 40 <attribute name="command" /> 41 <attribute name="dir" /> 42 <element name="args" optional="true" /> 43 <sequential> 44 <echo message="Executing Command in folder @{dir}" /> 45 <echo message="git @{command}" /> 46 <exec executable="git" dir="@{dir}"> 47 <arg value="@{command}" /> 48 <args/> 49 </exec> 50 </sequential> 51 </macrodef> 52 </project>
1 if [ -n "$(git diff)" ] 2 then 3 git add . 4 git commit -m "Commiting all changes with message from Sandbox" 5 git remote set-url origin https://cs-jenkins.gen:******@bitbucket/scm/cs-digitalization/sp.git 6 git push -u origin release/dev 7 else 8 echo "Nothing changed" 9 fi
虽然上述流程并不复杂,甚至能够说是比较简单,可是在其中也着实踩了几个坑,这里简单提下遇到的问题以及解决的方案。
缘由:因为本人用的jenkins是公司提供的平台,是由多个实例组成的集群,因此每次触发时并不在某台固定的VM上,而且本人没有直接访问服务器的权限。说来可能运气比较差,遇到的几台VM上都没有成功装ant-salesfroce.jar包,故手动下载ant-salesforce.jar包,并上传是代码工程中,这样无论在哪台VM工做,在向Git拉取代码时,并会拉取该Jar包(22.6M)。固然,这是会增长拉取代码时间,因此如有访问Jenkins服务器权限的话,建议在服务器中直接安装。
解决方案:
1)下载ant-salesforce.jar包,并上传至代码工程。
下载连接:https://gs0.salesforce.com/dwnld/SfdcAnt/salesforce_ant_46.0.zip
2)build.xml中重定义依赖包位置。
1 <taskdef uri="antlib:com.salesforce" 2 resource="com/salesforce/antlib.xml" 3 classpath="ant-salesforce.jar"/>
缘由:虽然在jenkins中源码管理的地方配置了凭据,但这只用于连接,在提交时并无使用该用户,因此至关于匿名提交,这是Git所不容许的。
解决方案:手动设置git的remote url,并在url中显式配置用户名和密码。
git remote set-url origin https://cs-jenkins.gen:******@bitbucket/scm/cs-digitalization/sp.git
这样,一个基于Jenkins的Salesfroce CI/CD便完成了。上述如有模糊或错误之处,还望各位不吝之处,抱拳了。