С помощью конвейера Jenkins2 для загрузки через FTP
Я использую новый конвейер Jenkins2 для создания составного проекта с:
- внешний интерфейс
- PHP-бэкэнд
оба находятся в разных репозиториях, поэтому необходимо использовать конвейер для их синхронизации, компиляции и подготовки к развертыванию. Я не могу найти простой способ развертывания с использованием FTP.
Мой скрипт выглядит примерно так:
node {
// uncomment these 2 lines and edit the name 'node-4.4.5' according to what you choose in configuration
def nodeHome = tool name: 'NodeJS 7.2.1', type: 'jenkins.plugins.nodejs.tools.NodeJSInstallation'
env.PATH = "${nodeHome}/bin:${env.PATH}"
stage("front") {
dir('front') { // switch to subdir
git url: ...
sh "npm install"
sh "npm run build --prod"
sh "cp -R * ../dist"
}
}
stage("back") {
dir('back') {
git url: ...
sh 'curl -sS https://getcomposer.org/installer | php'
sh 'php composer.phar install'
sh "cp -R * ../dist"
}
}
stage("upload via ftp") {
// IM NOT SURE WHAT TO DO HERE
}
}
ОБНОВЛЕНИЕ 2016-12-16
Чтобы уточнить, что мне нужно, это способ запустить что-то похожее на "Публикация по FTP", как старые версии Jenkins.
6 ответов
Плагин Jenkins Publish Over FTP имеет поддержку конвейера начиная с версии 1.15.
Фрагмент из моего Jenkinsfile, который отправляет некоторые файлы на наш сервер:
stage('Upload')
{
ftpPublisher alwaysPublishFromMaster: true, continueOnError: false, failOnError: false, publishers: [
[configName: 'YOUR_CONFIG_HERE', transfers: [
[asciiMode: false, cleanRemote: false, excludes: '', flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: "YOUR_DIRECTORY_HERE", remoteDirectorySDF: false, removePrefix: '', sourceFiles: '**.exe, **.txt']
], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true]
]
}
Поскольку это одна из лучших ссылок в Google, а другие ответы не работают, я добавлю свои два цента.
Вот рабочий этап конвейера, который я использую:
stage ('Deploy') {
steps {
ftpPublisher alwaysPublishFromMaster: true,
continueOnError: false,
failOnError: false,
masterNodeName: '',
paramPublish: null,
publishers: [[configName: 'External Host', transfers: [[asciiMode: false, cleanRemote: true, excludes: '', flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'public', sourceFiles: 'public/*,public/**/*']], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false]]
}
Магия здесь
- Настройте внешний хост на главной странице конфигурации Jenkins в разделе "Опубликовать через FTP" и убедитесь, что имена совпадают.
- добавьте новые новые обязательные параметры masterNodeName и paramPublish с пустой строкой и null соответственно.
В блоке publishers эти настройки соответствуют тому, что определено в конфигурации Jenkins старого стиля при передаче, поэтому см. Подробности.
Я надеюсь, что это поможет будущим людям, борющимся с плагином ftpPublisher в конвейере.
Устанавливать ncftp
на компьютере и запустите эту команду в Jenkins:
ncftpput -R -v -u "ftp-username" ftp.website.com ftp-upload-path local-path/*
(Взято из Могу ли я загрузить всю папку, используя FTP? На Super User)
Я не смог заставить работать плагин Jenkins Publish Over FTP вообще, поэтому я решил использовать работающие сценарии оболочки. Ниже приведен фрагмент кода с использованием lftp. Если он у вас не установлен, либо установите его, либо используйте vanilla ftp.
stage('FTP') {
steps {
sh '''if git describe --exact-match --tags HEAD; then
lftp ftp://USER:PWD@FTP -e "cd PATH; mput *.exe; bye"
else
exit 0
fi
'''
}
}
Это будет отправлять вещи только на FTP, если в git есть тег.
Итак, ваш вопрос: как использовать командную строку Linux для загрузки файла через ftp? Я думаю, что это уже было решено здесь
$ curl -T my-local-file.txt ftp://ftp.example.com --user user:secret
Примечание. Я добавил этот ответ, чтобы обобщить множество полезных комментариев к ответу @frankhermes. К сожалению, я не смог добавить их к его ответу, потому что «очередь редактирования заполнена».
Плагин Publish Over FTP Jenkins имеет поддержку Pipeline начиная с версии 1.15.
Чтобы создать конвейер, вы можете использовать генератор сниппетов Jenkins. Для этого
- войдите в свой проект Pipeline
- в меню слева нажмите Синтаксис конвейера
- выберите ftpPublisher: отправлять артефакты сборки по FTP из раскрывающегося списка.
- настроить все детали, как в классической работе Дженкинса
- нажмите Создать скрипт конвейера
Это сгенерирует код конвейера для вас.
Однако при использовании этого кода у меня возникли ошибки из-за отсутствия параметров. я должен был добавить
masterNodeName: ''
а также
paramPublish: [parameterName:""]
как дополнительные параметры верхнего уровня.
Синтаксис конвейера плагина задокументирован по адресу https://www.jenkins.io/doc/pipeline/steps/publish-over-ftp/ .
Вот полный пример того, что здесь работало с использованием плагина версии 1.16 для загрузки артефактов сборки (jar-файлов):
steps {
ftpPublisher alwaysPublishFromMaster: false,
masterNodeName: '',
paramPublish: [ parameterName: "" ],
continueOnError: false,
failOnError: false,
publishers:
[ [
configName: 'download.dev.localnet (Local Download Server)',
transfers:
[
[
asciiMode: false,
cleanRemote: false,
excludes: '**/*-tests.jar, **/*-javadoc.jar, **/*.lite*, **/*.common*',
flatten: true,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '/utilities/project/snapshots',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: '**/target/*-SNAPSHOT.jar'
]
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
] ]
}
Еще одно полезное примечание из ответа @MarcRunkel:
Настройте внешний хост на главной странице конфигурации Jenkins в разделе « Публикация через FTP » , а затем обязательно используйте это точное имя в
configName
параметр.