【问题标题】:using Jenkins2 pipeline to upload via FTP使用 Jenkins2 管道通过 FTP 上传
【发布时间】:2017-05-01 15:20:37
【问题描述】:

我正在使用新的 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 日更新

为了澄清我需要的是一种类似于旧版本 Jenkins 的“通过 FTP 发布”的方法。

【问题讨论】:

    标签: jenkins ftp jenkins-pipeline


    【解决方案1】:

    Jenkins Publish Over FTP 插件从 1.15 版开始支持流水线。

    我的 Jenkinsfile 中的一个 sn-p,它将一些文件发送到我们的服务器:

    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]
        ]
    }
    

    【讨论】:

    • 我得到:WorkflowScript: 16: Missing required parameter: "paramPublish"... 这个参数的文档没有任何意义:参数或环境变量的名称将包含匹配标签的表达式。什么标签?…
    • @Sardathrion 尝试将其与一级参数一起包括在内:paramPublish: [parameterName:""]
    • 嘿,我正在尝试了解如何将此插件与管道一起使用。使用这个 sn-p 我得到 0 输出,但操作失败。你有机会知道它有什么问题吗?
    • 您能否就您的解决方案的工作原理添加更多信息?
    • 致所有无法让它工作的人:我使用“管道语法”下的 Jenkins sn-p 生成器生成了这段代码 sn-p。在“示例步骤”的菜单中选择“ftpPublisher:通过 FTP 发送构建工件”,在表单中输入所有详细信息,然后按“生成管道脚本”。如果您的插件不适用于上述代码,则可能是其他版本或其他内容。我不知道插件是如何工作的,我只是使用它。我的答案中的代码适用于我们的插件版本(在 Jenkins 的插件列表中列为 1.15)...
    【解决方案2】:

    由于这是 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 主配置页面的 Publish Over FTP 下设置外部主机,并确保名称匹配。
    • 添加新的新必需参数 masterNodeName 和 paramPublish,分别为空字符串和 null。

    在发布者块中,这些设置与传输下旧样式 Jenkins 配置中定义的内容相匹配,因此请参阅该设置了解详细信息。

    我希望这可以帮助未来在管道中使用 ftpPublisher 插件的人。

    【讨论】:

    • 感谢您的帮助...在我看来,您的解决方案类似于 @frankhermes 使用 ftpPublisher 提供的解决方案
    • 没错,不同的是我添加了两个新的必填参数 masterNodeName 和 paramPublish 并具有有效值。
    • 很高兴知道!我现在没有使用那个节点,也无法验证这些参数是必需的,但是,我会支持答案;)
    • 我在我的 Jenkins 系统配置页面中设置了一个“FTP_Server”,但发布者说找不到?
    【解决方案3】:

    在电脑上安装ncftp,在Jenkins中运行这个命令:

    ncftpput -R -v -u "ftp-username" ftp.website.com ftp-upload-path local-path/*
    

    (取自超级用户的Can I upload an entire folder using FTP?)

    【讨论】:

    • 这样我最终将在 jenkins 节点上使用自定义设置...此外,管道内没有进行错误管理,我最终将所有内容留在操作系统上... :( 试过了
    • @genuinefafa 不幸的是,它似乎是目前最好的选择。至少对我来说确实很好用。尽管不得不在所有 Jenkins 机器上安装 ncftp 确实很不幸。
    • @SimonForsberg 您能否举一个 Windows 服务器的 ftp-upload-path 示例?我正在尝试使用此命令设置目标路径C:\ftproot./ncftpput -R -v -u "user1" 10.1.175.143 C:\ftproot test1.txt
    • @AndreyDonald 不,我不能举任何例子。没有这方面的经验。 (老实说,我什至不再在我的 Linux 机器上使用 ncftp)
    【解决方案4】:

    我根本无法让 Jenkins Publish Over FTP 插件工作,所以我决定使用可以工作的 shell 脚本。下面是使用lftp 的sn-p。如果您没有安装,请安装它或使用 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
            '''
        }
    }
    

    如果 git 中有标签,这只会将内容发送到 FTP。

    【讨论】:

    • 您的解决方案的唯一警告是 ftp 将在 jenkins 逻辑之外运行,但是 shell...它容易出错并且您需要非标准命令;
    • @genuinefafa 遗憾的是,任何 Jenkins 特定的解决方案(使用通过 FTP 发布)都会抛出关于选项的不连贯异常,这些文档完全无法理解:参数或环境变量的名称将包含匹配的表达式标签。什么标签?为什么我需要这个?这是在哪里记录的? ... shell 脚本工作得很好,而且比 Jenkins 模块更不容易出错。
    • @Sardathrion-againstSEabuse 你能告诉我是否可以使用lftp 命令传输目录吗?我找不到那个
    【解决方案5】:

    所以你的问题是如何使用 Linux 命令行通过 ftp 上传文件? 我想是already solved here

    $ curl -T my-local-file.txt ftp://ftp.example.com --user user:secret
    

    【讨论】:

    • 不,我正在尝试将一堆文件上传到 FTP 服务器。将其视为“通过 FTP 发布”。
    • 对不起,我误解了你。管道中尚不支持此插件,有an open bug for it。如果您要上传的资源数量有限,我可以推荐它来运行 sh "curl ..."(就像我给出的示例一样)。
    • 必须有一种方法可以在管道中使用标准插件!不是吗?
    • 有 - 插件开发者必须稍微扩展插件。更多详情pipeline plugins compatibility, pipeline plugins developers guide
    • 我通过使用管道解决了这个问题,然后将工件复制到一个新的“旧式”Jenkins 项目,该项目使用通过 FTP 插件发布。它不是“最佳选择”,但显然是当时唯一的选择。
    猜你喜欢
    • 2015-06-20
    • 2017-11-01
    • 2011-05-19
    • 2011-02-17
    • 2010-12-24
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多