11

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

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

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

4

5 回答 5

16

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

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

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

于 2012-07-18T19:28:56.707 回答
3

我从未使用过 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()'s JavaDoc:

仅获取不带目录的文件名部分。

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

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

DestinationJavaDoc 类说:

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

结论:调用剥离了您添加到文件的filePath.getName()任何前缀(S3 没有任何目录,而是前缀,请参阅此线程以获取更多信息)。如果您确实需要将文件放入“文件夹”(即具有包含斜杠 ( /) 的特定前缀),我建议您将此前缀添加到存储桶名称的末尾,如DestinationJavaDoc 类中所明确说明的那样。

于 2012-07-18T13:38:52.863 回答
1

是的,这是可能的。

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

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

“目标桶”是您放置路径的地方。

于 2014-01-10T22:07:58.080 回答
1

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

于 2014-03-27T14:40:43.763 回答
1
  1. 设置你的 git 插件。

在此处输入图像描述

  1. 设置你的 Bash 脚本

在此处输入图像描述

  1. 标记为“*”的文件夹中的所有内容都将转到存储桶
于 2015-09-18T18:47:50.520 回答