我正在配置 Jenkins 作业以将文件从 Subversion 上传到 SFTP。Publish Over SSH做得很好,但它会在每次构建时上传所有文件。
对于某些项目,我们有数千个文件,上传成本超过 1 小时,所以这不是一个选择。
任何人都可以建议一种仅上传上次修订中更改的文件的方法吗?
我正在配置 Jenkins 作业以将文件从 Subversion 上传到 SFTP。Publish Over SSH做得很好,但它会在每次构建时上传所有文件。
对于某些项目,我们有数千个文件,上传成本超过 1 小时,所以这不是一个选择。
任何人都可以建议一种仅上传上次修订中更改的文件的方法吗?
您可以将这些文件保存在单独的存储库中。听起来像 mercurial 或 git 这样的分布式 VCS 最适合您的情况。您可以在工作区中设置它并添加一个构建步骤来提交更改的文件并将提交推送到您要发布它的服务器(只要您不清除工作区或构建多个机器)或添加额外的步骤来克隆/提取带有来自您保留它们的服务器的工件的存储库。
您可以使用Subversion 插件来轮询 SVN 更改并运行不做任何特别工作的作业。我们称之为YourPollingJob。然后通过 http 调用 Jenkins API,如下所示:
http://[jenkins_server]/api/xml?depth=2&xpath=/hudson/job[name='YourPollingJob']/build[id='BUILD_ID']/changeSet
您刚刚运行的作业的实际构建 ID在哪里BUILD_ID
(通常的格式类似于2012-02-21_16-15-49
)。检查结果。请注意,自上次构建以来已更改的文件的所有信息都在那里 - 您只需将其解析出来。
所以现在您可以执行以下操作:YourPollingJob将调用另一个作业 - 我们称之为CopyJobBUILD_ID
- 并将其作为参数传递给它(通过Parameterized Trigger Plugin;确保将CopyJob作为构建后步骤调用,而不是作为构建步)。CopyJob然后将通过 http 查询 Jenkins(如上所述,最好的方法是通过wget
),解析结果并进行复制。
您可以在一项工作中完成所有工作,但它有点复杂且难以调试。
此外,每天(每晚)复制整个存储库一次可能是谨慎的做法。