Learn how to setup set up CICD delta deployment with Salesforce DX. Tips and tricks for authorisation , setting up node and the basic git commands.
I’m revamping our CICD process with Salesforce DX and Bitbucket Pipeline with the following initial setup which will only allow delta deployments.
Authentication method – authorize an org and grab the sfdxurl to be stored as repository variable in Bitbucket
sfdx force:auth:web:login
sfdx force:org:display --verbose
There would be two token types
force://<refreshToken>@<instanceUrl>
or
force://<clientId>:<clientSecret>:<refreshToken>@<instanceUrl>
Copy the SFDX Auth URL which will be the second type. Create a repository variable AUTH_URL in Bitbucket and store the copied value.
Echo the AUTH_URL to a file then authenticate with with sfdxurl:store
echo $AUTH_URL >> /tmp/sfdx_auth.txt
sfdx force:auth:sfdxurl:store -f /tmp/sfdx_auth.txt -s -a dxpipeline
Grab the latest sfdx tool and install.
wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
mkdir sfdx-cli
tar xJf sfdx-linux-amd64.tar.xz -C sfdx-cli --strip-components 1
./sfdx-cli/install
Next, to compare delta files – there is node tool available in github that does delta comparison between hash commit or branch. Install the sfdx-git-delta app
npm install sfdx-git-delta@latest -g
Finally I incorporated these to my git workflow
On a Pull Request – I want to run a delta comparison and do an empty check only that my delta files changes are deployable and does break any unit tests.
First checkout a temporary branch from the feature branch
git checkout -b some-pr-branch
Next, run the tool to create a delta comparison from that branch to the target branch.
sgd --to some-pr-branch --from origin/staging --repo . --output .
The tool should create a package.xml/destructiveChange.xml file based on the diff on their respective directory.
Next convert the source format to mdapi so we can run a transactional deploy.
sfdx force:source:convert --manifest=package/package.xml --outputdir=convert
After conversion, do an empty check deploy and run the unit test
sfdx force:mdapi:deploy --deploydir=convert -c -l RunLocalTests -w 30
Below is the complete Pull Request script.
image: atlassian/default-image:2
pipelines:
pull-requests:
'feature/*': # Pull request from feature branch to Staging
- step:
name: "Staging Pull Request Validate Package"
script:
- echo "QA Pull Request Validation"
- wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
- mkdir sfdx-cli
- tar xJf sfdx-linux-amd64.tar.xz -C sfdx-cli --strip-components 1
- ./sfdx-cli/install
- echo $AUTH_URL >> /tmp/sfdx_auth.txt
- sfdx force:auth:sfdxurl:store -f /tmp/sfdx_auth.txt -s -a dxpipeline
- npm install sfdx-git-delta@latest -g
- git checkout -b some-pr-branch
- git --no-pager diff --name-status some-pr-branch origin/staging
- sgd --to some-pr-branch --from origin/staging --repo . --output .
- echo "--- package.xml generated with added and modified metadata ---"
- cat package/package.xml
- sfdx force:source:convert --manifest=package/package.xml --outputdir=convert
- echo "---- Validating delta package ----"
- sfdx force:mdapi:deploy --deploydir=convert -c -l RunLocalTests -w 30
On Push to the branch – I ran similar steps with the only exception that I compare the current branch to the staging branch and not do an empty check or run the test classes as I already ran them.
Below is the complete Push script.
image: atlassian/default-image:2
pipelines:
pushs:
staging:
- step:
name: "Deploy to Staging"
script:
- echo "Deploy to Staging"
- wget https://developer.salesforce.com/media/salesforce-cli/sfdx-linux-amd64.tar.xz
- mkdir sfdx-cli
- tar xJf sfdx-linux-amd64.tar.xz -C sfdx-cli --strip-components 1
- ./sfdx-cli/install
- echo $AUTH_URL >> /tmp/sfdx_auth.txt
- sfdx force:auth:sfdxurl:store -f /tmp/sfdx_auth.txt -s -a dxpipeline
- npm install sfdx-git-delta@latest -g
- git checkout -b dev
- git --no-pager diff --name-status some-pr-branch origin/staging
- sgd --to dev --from origin/staging --repo . --output .
- echo "--- package.xml generated with added and modified metadata ---"
- cat package/package.xml
- sfdx force:source:convert --manifest=package/package.xml --outputdir=convert
- echo "---- Validating delta package ----"
- sfdx force:mdapi:deploy --deploydir=convert -w 30
Hope you find this useful. Hit me up on the comments below for any questions.
Hi,
I am trying to implement this, but not able achieve the end outcome. can you please help me.
Hi Anant,
I have created youtube series where I showed how I configured Github Actions with SFDX delta deploy. Check it out https://www.youtube.com/watch?v=zxy5jeYx5sg&list=PLSjzuyuoSi-EfqRq-PJ_KKzLzB84YModG
[…] use case, we can use the traditional ant tool for metadata deployment. We recommend to look into Salesforce DX for deployments. Other use cases, we still use ant for dataloader jobs if you want to script the […]
[…] Hope you find this start template usefaul and helps you in your deployment. If you want to incorporate SFDX deployment further please check my previous blog post on this SFDX delta deployment. […]
Trying to use this script but getting the error while running it on sfdx delta package installation …
+ npm install sfdx-git-delta@latest -g
npm WARN notice [SECURITY] lodash has the following vulnerability: 1 high. Go here for more details: https://github.com/advisories?query=lodash – Run `npm i npm@latest -g` to upgrade your npm version, and then `npm audit` to get more info.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
> dtrace-provider@0.6.0 install /root/.nvm/versions/node/v8.9.4/lib/node_modules/sfdx-git-delta/node_modules/dtrace-provider
> node scripts/install.js
sh: 1: node: Permission denied
> core-js@3.23.4 postinstall /root/.nvm/versions/node/v8.9.4/lib/node_modules/sfdx-git-delta/node_modules/core-js
> node -e “try{require(‘./postinstall’)}catch(e){}”
sh: 1: node: Permission denied
npm WARN node-fetch@2.6.7 requires a peer of encoding@^0.1.0 but none is installed. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: dtrace-provider@0.6.0 (node_modules/sfdx-git-delta/node_modules/dtrace-provider):
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: dtrace-provider@0.6.0 install: `node scripts/install.js`
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: spawn ENOENT
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! core-js@3.23.4 postinstall: `node -e “try{require(‘./postinstall’)}catch(e){}”`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the core-js@3.23.4 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2022-07-13T09_30_38_548Z-debug.log
can u please help
hey there, this post is pretty old but should still work.
The new way to install the sfdx-git-delta as a plugin in sfdx.
sfdx plugins:install sfdx-git-delta
then change the yaml call to represent it eg, sfdx sgd:source:delta –to “HEAD” –from “HEAD^” –output “.”
Hi lopau ,
Can I get the updated script for the sfdx delta deployment for the bitbucket