上文提到,基於CRM的二次開發是必不可少的,但是在實際項目中CI/CD是不可忽略的一個重要部分,與傳統的Java,Python項目不同,如果對Salesforce進行持續集成和持續部署呢?
結合找到的各種資源,並加上之前Java和Python的CI/CD經驗,這里設計了一套簡單的模版,如有錯誤,望各位大佬斧正。
1. 系統結構圖
這里的設計,主要利用了Ant的代碼遷移功能。
詳細知識可參考:https://developer.salesforce.com/docs/atlas.en-us.daas.meta/daas/meta_development.htm
2. Jenkins配置
這里選擇構建一個自由風格的軟件項目
2.1 源碼管理
這里選擇Git,找到對應的Git庫,然后clone其HTTP的鏈接,將其復制至Repository URL
2.2 創建憑據
創建憑據時,你可以在Credentials后面點擊Add按鈕,然后選擇對應的項目庫,輸入用戶名和密碼,cs-jenkins.gen/******。
注意:這里添加的憑據僅適用於該item,如果想要創建一個全局的憑據,需要在Jenkins項目的憑據欄添加全局憑據。當然添加的方式有多種,最常用的便是用戶名/密碼與公鑰/私鑰方式,如果感興趣可以自行查閱相關資料。
2.3 Git添加用戶權限
【Repository Setting】 --> 【Repository Permissions】 --> 【User access】
點擊git庫設置(左下角),然后點擊庫權限,添加可訪問用戶cs-jenkins.gen
注意:除了添加單個用戶外,還可選擇添加某個用戶組,選擇Group access即可。
2.4 構建觸發
接觸過Jenkins的都知道,它有多種觸發方式,但業內常用的方式一般為兩種:定時器和輪詢SCM。
定時器:顧名思義,每隔一段時間便從Git上拉取代碼,然后觸發構建。
輪詢SCM:每隔一段時間,便向Git發送查詢信息,查看指定分支代碼是否改變,如果不變則跳過,如果代碼變化,則觸發構建。
這里選擇輪詢SCM,並且設置每隔五分鍾便向Git查詢一次(時間太長,會導致CI不及時;時間太短,調用API過於頻繁造成性能損耗)
2.5 構建
構建模塊,是jenkins的核心,不同於Java的Mvn打包的構建方式,這里采用Invoke Ant,直接將Sandbox1的代碼遷移到Sandbox2中。
這里分為兩步:ant遷移代碼,將Jenkins工作空間代碼提交至Git
- Invoke Ant
關於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>
- Execute Shell
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
3. FAQ
雖然上述流程並不復雜,甚至可以說是比較簡單,但是在其中也着實踩了幾個坑,這里簡單提下遇到的問題以及解決的方案。
3.1 Problem: failed to create task or type antlib:com.salesforce:retrieve
原因:由於本人用的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"/>
3.2 Problem: could not read Username for 'https://bitbucket.com': No such device or address.
原因:雖然在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便完成了。上述若有模糊或錯誤之處,還望各位不吝之處,抱拳了。