Salesforce學習之路(四)利用Jenkins和Git實現Salesforce的CI/CD功能


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM