Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 Jenkins与Amazon S3的持续集成-所有内容都上传到根目录?_Amazon S3_Continuous Integration_Jenkins_Amazon - Fatal编程技术网

Amazon s3 Jenkins与Amazon S3的持续集成-所有内容都上传到根目录?

Amazon s3 Jenkins与Amazon S3的持续集成-所有内容都上传到根目录?,amazon-s3,continuous-integration,jenkins,amazon,Amazon S3,Continuous Integration,Jenkins,Amazon,我正在运行Jenkins,我已经成功地使用我的Github帐户,但是我无法让它在AmazonS3上正常工作 我安装了S3插件,当我运行一个构建时,它成功地上传到我指定的S3存储桶,但是上传的所有文件最终都在存储桶的根目录中。我有一堆文件夹(比如/css/js等等),但hithub文件夹中的所有文件最终都位于我S3帐户的根目录下 有没有可能让S3插件上传并保留文件夹结构?我从来没有为Jenkins使用过S3插件(但现在我知道它存在,我可能会尝试一下),不过,看看代码,似乎你只能使用变通方法来做你想

我正在运行Jenkins,我已经成功地使用我的Github帐户,但是我无法让它在AmazonS3上正常工作

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


有没有可能让S3插件上传并保留文件夹结构?

我从来没有为Jenkins使用过S3插件(但现在我知道它存在,我可能会尝试一下),不过,看看代码,似乎你只能使用变通方法来做你想做的事情

以下是实际的插件代码(取自github)——为了可读性,我删除了代码中不相关的部分:

class
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说:

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


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

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

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

是的,这是可能的

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

“源”是您正在上载的文件


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

使用Jenkins 1.532.2和S3 Publisher插件0.5,UI配置作业屏幕拒绝其他S3发布条目。如果插件重新创建了工作区目录结构,我们将有许多目录要创建,那么对我们的维护也会有很大的好处

  • 设置git插件
  • 设置Bash脚本
  • 标记为“*”的文件夹中的所有内容都将转到bucket

  • 我建议现在就使用JClouds插件;它不断失败,出现了一个关于流的模糊错误。为此不得不回退到CLI工具是荒谬的……s3cmd不是最佳选择,因为它需要单独存储aws凭据。s3插件使用s3配置文件进行身份验证是有好处的。同意保留工件层次结构比当前行为更可取。该插件并不是最糟糕的尝试!一个文件上传是可以的,但它不保持目录结构。它不是完全递归的,但你可以上传到s3存储桶中的子目录。