Как скопировать каталог с помощью scp в gradle задачу?
Что такое чистый и элегантный способ скопировать кучу файлов через scp с помощью Gradle?
В настоящее время я вижу два способа:
Есть ли лучшие (более очевидные) способы приблизиться к этому?
Ответы
Ответ 1
Из моего проекта, который я использую для файлов SCP на сервере EC2.
В файлах jar есть локальные файлы, которые являются частью моего проекта, я забыл, откуда я их получил. Там, вероятно, более сжатый способ сделать все это, но мне нравится быть очень явным в сценариях сборки.
configurations {
sshAntTask
}
dependencies {
sshAntTask fileTree(dir:'buildSrc/lib', include:'jsch*.jar')
sshAntTask fileTree(dir:'buildSrc/lib', include:'ant-jsch*.jar')
}
ant.taskdef(
name: 'scp',
classname: 'org.apache.tools.ant.taskdefs.optional.ssh.Scp',
classpath: configurations.sshAntTask.asPath)
task uploadDbServer() {
doLast {
ant.scp(
file: '...',
todir: '...',
keyfile: '...' )
}
}
Ответ 2
Через несколько лет после первоначального вопроса мне нравится плагин Gradle SSH. Небольшая цитата его обширной документации:
Мы можем описать операции SSH в закрытии сеанса.
session(remotes.web01) {
// Execute a command
def result = execute 'uptime'
// Any Gradle methods or properties are available in a session closure
copy {
from "src/main/resources/example"
into "$buildDir/tmp"
}
// Also Groovy methods or properties are available in a session closure
println result
}
В закрытии сеанса доступны следующие методы.
-
execute
- выполнить команду. -
executeBackground
- выполнить команду в фоновом режиме. -
executeSudo
- выполнить команду с поддержкой sudo. -
shell
- Выполнить оболочку. -
put
- Поместите файл или каталог на удаленный хост. -
get
- Получить файл или каталог с удаленного хоста.
... и позволяет, например:
task deploy(dependsOn: war) << {
ssh.run {
session(remotes.staging) {
put from: war.archivePath.path, into: '/webapps'
execute 'sudo service tomcat restart'
}
}
}