Jenkins 与 Amazon S3 的持续集成 - 一切都上传到根目录?

Posted

技术标签:

【中文标题】Jenkins 与 Amazon S3 的持续集成 - 一切都上传到根目录?【英文标题】:Jenkins Continuous Integration with Amazon S3 - Everything is uploading to the root? 【发布时间】:2012-07-17 03:22:31 【问题描述】:

我正在运行 Jenkins,它成功地与我的 Github 帐户一起工作,但我无法让它与 Amazon S3 一起正常工作。

我安装了 S3 插件,当我运行构建时,它成功上传到我指定的 S3 存储桶,但所有上传的文件最终都在存储桶的根目录中。我有一堆文件夹(例如 /css /js 等),但是来自 hithub 的这些文件夹中的所有文件最终都在我的 S3 帐户的根目录中。

是否可以让S3插件上传并保留文件夹结构?

【问题讨论】:

【参考方案1】:

这似乎是不可能的。相反,我使用 s3cmd 来执行此操作。您必须首先将它安装在您的服务器上,然后在您可以使用的 Jenkins 作业中的一个 bash 脚本中:

s3cmd sync -r -P $WORKSPACE/ s3://YOUR_BUCKET_NAME

这会将所有文件复制到您的 S3 帐户,以维护文件夹结构。 -P 保留每个人的读取权限(如果您将存储桶用作 Web 服务器,则需要)。这是使用同步功能的绝佳解决方案,因为它会将您的所有本地文件与 S3 存储桶进行比较,并且仅复制已更改的文件(通过比较文件大小和校验和)。

【讨论】:

我建议现在使用 JClouds 插件。 JClouds 也不是很好;它一直因有关流媒体的晦涩错误而失败。为此不得不回退到 CLI 工具是可笑的...... s3cmd 不是最佳选择,因为它需要单独存储 aws 凭据。 s3 插件使用 s3 配置文件进行身份验证是有好处的。同意保留工件层次结构比当前行为更可取。【参考方案2】:

我从未使用过用于 Jenkins 的 S3 插件(但现在我知道它存在,我可能会尝试一下),但是,查看代码,似乎您只能使用解决方法来做您想做的事情。

这是实际插件代码的作用(取自 github)——为了便于阅读,我删除了代码中不相关的部分:

hudson.plugins.s3.S3Profile,方法upload

final Destination dest = new Destination(bucketName,filePath.getName());
getClient().putObject(dest.bucketName, dest.objectName, filePath.read(), metadata);

现在,如果您查看 hudson.FilePath.getName() 的 JavaDoc:

只获取没有目录的文件名部分。

现在,看看hudson.plugins.s3.Destination 的构造函数:

public Destination(final String userBucketName, final String fileName) 

    if (userBucketName == null || fileName == null) 
        throw new IllegalArgumentException("Not defined for null parameters: "+userBucketName+","+fileName);

    final String[] bucketNameArray = userBucketName.split("/", 2);
    bucketName = bucketNameArray[0];
    if (bucketNameArray.length > 1) 
        objectName = bucketNameArray[1] + "/" + fileName;
     else 
        objectName = fileName;
    

Destination 类 JavaDoc 说:

这里实现的约定是使用桶名中的/来构造对象名中的结构。也就是说,将 file.txt 放入存储桶名称“mybucket/v1”将导致在 mybucket 中创建对象“v1/file.txt”。

结论:filePath.getName() 调用会去除您添加到文件中的任何前缀(S3 没有任何目录,而是前缀,请参阅this 和this 线程了解更多信息)。如果您确实需要将文件放入“文件夹”(即具有包含斜杠 (/) 的特定前缀),我建议您将此前缀添加到存储桶名称的末尾,如 @ 987654332@类JavaDoc。

【讨论】:

【参考方案3】:

是的,这是可能的。

看起来对于每个文件夹目标,您都需要一个单独的 S3 插件实例。

“来源”是您要上传的文件。

“目标存储桶”是您放置路径的位置。

【讨论】:

不是完全递归的,但是可以上传到s3桶内的子目录中。【参考方案4】:

使用 Jenkins 1.532.2 和 S3 Publisher Plug-In 0.5,UI 配置作业屏幕会拒绝额外的 S3 发布条目。如果插件重新创建了工作区目录结构,我们也将获得显着的维护收益,因为我们将创建许多目录。

【讨论】:

那个插件不是更糟糕的尝试!一个文件上传是可以的,但它不保留目录结构。【参考方案5】:
    设置您的 git 插件。

    设置您的 Bash 脚本

    您文件夹中标记为“*”的所有内容都将进入存储桶

【讨论】:

以上是关于Jenkins 与 Amazon S3 的持续集成 - 一切都上传到根目录?的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins 学习笔记玩转持续集成与持续交付

Linux企业运维——持续集成与持续交付(下)jenkins节点与用户管理jenkins结合ansible

Linux企业运维——持续集成与持续交付(下)jenkins节点与用户管理jenkins结合ansible

Linux企业运维——持续集成与持续交付(下)jenkins节点与用户管理jenkins结合ansible

Jenkins持续化集成

Jenkins UI与接口自动化测试持续集成实战