我正在运行 Jenkins,它成功地与我的 Github 帐户一起工作,但我无法让它与 Amazon S3 一起正常工作。
我安装了 S3 插件,当我运行构建时,它成功上传到我指定的 S3 存储桶,但所有上传的文件最终都在存储桶的根目录中。我有一堆文件夹(例如 /css /js 等),但是来自 hithub 的这些文件夹中的所有文件最终都在我的 S3 帐户的根目录中。
是否可以让 S3 插件上传并保留文件夹结构?
我正在运行 Jenkins,它成功地与我的 Github 帐户一起工作,但我无法让它与 Amazon S3 一起正常工作。
我安装了 S3 插件,当我运行构建时,它成功上传到我指定的 S3 存储桶,但所有上传的文件最终都在存储桶的根目录中。我有一堆文件夹(例如 /css /js 等),但是来自 hithub 的这些文件夹中的所有文件最终都在我的 S3 帐户的根目录中。
是否可以让 S3 插件上传并保留文件夹结构?
看起来这是不可能的。相反,我使用 s3cmd 来执行此操作。您必须首先将它安装在您的服务器上,然后在您可以使用的 Jenkins 作业中的一个 bash 脚本中:
s3cmd sync -r -P $WORKSPACE/ s3://YOUR_BUCKET_NAME
这会将所有文件复制到您的 S3 帐户,以维护文件夹结构。-P 保留每个人的读取权限(如果您将存储桶用作 Web 服务器,则需要)。这是使用同步功能的绝佳解决方案,因为它将所有本地文件与 S3 存储桶进行比较,并且仅复制已更改的文件(通过比较文件大小和校验和)。
我从未使用过 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;
}
}
Destination
JavaDoc 类说:
这里实现的约定是桶名中的 / 用于构造对象名中的结构。也就是说,将 file.txt 放入存储桶名称“mybucket/v1”将导致在 mybucket 中创建对象“v1/file.txt”。
结论:调用剥离了您添加到文件的filePath.getName()
任何前缀(S3 没有任何目录,而是前缀,请参阅此和此线程以获取更多信息)。如果您确实需要将文件放入“文件夹”(即具有包含斜杠 ( /
) 的特定前缀),我建议您将此前缀添加到存储桶名称的末尾,如Destination
JavaDoc 类中所明确说明的那样。
是的,这是可能的。
看起来对于每个文件夹目标,您都需要一个单独的 S3 插件实例。
“源”是您要上传的文件。
“目标桶”是您放置路径的地方。
使用 Jenkins 1.532.2 和 S3 Publisher Plug-In 0.5,UI 配置作业屏幕拒绝额外的 S3 发布条目。如果插件重新创建工作区目录结构,我们也会有很大的维护好处,因为我们将创建许多目录。