Backing up Salesforce Meta data
Clicks not code makes the Salesforce Admin a super hero, but might send jitters through the compliance and change management team's combined spines. How can you track all of these changes?
Tracking changes
Salesforce does record, when configured, changes in setup for 180 days. The format is a log that isn't actionable (e.g. rollback). An alternative to the build in function is BlueCanvas that stores meta data automatically into a git repository. It's part of their developer focused solution that also handles the deployment and rollback of source code
Downloading meta data
When you are not ready (or haven't allocated a budget yet) to fully automate this, there's a do-it-yourself alternative. A few steps:
- Make sure you have Java8 installed
- Deploy the Salesforce Ant Migration tool
- Download and deploy into your path PackageBuilder.jar developer by my colleague Kim Galant
- create a
build.properties
file (see below) - create a
build.xml
file (see below) - run the
fetchSrc.sh
shell command (see below)
PackageBuilder will, when called with no instructions read ALL meta data and create one or more package.xml
files. Once created you can use ANT to retrieve the data
build.properties
# Parameters
apiversion=44.0
sf.username=user@domain.com
sf.password=supersecret
sf.serverurl=https://login.salesforce.com
sf.maxPoll = 200
build.xml
<project name="Source backup for Salesforce" default="test" basedir="." xmlns:sf="antlib:com.salesforce">
<property file="build.properties"/>
<property environment="env"/>
<!-- Setting default value for username, password and session id properties to empty string
so unset values are treated as empty. Without this, ant expressions such as ${sf.username}
will be treated literally.
-->
<condition property="sf.username" value=""> <not> <isset property="sf.username"/> </not> </condition>
<condition property="sf.password" value=""> <not> <isset property="sf.password"/> </not> </condition>
<condition property="sf.sessionId" value=""> <not> <isset property="sf.sessionId"/> </not> </condition>
<taskdef resource="com/salesforce/antlib.xml" uri="antlib:com.salesforce">
<classpath>
<pathelement location="ant-salesforce.jar" />
</classpath>
</taskdef>
<!-- Retrieve an unpackaged set of metadata from your org -->
<!-- The file unpackaged/package.xml lists what is to be retrieved -->
<target name="retrieveSrc">
<mkdir dir="src"/>
<!-- Retrieve the contents into another directory -->
<sf:retrieve username="${sf.username}" password="${sf.password}" sessionId="${sf.sessionId}" serverurl="${sf.serverurl}" maxPoll="${sf.maxPoll}" retrieveTarget="src" unpackaged="packages/package.xml" pollWaitMillis="30000" />
</target>
</project>
fetchSrc.sh
#!/bin/bash
java -jar PackageBuilder.jar -o build.properties -d packages
ant retrieveSrc
DATE=`date '+%Y-%m-%d %H:%M:%S'`
git add --all
git commit -m "incoming changes $DATE"
git push origin master
echo "Done with retrieval"
As usual YMMV
Posted by Stephan H Wissel on 08 November 2018 | Comments (0) | categories: Java Salesforce