It's not possible to create remote directories with scp task.
Here's a macrodef for scptransfer, that does all the work needed for transfer
from a given stagedirectory => fix linefeeds, createremote, deleteremote, fail if stagedir empty ... etc.
Macrodef is using ant addon Flaka, if you don't need all that bells and whistles, simply use sshexec task with mkdir -p
before scp to create your remote targetdir.
<project xmlns:fl="antlib:it.haefelinger.flaka">
<fl:install-property-handler/>
<macrodef name="scptransfer">
<attribute name="host" default="${aix.host}"/>
<attribute name="userid" default="${aix.userid}"/>
<attribute name="knownhosts" default="${aix.knownhosts}"/>
<attribute name="ppk" default="${aix.ppk}"/>
<attribute name="createremote" default="false"/>
<attribute name="remotedir" default="${eartarget}/${project}/${env}/${module}/${job.id}"/>
<attribute name="deleteremote" default="false"/>
<attribute name="deleteincludes" default="*"/>
<attribute name="stagedir" default="${artifactdir}/${module}"/>
<attribute name="stageincludes" default="**/*.*"/>
<attribute name="stageexcludes" default=""/>
<attribute name="failstageempty" default="true"/>
<attribute name="fixLF" default="false"/>
<attribute name="timeout" default="900000"/>
<attribute name="verbose" default="true"/>
<sequential>
<echo>
=============== SCP Transfer ===============
Project = ${project}
Environment = ${env}
UserID = @{userid}
Targetserver = @{host}
Targetpath = @{remotedir}
fixLF ? = @{fixLF}
createremote ? = @{createremote}
deleteremote ? = @{deleteremote}
#{@{deleteremote} ? 'deleteincludes = @{deletecincludes}' : '' }
Stagedir = @{stagedir}
stageincludes = @{stageincludes}
stageexcludes = @{stageexcludes}
=============== SCP Transfer ===============
</echo>
<!-- contents in stagedir ? -->
<resourcecount property="stagecount">
<fileset dir="@{stagedir}" includes="@{stageincludes}" excludes="@{stageexcludes}" id="stagecontents"/>
</resourcecount>
<fl:choose>
<fl:when test=" ${stagecount} > 0 ">
<!-- Fix Linefeeds for ASCII Files -->
<fl:when test=" @{fixLF} ">
<fixcrlf
excludes="**/*.jar **/*.tar **/*.zip **/*.ear **/*.class"
srcdir="@{stagedir}"
eol="lf"
eof="remove"
fixlast="true"
/>
</fl:when>
<!-- // T i m e o u t -->
<parallel threadcount="1" timeout="@{timeout}">
<!-- create remotedir ? -->
<fl:when test=" @{createremote} ">
<sshexec host="@{host}"
username="@{userid}"
knownhosts="@{knownhosts}"
keyfile="@{ppk}"
command="mkdir -p @{remotedir}"
/>
</fl:when>
<!-- delete contents in remotedir ?
will throw error if remotedir doesn't exist ! -->
<fl:when test=" @{deleteremote} ">
<sshexec host="@{host}"
username="@{userid}"
knownhosts="@{knownhosts}"
keyfile="@{ppk}"
command="cd @{remotedir};rm -rfe @{delfilepattern}"
/>
</fl:when>
<!-- Filetransfer from stagedir -->
<scp todir="@{userid}@@@{host}:@{remotedir}"
keyfile="@{ppk}"
knownhosts="@{knownhosts}"
sftp="true"
verbose="@{verbose}"
>
<fileset refid="stagecontents"/>
</scp>
</parallel>
<!-- T i m e o u t // -->
</fl:when>
<fl:otherwise>
<echo>
=============== SCP Transfer =============
Skip => NO StageDirContents !!
=============== SCP Transfer =============
</echo>
<fl:fail message="Stagedir [@{stagedir}] empty !!" test=" @{failstageempty} "/>
</fl:otherwise>
</fl:choose>
</sequential>
</macrodef>
</project>
As we switched to Github only recently get the manual here and some examples here.