С помощью конвейера 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. Для этого

  1. войдите в свой проект Pipeline
  2. в меню слева нажмите Синтаксис конвейера
  3. выберите ftpPublisher: отправлять артефакты сборки по FTP из раскрывающегося списка.
  4. настроить все детали, как в классической работе Дженкинса
  5. нажмите Создать скрипт конвейера

Это сгенерирует код конвейера для вас.

Однако при использовании этого кода у меня возникли ошибки из-за отсутствия параметров. я должен был добавить 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параметр.

Другие вопросы по тегам