{"id":4276,"date":"2015-03-23T00:29:20","date_gmt":"2015-03-23T00:29:20","guid":{"rendered":"http:\/\/www.jitendrazaa.com\/blog\/?p=4276"},"modified":"2015-03-23T04:03:00","modified_gmt":"2015-03-23T04:03:00","slug":"continuous-integration-in-salesforce-using-jenkins-and-git-video-tutorial","status":"publish","type":"post","link":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/continuous-integration-in-salesforce-using-jenkins-and-git-video-tutorial\/","title":{"rendered":"Continuous integration in Salesforce Using Jenkins and Git | Video Tutorial"},"content":{"rendered":"<p style=\"text-align: justify;\">As your Salesforce Organization undergoes heavy customization and frequent builds, moving changes from one Sandbox to other sandboxes starts taking longer time and effort. Also, in normal Salesforce project, there are chances that you will have minimum three sandboxes likely Developer Sandbox, QA Sandbox and UAT Sandbox. After some time you will be in need of some solution which can reduce your effort.<\/p>\n<p style=\"text-align: justify;\">Almost 5 years back, when I was working on .net along with Salesforce, I posted <a title=\"Automate Builds using SVN, MSBuild, Cruise Control\" href=\"http:\/\/www.codeproject.com\/Articles\/70327\/Automate-Builds-using-SVN-MSBuild-Cruise-Control\">article on Continuous Integration of ASP.net and subversion as a code management with MSBuild on code project<\/a>.<\/p>\n<p style=\"text-align: justify;\">This time its Salesforce using Jenkins.\u00a0In this article I will walk through solution of above\u00a0problem using <a title=\"Continuous integration Using Jenkins\" href=\"https:\/\/jenkins-ci.org\/\">Jenkins<\/a>. Don&#8217;t forget to watch Video at end of this article, where I provided demo of everything explained in this article.<\/p>\n<p>Prerequisite Software:<\/p>\n<ol>\n<li><a title=\"ANT\" href=\"https:\/\/ant.apache.org\/bindownload.cgi\">ANT<\/a><\/li>\n<li><a title=\"Salesforce Migration Tool\" href=\"http:\/\/www.salesforce.com\/us\/developer\/docs\/daas\/Content\/forcemigrationtool_install.htm\">Salesforce Migration Tool<\/a><\/li>\n<li><a title=\"Git Version Control\" href=\"http:\/\/git-scm.com\/downloads\">Git<\/a><\/li>\n<li><a title=\"Generate SSH key using Eclipse\" href=\"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/authenticate-git-using-ssh-protocol-with-eclipse-and-egit-salesforce\/\">Eclipse <\/a>or <a title=\"Generate SSH key using PuTTYgen\" href=\"http:\/\/winscp.net\/eng\/docs\/ui_puttygen\">PuTTYgen\u00a0<\/a>to generate SSH key<\/li>\n<\/ol>\n<p>I am assuming\u00a0you already know about below concepts:<\/p>\n<ol>\n<li><a title=\"Salesforce + Git + Eclipse + EGIT = Better and Distributed Source Control\" href=\"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/salesforce-git-eclipse-egit-better-and-distributed-source-control\/\">How to use Git with Salesforce<\/a><\/li>\n<li><a title=\"Complete Salesforce Deployment Guide using Ant Migration Tool\" href=\"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/salesforce-migration-tool-ant\/\">Using ANT migration tool in Salesforce<\/a><\/li>\n<li><a title=\"Authenticate Git using SSH protocol with Eclipse and Egit \u2013 Salesforce\" href=\"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/authenticate-git-using-ssh-protocol-with-eclipse-and-egit-salesforce\/\">Generating SSH key<\/a><\/li>\n<li><a title=\"Automated Daily Backup of Salesforce Using ANT Migration Tool and GIT\" href=\"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/automated-daily-backup-using-ant-migration-tool-and-git\/\">Automated Daily Backup of Salesforce Using ANT Migration Tool and GIT<\/a>\u00a0<em>(Optional)<\/em><\/li>\n<\/ol>\n<p>I will suggest to get familiar with first three\u00a0topics before jumping to Continuous Integration.<\/p>\n<p>There are two ways to start working with Jenkins<\/p>\n<ol>\n<li>Install Jenkins on your local system<\/li>\n<li>Use <a title=\"Jenkins on CloudBees\" href=\"https:\/\/grandcentral.cloudbees.com\/login\">Cloudbees <\/a>online<\/li>\n<\/ol>\n<p>Below diagram shows complete flow of Continuous Integration we are going to setup in this article.<\/p>\n<figure id=\"attachment_4310\" aria-describedby=\"caption-attachment-4310\" style=\"width: 625px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Continuous-integration-in-Salesforce-Using-Jenkins-and-Git.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4310\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Continuous-integration-in-Salesforce-Using-Jenkins-and-Git.png?resize=625%2C338&#038;ssl=1\" alt=\"Continuous integration in Salesforce Using Jenkins and Git\" width=\"625\" height=\"338\" srcset=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Continuous-integration-in-Salesforce-Using-Jenkins-and-Git.png?resize=1024%2C553&amp;ssl=1 1024w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Continuous-integration-in-Salesforce-Using-Jenkins-and-Git.png?resize=300%2C162&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Continuous-integration-in-Salesforce-Using-Jenkins-and-Git.png?resize=624%2C337&amp;ssl=1 624w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Continuous-integration-in-Salesforce-Using-Jenkins-and-Git.png?w=1453&amp;ssl=1 1453w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><\/a><figcaption id=\"caption-attachment-4310\" class=\"wp-caption-text\">Continuous integration in Salesforce Using Jenkins and Git (Bit Bucket)<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">For this tutorial, I will install Jenkins on my local system. To install it, Navigate to Jenkins homepage and <a title=\"Download Jenkins Package\" href=\"https:\/\/jenkins-ci.org\/content\/about-jenkins-ci\">download installer<\/a>.<!--more--><\/p>\n<p style=\"text-align: justify;\">During installation, you may be prompted to install Jenkins as &#8220;Windows Service&#8221;, click yes for that option. Once installed navigate to &#8220;http:\/\/localhost:8080&#8221;, and you should be able to Jenkins homepage.<\/p>\n<p style=\"text-align: justify;\"><strong>Installing Git plugin<\/strong><\/p>\n<p style=\"text-align: justify;\">By default Jenkins does not provide support for Git, so we will need to install it separately.<\/p>\n<p style=\"text-align: justify;\">To install Git Plugin, Navigate to &#8220;Jenkins Homepage | Manage Jenkins | Manage Plugins | Available&#8221; and search for Git. From available list, install &#8220;Git Plugin&#8221;. I would suggest to install &#8220;Bitbucket Plugin&#8221; as well.<\/p>\n<p style=\"text-align: justify;\"><strong>Installing chatter Plugin<\/strong><\/p>\n<p style=\"text-align: justify;\">Once Git plugin is installed, we will need to install chatter plugin as well from <a title=\"Jenkins Chatter Plugin\" href=\"https:\/\/github.com\/superfell\/JenkinsChatterPlugin\">superfell&#8217;s\u00a0github repository<\/a>. Assuming you already have Maven installed on your system, download above repository as a zip and extract it on your system. After extract, run command &#8220;mvn&#8221; in that directory. It will create folder by name &#8220;target&#8221; and plugin file by name &#8220;ChatterPlugin.hpi&#8221; would be available.<\/p>\n<p style=\"text-align: justify;\">If you don&#8217;t want to perform maven build then you can bypass above step and <a title=\"ChatterPlugin.hpi\" href=\"https:\/\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/ChatterPlugin.hpi_.txt\">download file from here<\/a>, however it is always suggested to build file from latest repository code. If you are downloading &#8220;ChatterPlugin.hpi&#8221; from my website then don&#8217;t forget to rename file to &#8220;ChatterPlugin.hpi&#8221;.<\/p>\n<p style=\"text-align: justify;\">Once you have &#8220;ChatterPlugin.hpi&#8221; file on your system, you need to install it into Jenkins. Navigate to &#8220;Jenkins Homepage | Manage Jenkins | Manage Plugins | Advanced | Upload Plugin&#8221;. Select &#8220;ChatterPlugin.hpi&#8221; and upload it.<\/p>\n<p style=\"text-align: justify;\"><strong>Salesforce migration ANT script<\/strong><\/p>\n<p style=\"text-align: justify;\">Now, we need to create &#8220;build.xml&#8221; to retrieve changes from one Org and Deploy to other Org. Assuming, <a title=\"How to use ANT Migration Tool\" href=\"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/salesforce-migration-tool-ant\/\">you already know how to use ANT Migration tool<\/a> I will directly show code snippet of my &#8220;build.xml&#8221; file.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;project name=&quot;Code Backup Without Folders&quot; default=&quot;retrieve&quot; basedir=&quot;.&quot; xmlns:sf=&quot;antlib:com.salesforce&quot;&gt;\r\n\t&lt;property file=&quot;build.properties&quot;\/&gt;\r\n\t&lt;property environment=&quot;env&quot;\/&gt;\r\n  &lt;target name=&quot;Deploy&quot;&gt;\r\n\t&lt;sf:deploy\r\n\t\t\tusername=&quot;${Sandbox2.username}&quot;\r\n\t\t\tpassword=&quot;${Sandbox2.password}&quot;\r\n\t\t\tserverurl=&quot;${sfSandbox.serverurl}&quot;\r\n\t\t\tdeployRoot=&quot;${Sandbox2.retrieveTarget}&quot;\r\n\t\t\trunAllTests=&quot;true&quot; \/&gt;\r\n  &lt;\/target&gt;\r\n  &lt;target name=&quot;retrieve&quot;&gt;\r\n\t  &lt;sf:retrieve username=&quot;${Sandbox1.username}&quot;\r\n\t\t\t\t   password=&quot;${Sandbox1.password}&quot;\r\n\t\t\t\t   serverurl=&quot;${sfSandbox.serverurl}&quot;\r\n\t\t\t\t   retrieveTarget=&quot;${Sandbox1.retrieveTarget}&quot;\r\n\t\t\t\t   unpackaged=&quot;${Sandbox1.unpackaged}&quot;\/&gt;\r\n        &lt;echo message=&quot;Commiting all changes with message ${gt.commitMessage}&quot; \/&gt;\r\n\t\t&lt;git command=&quot;add&quot; dir=&quot;${Sandbox1.gitDirectory}&quot;&gt;\r\n\t\t\t&lt;args&gt;\r\n\t\t\t\t&lt;arg value=&quot;.&quot; \/&gt;\r\n\t\t\t&lt;\/args&gt;\r\n\t\t&lt;\/git&gt;\r\n\t\t&lt;git command=&quot;commit&quot; dir=&quot;${Sandbox1.gitDirectory}&quot;&gt;\r\n\t\t\t&lt;args&gt;\r\n\t\t\t\t&lt;arg value=&quot;-am ${gt.commitMessage}&quot; \/&gt;\r\n\t\t\t&lt;\/args&gt;\r\n\t\t&lt;\/git&gt;\r\n\t&lt;\/target&gt;\r\n\t&lt;macrodef name=&quot;git&quot;&gt;\r\n\t\t&lt;attribute name=&quot;command&quot; \/&gt;\r\n\t\t&lt;attribute name=&quot;dir&quot; \/&gt;\r\n\t\t&lt;element name=&quot;args&quot; optional=&quot;true&quot; \/&gt;\r\n\t\t&lt;sequential&gt;\r\n            &lt;echo message=&quot;Executing Command in folder @{dir}&quot; \/&gt;\r\n            &lt;echo message=&quot;git @{command}&quot; \/&gt;\r\n\t\t\t&lt;exec executable=&quot;git&quot; dir=&quot;@{dir}&quot;&gt;\r\n\t\t\t\t&lt;arg value=&quot;@{command}&quot; \/&gt;\r\n\t\t\t\t&lt;args\/&gt;\r\n\t\t\t&lt;\/exec&gt;\r\n\t\t&lt;\/sequential&gt;\r\n\t&lt;\/macrodef&gt;\r\n&lt;\/project&gt;\r\n<\/pre>\n<p style=\"text-align: justify;\">Username, Passwords and other values are coming from &#8220;build.properties&#8221; file. As you can see in above code, Changes are fetched from &#8220;Sandbox1&#8221; and deployed to &#8220;Sandbox2&#8221;.<\/p>\n<p><strong>Setting-up Bitbucket account<\/strong><\/p>\n<p style=\"text-align: justify;\">If you are following my blog, you may already know that I give preference to Bitbucket over Github because it allows me to setup private repository free of\u00a0cost.<\/p>\n<p style=\"text-align: justify;\">First you will need to generate SSH key for authentication, for this you can either use Eclipse or PuTTYGen. In Video demo of this article, i have used PuTTYGen. Once SSH key is generated, upload Public key in Bitbucket by navigating to &#8220;Manage Account | Securtiy | SSH Keys | Add Key&#8221;. Save Private key with extension &#8220;ppk&#8221; somewhere on your local system.<\/p>\n<p style=\"text-align: justify;\">You will need to commit all your changes of &#8220;Sandbox1&#8221; to this Bitbucket account so that it can be deployed to &#8220;Sandbox2&#8221;. For this you can either use <a title=\"How to use Eclipse for Git and Salesforce\" href=\"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/salesforce-git-eclipse-egit-better-and-distributed-source-control\/\">Eclipse <\/a>or TortoiseGit.<\/p>\n<p><strong>Create new project in Jenkins<\/strong><\/p>\n<p>Navigate to &#8220;Home page | New Item&#8221;. Give appropriate item name and then choose &#8220;Freestyle project&#8221;.<\/p>\n<figure id=\"attachment_4319\" aria-describedby=\"caption-attachment-4319\" style=\"width: 600px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Create-New-Item-in-Jenkins-Free-Style-Project.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-4319\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Create-New-Item-in-Jenkins-Free-Style-Project.png?resize=600%2C311&#038;ssl=1\" alt=\"Create New Item in Jenkins - Free Style Project\" width=\"600\" height=\"311\" srcset=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Create-New-Item-in-Jenkins-Free-Style-Project.png?w=887&amp;ssl=1 887w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Create-New-Item-in-Jenkins-Free-Style-Project.png?resize=300%2C156&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Create-New-Item-in-Jenkins-Free-Style-Project.png?resize=624%2C324&amp;ssl=1 624w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><figcaption id=\"caption-attachment-4319\" class=\"wp-caption-text\">Create New Item in Jenkins &#8211; Free Style Project<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">In &#8220;Source Code Management&#8221;, choose &#8220;Git&#8221;. In Repository URL, provide repository URL of Bitbucket for SSH protocol. In Credentials, click on Add, choose &#8220;SSH Username with private key&#8221;. Provide username and paste private key saved in &#8220;ppk&#8221; file. If there is any Passphrase then provide it and save it.<\/p>\n<figure id=\"attachment_4320\" aria-describedby=\"caption-attachment-4320\" style=\"width: 600px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-SSH-Username-with-private-key-Credentials.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-4320\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-SSH-Username-with-private-key-Credentials.png?resize=600%2C409&#038;ssl=1\" alt=\"Jenkins SSH Username with private key Credentials\" width=\"600\" height=\"409\" srcset=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-SSH-Username-with-private-key-Credentials.png?w=787&amp;ssl=1 787w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-SSH-Username-with-private-key-Credentials.png?resize=300%2C205&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-SSH-Username-with-private-key-Credentials.png?resize=624%2C426&amp;ssl=1 624w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><figcaption id=\"caption-attachment-4320\" class=\"wp-caption-text\">Jenkins SSH Username with private key Credentials<\/figcaption><\/figure>\n<p><strong>Build Triggers<\/strong><\/p>\n<p style=\"text-align: justify;\">There may be any combination which will cause Jenkins to trigger build. For example if code is pushed to your Git repository, or poll Git repository after some predefined interval to see if there is any change or run build periodically. You can have one or more than one combination to trigger builds. In this article I have selected &#8220;Poll SCM&#8221; option. It will check my git repository after every 15 minutes for changes \u00a0and if it finds that repository has been changed then it will start building. If you select &#8220;Pol SCM&#8221;, then text box will appear where we need to provide crone statement to decide its scheduled time. I have provided <span style=\"text-decoration: underline;\">&#8220;H\/15 * * * *&#8221;<\/span> which means, it will run every 15 minutes.<\/p>\n<p><strong>Build\u00a0<\/strong><\/p>\n<p>In this section choose &#8220;Invoke Ant&#8221;. \u00a0In Targets, provide Ant target names separated by space. provide location of folder where &#8220;build.xml&#8221; is present in text box &#8220;Build File&#8221;.<\/p>\n<figure id=\"attachment_4322\" aria-describedby=\"caption-attachment-4322\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-build-Invoke-Ant-task.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-4322\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-build-Invoke-Ant-task.png?resize=576%2C285&#038;ssl=1\" alt=\"Jenkins build Invoke Ant task\" width=\"576\" height=\"285\" srcset=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-build-Invoke-Ant-task.png?w=576&amp;ssl=1 576w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-build-Invoke-Ant-task.png?resize=300%2C148&amp;ssl=1 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><figcaption id=\"caption-attachment-4322\" class=\"wp-caption-text\">Jenkins build &#8211; Invoke Ant task<\/figcaption><\/figure>\n<p><strong>Post-build Actions<\/strong><\/p>\n<p style=\"text-align: justify;\">In this section of project configuration, we need to setup task that can be executed after build. There are number of options available, however we will choose &#8220;Chatter results&#8221;. This task will be available only if you have installed &#8220;Chatter plugin&#8221; as explained above. Here, we need to provide Username and Password to connect to Salesforce. If you want to connect to Sandbox or My Domain then need to setup value in text box &#8220;Override Login Server&#8221; else keep it blank.<\/p>\n<figure id=\"attachment_4323\" aria-describedby=\"caption-attachment-4323\" style=\"width: 600px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-Post-build-Action-Post-to-Salesforce-Chatter.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-4323\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-Post-build-Action-Post-to-Salesforce-Chatter.png?resize=600%2C472&#038;ssl=1\" alt=\"Jenkins Post build Action - Post to Salesforce Chatter\" width=\"600\" height=\"472\" srcset=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-Post-build-Action-Post-to-Salesforce-Chatter.png?w=756&amp;ssl=1 756w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-Post-build-Action-Post-to-Salesforce-Chatter.png?resize=300%2C236&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Jenkins-Post-build-Action-Post-to-Salesforce-Chatter.png?resize=624%2C491&amp;ssl=1 624w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><figcaption id=\"caption-attachment-4323\" class=\"wp-caption-text\">Jenkins Post build Action &#8211; Post to Salesforce Chatter<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">After all above settings, save this information and we will be good to go. You can see log of attempt by Jenkins to determine if there is any change in git repository, it would be available at left menu by name &#8220;Git Polling Log&#8221;.<\/p>\n<figure id=\"attachment_4325\" aria-describedby=\"caption-attachment-4325\" style=\"width: 650px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Salesforce-Jenkins-Git-Polling-Log.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-4325\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Salesforce-Jenkins-Git-Polling-Log.png?resize=650%2C263&#038;ssl=1\" alt=\"Salesforce - Jenkins Git Polling Log\" width=\"650\" height=\"263\" srcset=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Salesforce-Jenkins-Git-Polling-Log.png?w=861&amp;ssl=1 861w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Salesforce-Jenkins-Git-Polling-Log.png?resize=300%2C121&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/Salesforce-Jenkins-Git-Polling-Log.png?resize=624%2C252&amp;ssl=1 624w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/a><figcaption id=\"caption-attachment-4325\" class=\"wp-caption-text\">Salesforce &#8211; Jenkins Git Polling Log<\/figcaption><\/figure>\n<p>We can also manually trigger build by clicking on &#8220;Build Now&#8221; link visible in above image. All build results will be available below &#8220;Git Polling Log&#8221;.<\/p>\n<p><strong>Video Tutorial<\/strong><\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/VSa7PgIANvs\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>Please share your feedback in comments section.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As your Salesforce Organization undergoes heavy customization and frequent builds, moving changes from one Sandbox to other sandboxes starts taking longer time and effort. Also, in normal Salesforce project, there are chances that you will have minimum three sandboxes likely Developer Sandbox, QA Sandbox and UAT Sandbox. After some time you will be in need [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"jz_research_post":"","_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[9],"tags":[261,262,47,294,108,293,331,212],"class_list":["post-4276","post","type-post","status-publish","format-standard","hentry","category-salesforce","tag-ant","tag-ant-migration-tool","tag-bitbucket","tag-continuous-integration","tag-git","tag-jenkins","tag-salesforce","tag-video-tutorial"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":6341,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/continuous-integration-vs-continuous-delivery-vs-continuous-deployment\/","url_meta":{"origin":4276,"position":0},"title":"Continuous Integration vs. Continuous Delivery vs. Continuous Deployment","author":"Jitendra","date":"November 11, 2017","format":false,"excerpt":"Difference between Continuous Integration vs. Continuous Delivery vs. Continuous Deployment","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Continuous Integration vs. Continuous Delivery vs. Continuous Deployment","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/11\/Continuous-Integration-vs.-Continuous-Delivery-vs.-Continuous-Deployment.png?fit=1002%2C766&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/11\/Continuous-Integration-vs.-Continuous-Delivery-vs.-Continuous-Deployment.png?fit=1002%2C766&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/11\/Continuous-Integration-vs.-Continuous-Delivery-vs.-Continuous-Deployment.png?fit=1002%2C766&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/11\/Continuous-Integration-vs.-Continuous-Delivery-vs.-Continuous-Deployment.png?fit=1002%2C766&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":5935,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/continuous-integration-ci-in-salesforce-using-team-foundation-server-tfs-video\/","url_meta":{"origin":4276,"position":1},"title":"Continuous Integration (CI) in Salesforce using Team Foundation Server (TFS) &#8211; Video","author":"Jitendra","date":"March 20, 2017","format":false,"excerpt":"Step by step guide to set up Continuous Integration (CI) for Salesforce using Team Foundation Server (TFS) with video tutorial","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Team Foundation Server (TFS) - New Build definition - Select repository","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/03\/Team-Foundation-Server-TFS-New-Build-definition-Select-repository.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/03\/Team-Foundation-Server-TFS-New-Build-definition-Select-repository.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/03\/Team-Foundation-Server-TFS-New-Build-definition-Select-repository.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/03\/Team-Foundation-Server-TFS-New-Build-definition-Select-repository.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":4331,"url":"https:\/\/www.jitendrazaa.com\/blog\/uncategorized\/using-cctray-to-monitor-continuous-integration-setup-using-jenkins-for-salesforce-video-tutorial\/","url_meta":{"origin":4276,"position":2},"title":"Using CCTray to monitor continuous integration setup using Jenkins for Salesforce | Video Tutorial","author":"Jitendra","date":"March 23, 2015","format":false,"excerpt":"In previous article, I\u00a0have explained that\u00a0how to use Jenkins to setup Continuous integration for Salesforce. Now, once Jenkins is up and its doing its job to build Salesforce changes. Next task is to monitor build result. We already setup post deployment task by creating chatter message to notify everyone about\u2026","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"CCTray Build Server custom HTTP URL","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/CCTray-Build-Server-custom-HTTP-URL.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/CCTray-Build-Server-custom-HTTP-URL.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/CCTray-Build-Server-custom-HTTP-URL.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/03\/CCTray-Build-Server-custom-HTTP-URL.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":6062,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/getting-started-with-salesforce-dx-salesforce-developer-experience\/","url_meta":{"origin":4276,"position":3},"title":"Most Frequently used SFDX Commands","author":"Jitendra","date":"May 25, 2017","format":false,"excerpt":"Introduction and basics of Salesforce Developer Experience (Salesforce DX) with source code and Video tutorials","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Salesforce Developer Experience - SFDX","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":3902,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/automated-daily-backup-using-ant-migration-tool-and-git\/","url_meta":{"origin":4276,"position":4},"title":"Automated Daily Backup of Salesforce Using ANT Migration Tool and GIT","author":"Jitendra","date":"July 5, 2014","format":false,"excerpt":"In few\u00a0previous articles, I have talked about how to use \"ANT Migration tool in Salesforce\" and \"How to Use EGit plugin in Eclipse to work with Git\". So to make this article short, I assume that you are already familiar with ANT Migration tool provided by Salesforce and Git. During\u2026","rel":"","context":"In &quot;Configuration&quot;","block_context":{"text":"Configuration","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/configuration\/"},"img":{"alt_text":"Salesforce Automated Script for Data Backup Using CommandLine","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2014\/07\/Salesforce-Automated-Script-for-Data-Backup-Using-CommandLine.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2014\/07\/Salesforce-Automated-Script-for-Data-Backup-Using-CommandLine.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2014\/07\/Salesforce-Automated-Script-for-Data-Backup-Using-CommandLine.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":4584,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/continuous-integration-in-salesforce-using-flosum-appexchange\/","url_meta":{"origin":4276,"position":5},"title":"Continuous Integration in Salesforce using Flosum AppExchange","author":"Jitendra","date":"June 22, 2015","format":false,"excerpt":"Native Force.com solution for Continuous Integration using AppExchange product Flosum","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Flosum AppExchange","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/06\/Flosum-AppExchange.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/06\/Flosum-AppExchange.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/06\/Flosum-AppExchange.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2015\/06\/Flosum-AppExchange.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts\/4276","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/comments?post=4276"}],"version-history":[{"count":22,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts\/4276\/revisions"}],"predecessor-version":[{"id":4342,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts\/4276\/revisions\/4342"}],"wp:attachment":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/media?parent=4276"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/categories?post=4276"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/tags?post=4276"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}