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

上文提到,基於CRM的二次開發是必不可少的,可是在實際項目中CI/CD是不可忽略的一個重要部分,與傳統的Java,Python項目不一樣,若是對Salesforce進行持續集成和持續部署呢?git

結合找到的各類資源,並加上以前Java和Python的CI/CD經驗,這裏設計了一套簡單的模版,若有錯誤,望各位大佬斧正。服務器


 

1. 系統結構圖

這裏的設計,主要利用了Ant的代碼遷移功能。性能

詳細知識可參考:https://developer.salesforce.com/docs/atlas.en-us.daas.meta/daas/meta_development.htmui

 

2. Jenkins配置

這裏選擇構建一個自由風格的軟件項目url

2.1 源碼管理

這裏選擇Git,找到對應的Git庫,而後clone其HTTP的連接,將其複製至Repository URLspa

2.2 建立憑據

建立憑據時,你能夠在Credentials後面點擊Add按鈕,而後選擇對應的項目庫,輸入用戶名和密碼,cs-jenkins.gen/******。設計

注意:這裏添加的憑據僅適用於該item,若是想要建立一個全局的憑據,須要在Jenkins項目的憑據欄添加全局憑據。固然添加的方式有多種,最經常使用的即是用戶名/密碼與公鑰/私鑰方式,若是感興趣能夠自行查閱相關資料。code

 2.3 Git添加用戶權限

【Repository Setting】 --> 【Repository Permissions】 --> 【User access】server

點擊git庫設置(左下角),而後點擊庫權限,添加可訪問用戶cs-jenkins.genxml

注意:除了添加單個用戶外,還可選擇添加某個用戶組,選擇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便完成了。上述如有模糊或錯誤之處,還望各位不吝之處,抱拳了。

相關文章
相關標籤/搜索