Moving out of your Packaging Org. You will eventually reach a point where what you have extract is a unmanaged version of your package contents, which can be made to be compatible with a subsequent deployment back to your packaging org, which i'm guessing is what you have later in mind? I have done this before, when I've out grown developing in a packaging org, but rather I've done it with a view to populating a source control system and using that as the central definition of truth for my app.
Developer Workflow from Source Control. You can still use your sandbox orgs for your developers, but have them deploy using the Salesforce Migration Toolkit from your source control system. When your ready you can do a deploy to your packaging org from source control.
Validating Source Control Contents. Note that you can extend this to a continue integration build approach and effectively use the test deploy aspect of the toolkit to confirm your current state of source control is compatible with your packaging org (without actually committing to it until your ready).
Edit: Summer '15 made this "all better". If you upgrade your ant-salesforce.jar to one that supports API version 34, you can now pass a "testLevel=RunLocalTests" attribute to sf:deploy like so:
<sf:deploy
testLevel="RunLocalTests"
username="${sf.username}"
password="${sf.password}"
serverUrl="${sf.server}"
deployRoot="src"
/>
From the docs:
http://releasenotes.docs.salesforce.com/en-us/summer15/release-notes/rn_deployment_run_subset_of_tests.htm
As part of this change, the runAllTests deployment option is now replaced with testLevel. You can choose which tests to run in a deployment by setting the desired test level. For a description of all test levels, see test levels for the deploy() call. In particular, to run a subset of tests in a deployment, set testLevel to the RunSpecifiedTests value and specify the tests to run in the runTests option.
And
http://releasenotes.docs.salesforce.com/en-us/summer15/release-notes/rn_api_meta_new_calls.htm#testlevels
RunLocalTests—All tests in your organization are run, except the ones that originate from installed managed packages. This test level is the default for production deployments that include Apex classes or triggers.
This was the workaround for pre-Summer '15 for posterity:
Because I killed off the better part of a day hacking around in ant to accomplish the workaround @pepefloyd suggested, I wanted to publish a working example; In my case, the test classes are prefixed with "Test_" but you can fool around with the fileset as necessary
This is tested against v30 of the Force.com ant migration tool
<target name="test">
<sfCompileAndTestUnmanaged checkOnly="true" username="${sf.username}" password="${sf.password}" server="${sf.server}">
<fileset dir="src/classes">
<include name="**/Test_*.cls"/>
</fileset>
</sfCompileAndTestUnmanaged>
</target>
<scriptdef name="sfCompileAndTestUnmanaged" language="javascript">
<attribute name="checkonly"/>
<attribute name="username"/>
<attribute name="password"/>
<attribute name="server"/>
<attribute name="trace"/>
<element name="fileset" type="fileset"/>
<![CDATA[
var filesets = elements.get("fileset");
var filesetsIterator = filesets.iterator();
var projectClasses = [];
while(filesetsIterator.hasNext()){
var fs = filesetsIterator.next();
var iter = fs.iterator();
while(iter.hasNext()){
var resource = iter.next();
var clazz = resource.getName().replace(".cls","");
self.log("CLASS: " + clazz);
projectClasses.push(clazz);
}
}
var task = project.createTask("antlib:com.salesforce:compileAndTest");
task.setCheckonly(attributes.get("checkonly") == 'true');
task.setUsername(attributes.get("username"));
task.setPassword(attributes.get("password"));
task.setServer(attributes.get("server"));
task.setTrace(attributes.get("trace") == 'true');
//I tried 'importPackage' and conventional instantiation but couldn't get the inner class to instantiate; this works though
var testsElement = task.getClass().getClassLoader().loadClass("com.salesforce.ant.CompileAndTest$RunTestsElement").newInstance();
task.addRunTests(testsElement);
var classClazz = task.getClass().getClassLoader().loadClass("com.salesforce.ant.CompileAndTest$CodeNameElement");
for(i in projectClasses){
var clazz = classClazz.newInstance();
clazz.addText(projectClasses[i]);
testsElement.addClass(clazz);
}
task.execute();
]]>
</scriptdef>
Alternatively, we've actually used a version of 'deploy' that does a no-op deploy (the package.xml in the 'ant' directory is empty except for the <version>
element. This gives us incremental updates as the tests are running and allows the deployment of the source files to succeed in a separate ant target (not described below) while the tests may fail (insufficient code coverage, failing assertions, etc.)
<target name="test">
<sfDeployUnmanaged purgeOnDelete="true" ignoreWarnings="true" username="${sf.username}" password="${sf.password}" serverUrl="${sf.server}" deployRoot="ant" maxPoll="75">
<fileset dir="src/classes">
<include name="**/*.cls"/>
</fileset>
</sfDeployUnmanaged>
</target>
<scriptdef name="sfDeployUnmanaged" language="javascript">
<attribute name="purgeondelete"/>
<attribute name="ignorewarnings"/>
<attribute name="username"/>
<attribute name="password"/>
<attribute name="serverurl"/>
<attribute name="deployroot"/>
<attribute name="maxpoll"/>
<attribute name="trace"/>
<element name="fileset" type="fileset"/>
<![CDATA[
var filesets = elements.get("fileset");
var filesetsIterator = filesets.iterator();
var projectClasses = [];
while(filesetsIterator.hasNext()){
var fs = filesetsIterator.next();
var iter = fs.iterator();
while(iter.hasNext()){
var resource = iter.next();
var clazz = resource.getName().replace(".cls","");
self.log("CLASS: " + clazz);
projectClasses.push(clazz);
}
}
var task = project.createTask("antlib:com.salesforce:deploy");
task.setPurgeOnDelete(attributes.get("purgeondelete") == 'true');
task.setIgnoreWarnings(attributes.get("ignorewarnings") == 'true');
task.setUsername(attributes.get("username"));
task.setPassword(attributes.get("password"));
task.setServerURL(attributes.get("serverurl"));
task.setDeployRoot(attributes.get("deployroot"));
task.setMaxPoll(attributes.get("maxpoll"));
task.setTrace(attributes.get("trace") == 'true');
//Blows up when build timeout is reached if we don't set this (it uses this value when formatting the exception it throws)
task.setOwningTarget(self.owningTarget);
var classClazz = task.getClass().getClassLoader().loadClass("com.salesforce.ant.DeployTask$CodeNameElement");
for(i in projectClasses){
var clazz = classClazz.newInstance();
clazz.addText(projectClasses[i]);
task.addRunTest(clazz);
}
task.execute();
]]>
</scriptdef>
Best Answer
There should be an account that accesses the org outside of their Single Sign On system. For instance, System Administrators really shouldn't be a part of a SSO system because if that system fails, no users can access Salesforce. Ideally, any deployments should also be done with an account like that.