REQUEST_RUNNING_TOO_LONG при попытке деплоя с помощью Ant Migration Tool

REQUEST_RUNNING_TOO_LONG при попытке деплоя с помощью Ant Migration Tool

I'm trying to use Ant Migration Tool for deploy all changes from one organization to another. When I run it for a large set of metadata (all possible), it running for about 8 minutes and fails with error:

build.xml:35: Failed to process the request successfully.

Cause(UNKNOWN_EXCEPTION): REQUEST_RUNNING_TOO_LONG: Your request was running for too long, and has been stopped.

Total time: 8 minutes 34 seconds

I increased sf.maxPoll and sf.pollWaitMillis but still getting the same error.

build.xml:

<project name="Sample usage of Salesforce Ant tasks" default="test" basedir="." xmlns:sf="antlib:com.salesforce">

<property environment="env"/>
<property file="build.properties"/>

<!-- 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>

<!-- Deploy code on test environment -->
<target name="deployToTest">
<delete includeemptydirs="true">
<fileset dir="${basedir}">
<!-- <include name="src/profiles/"/> -->
<include name="src/settings/Search.settings"/>
<include name="src/workflows/Question.workflow"/>
<include name="src/workflows/Reply.workflow"/>
<include name="src/workflows/ExternalEventMapping.workflow"/>
<include name="src/flows/Add_Contacts_to_Account_1-1.flow"/>
<include name="src/flows/Auto_Allocate_Contacts_to_Account-1.flow"/>
<include name="src/flows/Auto_Allocate_Contacts_to_Account-2.flow"/>
</fileset>
</delete>
<sf:deploy username="${sf.usernameTest}" password="${sf.passwordTest}" sessionId="${sf.sessionId}" serverurl="${sf.serverurlTest}" maxPoll="${sf.maxPoll}" pollWaitMillis="${sf.pollWaitMillis}" deployRoot="src" rollbackOnError="true" autoUpdatePackage="true" ignoreWarnings="true"/>
</target>

<!-- Deploy code on UAT environment -->
<target name="deployToUAT">
<delete includeemptydirs="true">
<fileset dir="src/workflows">
<include name="**/Question.workflow"/>
<include name="**/Reply.workflow"/>
</fileset>
<fileset dir="src/flows">
<include name="**/Add_Contacts_to_Account_1-1.flow"/>
</fileset>
<!-- <fileset dir="src/settings"> -->
<!-- <include name="**/Search.settings"/> -->
<!-- </fileset> -->
</delete>
<sf:deploy username="${sf.usernameUAT}" password="${sf.passwordUAT}" sessionId="${sf.sessionId}" serverurl="${sf.serverurlUAT}" maxPoll="${sf.maxPoll}" pollWaitMillis="${sf.pollWaitMillis}" deployRoot="src" rollbackOnError="true"/>
</target>

<!-- Deploy code on production environment -->
<target name="deployToProduction">
<delete includeemptydirs="true">
<fileset dir="src/workflows">
<include name="**/Question.workflow"/>
<include name="**/Reply.workflow"/>
</fileset>
<fileset dir="src/flows">
<include name="**/Add_Contacts_to_Account_1-1.flow"/>
</fileset>
<fileset dir="src/settings">
<include name="**/Search.settings"/>
</fileset>
</delete>
<sf:deploy username="${sf.usernameProduction}" password="${sf.passwordProduction}" sessionId="${sf.sessionId}" serverurl="${sf.serverurlProduction}" maxPoll="${sf.maxPoll}" pollWaitMillis="${sf.pollWaitMillis}" deployRoot="src" rollbackOnError="true"/>
</target>

<!-- Retrive code from test -->
<target name="retrieveCode">
<!-- Retrieve the contents listed in the file codepkg/package.xml into the codepkg directory -->
<sf:retrieve username="${sf.usernameTest}" password="${sf.passwordTest}" sessionId="${sf.sessionId}" serverurl="${sf.serverurlTest}" maxPoll="${sf.maxPoll}" pollWaitMillis="${sf.pollWaitMillis}" retrieveTarget="src" unpackaged="src/package.xml"/>
</target>

<!-- Retrieve the information on all supported metadata type -->
<target name="describeMetadata">
<sf:describeMetadata username="${sf.usernameTest}" password="${sf.passwordTest}" sessionId="${sf.sessionId}" serverurl="${sf.serverurlTest}"/>
</target>
</project>

build.properties

# build.properties

#

# Specify the login credentials for the desired Salesforce organization

#sandbox
sf.usernameTest = MY_USER
sf.passwordTest = MY_PASS+MY_TOKEN
sf.serverurlTest = https://test.salesforce.com

#UAT
sf.usernameUAT = #{USERNAME_UAT}
sf.passwordUAT = #{PASSWORD_UAT}
sf.serverurlUAT = #{SERVERURL_UAT}

#Production
sf.usernameProduction = #{USERNAME_PRODUCTION}
sf.passwordProduction = #{PASSWORD_PRODUCTION}
sf.serverurlProduction = #{SERVERURL_PRODUCTION}

#sf.sessionId = <Insert your Salesforce session id here. Use this or username/password above. Cannot use both>
#sf.pkgName = <Insert comma separated package names to be retrieved>
#sf.zipFile = <Insert path of the zipfile to be retrieved>
#sf.metadataType = <Insert metadata type name for which listMetadata or bulkRetrieve operations are to be performed>

# Use 'https://login.salesforce.com' for production or developer edition (the default if not specified).
# Use 'https://test.salesforce.com for sandbox.

sf.maxPoll = 100000000
sf.pollWaitMillis = 15000
# If your network requires an HTTP proxy, see http://ant.apache.org/manual/proxy.html for configuration.
#

Это СФ обрубает твой реквест, так как он выполняется слишком долго.
Ты деплоишь через metadata api, попробуй через tooling.

sf.maxPoll and sf.pollWaitMillis - эти параметры влияют только на время и количество проверок выполнения твоего запроса.

Для деплоя через tooling есть таска - restDeploy

Gres
Это СФ обрубает твой реквест, так как он выполняется слишком долго.
Ты деплоишь через metadata api, попробуй через tooling.

Если я правильно понял что ты имеешь ввиду то Tooling использует SOQL. Там лимит гораздо меньше. Плюс нужно отправлять запрос на каждый тип обьектов.

Gres
Для деплоя через tooling есть таска - restDeploy

Есть ли возможность деплоя всей метадаты используя tooling?

DmitriyMarchenkov
Есть ли возможность деплоя всей метадаты используя tooling?

Прости, описался, там просто рест.
Вот урл, на который идет запрос
String JSONURL = this.getServerURL() + "/services/metadata/v" + this.getApiVersion() + "/package/deployRequest";

Попробуй просто поменять таску в твоем таргете и запустить билд.

Gres
Попробуй просто поменять таску в твоем таргете и запустить билд.

Прости, не совсем понял что ты имеешь ввиду.

Что то поменять здесь?

<taskdef resource="com/salesforce/antlib.xml" uri="antlib:com.salesforce">

<classpath>
<pathelement location="ant-salesforce.jar" />
</classpath>
</taskdef>

Вот так, например:

<!-- Deploy code on production environment -->

<target name="deployToProduction">
<delete includeemptydirs="true">
<fileset dir="src/workflows">
<include name="**/Question.workflow"/>
<include name="**/Reply.workflow"/>
</fileset>
<fileset dir="src/flows">
<include name="**/Add_Contacts_to_Account_1-1.flow"/>
</fileset>
<fileset dir="src/settings">
<include name="**/Search.settings"/>
</fileset>
</delete>
<sf:restDeploy username="${sf.usernameProduction}" password="${sf.passwordProduction}" sessionId="${sf.sessionId}" serverurl="${sf.serverurlProduction}" maxPoll="${sf.maxPoll}" pollWaitMillis="${sf.pollWaitMillis}" deployRoot="src" rollbackOnError="true"/>
</target>

Какая версия API используется?

Gres
Вот так, например:
<!-- Deploy code on production environment -->

<target name="deployToProduction">
<delete includeemptydirs="true">
<fileset dir="src/workflows">
<include name="**/Question.workflow"/>
<include name="**/Reply.workflow"/>
</fileset>
<fileset dir="src/flows">
<include name="**/Add_Contacts_to_Account_1-1.flow"/>
</fileset>
<fileset dir="src/settings">
<include name="**/Search.settings"/>
</fileset>
</delete>
<sf:restDeploy username="${sf.usernameProduction}" password="${sf.passwordProduction}" sessionId="${sf.sessionId}" serverurl="${sf.serverurlProduction}" maxPoll="${sf.maxPoll}" pollWaitMillis="${sf.pollWaitMillis}" deployRoot="src" rollbackOnError="true"/>
</target>

Если я меняю на restDeploy также нужно изменить URL?
Получаю ошибку:

Error: StatusCode[400] URL_NOT_RESET: Destination URL not reset. The URL returned from login must be set

wilder
Какая версия API используется?

40.0

И время до появления ошибки постоянно разное

Всего 4 минуты и ошибка

Deployment Failed

Name: 0Af4E00000PtCHY
Type: API
Deployed By: SU
Start Time: 17/08/2017 12:05
End Time: 17/08/2017 12:09

Fatal Error
REQUEST_RUNNING_TOO_LONG: Your request was running for too long, and has been stopped.

Возможно стоит попробовать разбить деплой на части

wilder
Возможно стоит попробовать разбить деплой на части

Я думал об этом, но не придумал как это правильно сделать. Если использовать2 разных package.xml с разным набором метаданных, то не очень удобно получается пользоваться этими файлами.

DmitriyMarchenkov
то не очень удобно получается пользоваться этими файлами.

Это нужно только для эксперимента и нахождения проблемы.

В деплое меньше 10.000 файлов?

Предлагаю просто поставить бряков и задебажить на каком из запросов падает

В свое время было да орга. Оба пустые. Надо было через ант залить один и тот же код. В итоге один прошел хорошо, на другом такая ошибка. Однако когда я попытался залить не в праймтайм(типа ночью) то прошло все хорошо. Предпложение конечно, но свел все на загрузку сервера где орг лежит.

DmitriyMarchenkov
Error: StatusCode[400] URL_NOT_RESET: Destination URL not reset. The URL returned from login must be set

поменяй урл с test.salesforce.com на твой инстанс.salesforce.com

wilder
DmitriyMarchenkov
то не очень удобно получается пользоваться этими файлами.

Это нужно только для эксперимента и нахождения проблемы.

В деплое меньше 10.000 файлов?

Да, немного меньше 4000

Gres
Предлагаю просто поставить бряков и задебажить на каком из запросов падает

Как это можно сделать?

DmitriyMarchenkov
Как это можно сделать?

Открываешь идею, подключаешь либу, пишешь метода main, где запукаешь деплой, идешь в DeployTask и расставляешь бряки.

Interesting information? Help us, post link to social media..