上文提到,基于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便完成了。上述若有模糊或错误之处,还望各位不吝之处,抱拳了。


 作者:吴家二少
本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 

Salesforce学习之路(四)利用Jenkins和Git实现Salesforce的CI/CD功能的更多相关文章

  1. Salesforce学习之路(十三)Aura案例实战分析

    Aura相关知识整合: Salesforce学习之路(十)Aura组件工作原理 Salesforce学习之路(十一)Aura组件属性<aura:attribute /> Salesforc ...

  2. Salesforce学习之路-developer篇(二)利用Jenkins和Bitbucket实现Salesforce的CI/CD功能

    上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...

  3. Salesforce学习之路-developer篇(五)一文读懂Aura原理及实战案例分析

    1. 什么是Lightning Component框架? Lightning Component框架是一个UI框架,用于为移动和台式设备开发Web应用程序.这是一个单页面Web应用框架,用于为Ligh ...

  4. Redis——学习之路四(初识主从配置)

    首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...

  5. Salesforce学习之路-developer篇(五)Aura组件原理及常用属性

    很喜欢曾经看到的一句话:以输出倒逼输入.以输出的形式强制自己学习,确实是高效的学习方式,真的很棒.以下仅为个人学习理解,如有错误,欢迎指出,共同学习. 1. 什么是Lightning Componen ...

  6. Salesforce学习之路(十)Aura组件工作原理

    很喜欢曾经看到的一句话:以输出倒逼输入.以输出的形式强制自己学习,确实是高效的学习方式,真的很棒.以下仅为个人学习理解,如有错误,欢迎指出,共同学习. 1. 什么是Lightning Componen ...

  7. Git学习之路(2)-安装GIt和创建版本库

    ▓▓▓▓▓▓ 大致介绍 前面一片博客介绍了Git到底是什么东西,如果有不明白的可以移步 Git学习之路(1)-Git简介 ,这篇博客主要讲解在Windows上安装Git和创建一个版本库 ▓▓▓▓▓▓ ...

  8. jenkins在aws eks中的CI/CD及slave

    本文档不讲解jenkins的基础用法,主要讲解配合k8s的插件,和pipeline的用途和k8s ci/cd的流程. 以及部署在k8s集群内和集群外的注意事项. 1.准备工作 以下在整个CI/CD流程 ...

  9. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作

    一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...

随机推荐

  1. 将AOSP源码导入到Android Studio进行查看

    生成iml和ipr文件 source build/envsetup.sh lunch aosp_x86-eng # 或者直接输入lunch,然后选择对应的target make idegen deve ...

  2. es命令测试

    1.新建索引并赋值 :put/索引名/文档名/id //文档名后面会逐渐取消 相当表 PUT /test1/type1/1{ "nmae":"hb", &quo ...

  3. Spring @Transactional注解和ReentrantLock同步锁同时使用不能同步的问题

    结论:如果在service层的方法上同时使用事务和同步锁无法保证数据同步. 1 @Service 2 public class ServiceImpl{ 3 4 private static Lock ...

  4. 开工大吉:TcaplusDB将持续为您提供可靠的数据服务

    开工大吉 新的一年 新的开始 我们也带着新的心意 向您奔赴而来    在此,TcaplusDB祝广大客户朋友,开工大吉,2021,我们将一如既往地守护您的数据,继续做您最坚实的后盾.    作为专为游 ...

  5. AI换脸

    AI换脸 技术 调用到百度的AI接口,layui的图片上传,栅格化布局 核心代码 纯py文件运行 # encoding:utf-8 import requests import base64 impo ...

  6. Linux下查看文件内容的几种常用命令

    [常用] 1,cat     由第一行开始显示内容,并将所有内容输出 cat的功能是将文件从第一行开始连续的将内容输出在屏幕上.但是cat并不常用,原因是当文件大,行数比较多时,屏幕无法全部容下时,只 ...

  7. SpringMVC-04 数据处理及跳转

    SpringMVC-04 数据处理及跳转 结果跳转方式 1.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析 ...

  8. MySQL基础知识:Character Set和Collation

    A character set is a set of symbols and encodings. A collation is a set of rules for comparing chara ...

  9. AbstractQueuedSynchronizer之AQS

    一.可重入锁 可参考:可重入锁和递归锁 1,定义 指的是同一线程外层函数获得锁后,再进入该线程的内层方法会自动获取锁(前提:锁对象是同一个对象). Java中的ReentranLock(显示锁)和Sy ...

  10. P3387 【模板】缩点 题解 (Tarjan)

    题目链接 P3387 [模板]缩点 解题思路 这几天搞图论,好有趣hhh,多写几篇博客. 上次学\(Tarjan\)求割点,这次缩点. 思路大概是多一个栈和染色的步骤,每次\(Tarjan\)的时候把 ...