【问题标题】:Jenkins: FTP / SSH deployment, including deletion and moving of filesJenkins:FTP/SSH部署,包括文件的删除和移动
【发布时间】:2012-01-03 18:20:15
【问题描述】:

我想知道如何使用 ftp 和/或 ssh 部署我的网络项目。

我们目前有一个自制的部署系统可以处理这个问题,但我想切换到 Jenkins。

我知道有发布插件,它们在上传构建工件时效果很好。但他们不能删除或移动文件。

您对我的问题有任何提示、提示或想法吗?

【问题讨论】:

    标签: deployment ftp ssh jenkins


    【解决方案1】:

    Publish Over SSH 插件使您可以使用 ssh 向远程服务器发送命令。这很好用,我们还在部署新版本之前执行了一些移动/删除文件,使用这种方法没有任何问题。

    【讨论】:

    • 谢谢,这可能会对我的 ssh 服务器有所帮助。但是您如何获得需要移动/删除哪些文件的信息? Git当然知道,但是如何将其集成到部署工作流程中呢?
    • 如果您有兴趣移动/删除的文件已经在 git 中,您可以在部署服务器上克隆您的 repo,并使用 git 命令行通过 ssh 发布来拉取更改。如果您有不需要编译或检查的静态文件,只需要部署,这可能是一个好方法。如果您对源代码和静态文件有单独的存储库,可能效果最好。
    • 谢谢。当我们开发基于 php (TYPO3) 的软件时,我们的项目都是“静态”文件。我知道我可以使用 git 获取移动/删除的文件,实际上这就是我们在我们自己的基于 phing 的简单部署系统中一直在做的事情。我很惊讶,似乎没有一个插件涵盖干净高效的 ftp/ssh 部署。我想知道其他公司如何部署他们的网络项目,他们不使用 ftp(s) 吗?或者只是在实时服务器上使用 ssh 和/或 git 进行更昂贵的定制托管?
    【解决方案2】:

    处理删除和移动项目的最简单方法是在使用“Publish over”扩展名之一部署新版本之前删除服务器上的所有内容。我想说这真的是知道部署版本是你想要的版本的唯一方法。如果您想要更多版本控制系统风格的行为,您要么需要使用版本控制系统,要么可能需要使用 rsync 来覆盖其中的一部分。

    如果您的要求非常具体,您可以制定自己的约定来标记删除,并让它们由单独的脚本执行(就像您使用 Liquibase 或类似的东西来更改数据库一样)。

    顺便说一句:我建议不要在每次构建后使用“发布...”扩展名自动更新您的实时网站。如果我们真的想自动更新实时站点,我们依靠Promoted Builds Plugin 来保持它几乎完全自动化,但增加了一点安全性。

    【讨论】:

    • 感谢 Simone 的建议,我会检查提升的构建插件。无论如何,这对我来说没有意义,为什么我需要上传一个完整的网站,而我只是更改了一点 CSS 或修复了脚本中的错误。不知何故,我似乎是唯一一个遇到这个问题的人,或者其他人要么将他们的网站项目部署到更高级的主机(ssh / git),要么不使用自动部署。
    【解决方案3】:

    我想出了一个简单的解决方案,使用简单的 lftp 镜像脚本删除已删除的文件并将更改上传到远程 FTP 服务器,作为 Jenkins 中的构建操作。 Lftp Manual Page

    简而言之,您在 jenkins 用户目录 ~/.netrc 中创建一个配置文件,并使用您的 FTP 凭据填充它。

    machine ftp.remote-host.com
    login mySuperSweetUsername
    password mySuperSweetPassword
    

    创建一个 lftp 脚本 deploy.lftp 并将它放到你的 .git repo 的根目录中

    set ftp:list-options -a
    set cmd:fail-exit true
    open ftp.remote-host.com
    mirror --reverse --verbose --delete --exclude .git/ --exclude deploy.lftp  --ignore-time --recursion=always
    

    然后添加“Exec Shell”构建操作以在脚本上执行 lftp。

    lftp -f deploy.lftp
    

    lftp 脚本将

    • 镜像:复制所有更改的文件
    • reverse:将本地文件推送到远程主机。一个常规镜像从远程主机拉到本地。
    • 详细:将所有关于哪些文件复制到构建日志的注释转储
    • delete:删除 git repo 中不再存在的远程文件
    • 排除:不要发布 .git 目录或 deploy.lftp 脚本。
    • ignore-time:不会根据文件创建时间发布。如果你没有这个,就我而言,所有文件都已发布,因为 git repo 的新克隆更新了文件创建时间戳。虽然它仍然工作得很好,甚至通过在其中添加单个空格修改的文件也被识别为不同并上传。
    • recursion:将分析每个文件而不是依赖于文件夹来确定其中的任何文件是否可能被修改。这在技术上不是必需的,因为我们忽略了时间戳,但无论如何我都在这里。

    我写了一篇文章,解释了我如何 keep FTP in sync with Git 为我只能通过 FTP 访问的 WordPress 网站。这篇文章解释了如何从 FTP 同步到 Git,然后如何使用 Jenkins 构建和部署回 FTP。这种方法并不完美,但它确实有效。它只上传更改的文件,并从主机上删除已从 git repo 中删除的文件(反之亦然)

    【讨论】:

      猜你喜欢
      • 2013-09-29
      • 2013-07-18
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多