One of the smallest but very interesting things I saw during this years Dreamforce was a small open source utility called force.com CLI. It is a small tool that you can use to interact with your force.com instance from a shell or a prompt. You can do a lot of different things like running SOQL queries, anonymous APEX and create and modify objects.
You may ask why this is cool or useful at all – why use a command line utility when you can use a nice web interface? One thing is of course the speed and easy of a shell utility especially if you are used to work with tools via the command line or fluent in batch script creation. I see a lot of potential with this little tool and would like to give you one example application for it.
One thing that you might have seen is that you cannot deploy a class that is already in use by a schedule. This is especially annoying if you are using automated deployments using ant. You can of course remove the schedule using the interface and then add it after you are done. But this would not be a good solution if you want to do nightly builds from a GIT repository to a development or QA sandbox. You would then need to write a tool that is connecting using one of the APIs and disable your schedule and then re adds it for you again. You can now do that using the force.com CLI without needing to write a lot of code. This is how it can be done.
I downloaded the compiled binaries from here – but could not get the OAuth handshake to work using firefox on my Ubuntu 13.10 machine. I knew that there was a fork of the code on GIT hub which allowed me to use SOAP username and passwords instead of a OAuth token which also makes a little bit more sense in our scripting scenario. I built that fork on my machine using the following commands.
export GOPATH=~/tmp go get -u github.com/devangel/force/ cp ~/tmp/bin/force ~/bin
I choose to store the compiled binary in a bin folder in my home directory. If you are reading this some time after this was written this functionality might have been merged into the mainline and you would not need to build yourself.
If you run the tool you will have the following list of commands to use.
Usage: force <command>  Available commands: login Log in to force.com logout Log out from force.com whoami Show information about the active account sobject Manage sobjects field Manage sobject fields record Create, modify, or view records fetch Export specified artifact(s) to a local directory export Export metadata to a local directory import Import metadata from a local directory query Execute a SOQL query apex Execute anonymous Apex code version Display current version update Update to the latest version help Show this help
In this article we will be focusing on the query and apex commands to be able to delete and schedule a job. Before we tie it all together I will demonstrate a few of the key pieces we need to do this.
First we need to do a login against the org. To do this you will be using the following format
force.com login <url> <username> <password>
<url> will be the login.salesforce.com for a production or developer org instance and test.salesforce.com for a sandbox instance. <password> will be the user password with the security key suffixed if you need to use a security key in your specific org.
The be able to get the job Id of the scheduled job we need to do a SOQL query against the org. You will be using the query command for this and we will be looking at the CronJobDetail and CronTrigger objects. A quick example of the query command could be
force query "SELECT Id, Name FROM Account"
To give you a list of all the Id and Name of the Account’s in your org.
To create and deactivate the schedules we will use anonymous APEX. Using
will give you the possibility to enter code but you can also feed force using stdin to be able to script the call.
Using these commands and some basic bash scripting I was able to build two scripts; one to disable the schedule and one to recreate it afterwards.
#!/bin/bash ~/bin/force login login.salesforce.com XXX XXX echo "ScheduleImports p = new ScheduleImports(); String sch = '0 0 1 * * ?'; system.schedule('Scheduled Import', sch, p); " | ~/bin/force apex
#!/bin/bash ~/bin/force login login.salesforce.com XXX XXX # Find the ID JOBID=`~/bin/force query "SELECT Id FROM CronTrigger WHERE CronJobDetail.Name = 'Scheduled Import'" | sed -n 3p | tr -d ' '` if [ $(echo $JOBID | wc -c) != '19' ]; then echo "Couldn't find the JOBID" exit 1; fi echo "system.abortJob('$JOBID');" | ~/bin/force apex
Please note these scripts are only for demonstration – to be used in a production environment they should be polished. I hope this sparkles some inspiration to what you can do with this tool.
This blog post is a repost from Martin’s old blog called webaholic.