上文提到,基於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便完成了。上述如有模糊或錯誤之處,還望各位不吝之處,抱拳了。