我正在运行Jenkins,我的GitHub账户可以成功运行它,但是我不能让它在Amazon S3上正常运行。我安装了S3插件,当我运行一个构建时,它成功地上传到我指定的S3 bucket,但所有上传的文件最终都在bucket的根目录下。我有一堆文件夹(如/css /js等),但这些文件夹中来自hithub的所有文件最终都在我的S3帐户的根目录下。是否可以让S3插件上传并保留文件夹结构?
w8ntj3qf1#
看起来这是不可能的,但是我使用s3 cmd来完成这个任务,你必须先在服务器上安装它,然后在Jenkins作业的bash脚本中用途:
s3cmd sync -r -P $WORKSPACE/ s3://YOUR_BUCKET_NAME
这将把所有文件复制到你的S3账户,并保持文件夹结构。-P为每个人保留读取权限(如果你把你的bucket作为一个网络服务器,这是需要的)。这是一个使用同步功能的很好的解决方案,因为它将你所有的本地文件与S3 bucket进行比较,并只复制已经改变的文件(通过比较文件大小和校验和)。
sy5wg1nm2#
我从来没有为Jenkins使用过S3插件(但是现在我知道它存在了,我可能会尝试一下),但是,看看代码,似乎你只能使用一个变通方案来做你想做的事情。下面是实际插件代码的作用(取自github)--为了可读性起见,我删除了代码中不相关的部分:类别hudson.plugins.s3.S3Profile,方法upload:
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的构造函数:
hudson.FilePath.getName()
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线程以了解更多信息)您添加到文件中。如果您确实需要将您的文件放入"文件夹"(例如,具有包含斜线(/)的特定前缀),我建议您将此前缀添加到存储桶名称的末尾,如Destination类JavaDoc中所述。
Destination
filePath.getName()
/
5ktev3wc3#
是的,这是可能的。它看起来像每个文件夹的目的地,你需要一个单独的示例的S3插件然而。"源"是你上传的文件。"目的地桶"是放置路径的地方。
pxq42qpu4#
使用Jenkins 1.532.2和S3 Publisher Plug-In 0.5时,UI配置作业屏幕会拒绝额外的S3发布条目。如果插件重新创建工作区目录结构,我们将有许多目录要创建,这也会给我们带来显著的维护优势。
kxxlusnw5#
1.设置git插件。
1.设置Bash脚本
1.您的文件夹中标记为“*”的所有内容将进入存储桶
5条答案
按热度按时间w8ntj3qf1#
看起来这是不可能的,但是我使用s3 cmd来完成这个任务,你必须先在服务器上安装它,然后在Jenkins作业的bash脚本中用途:
这将把所有文件复制到你的S3账户,并保持文件夹结构。-P为每个人保留读取权限(如果你把你的bucket作为一个网络服务器,这是需要的)。这是一个使用同步功能的很好的解决方案,因为它将你所有的本地文件与S3 bucket进行比较,并只复制已经改变的文件(通过比较文件大小和校验和)。
sy5wg1nm2#
我从来没有为Jenkins使用过S3插件(但是现在我知道它存在了,我可能会尝试一下),但是,看看代码,似乎你只能使用一个变通方案来做你想做的事情。
下面是实际插件代码的作用(取自github)--为了可读性起见,我删除了代码中不相关的部分:
类别
hudson.plugins.s3.S3Profile
,方法upload
:现在,如果您看一下
hudson.FilePath.getName()
的JavaDoc:只获取文件名部分,而不获取目录。
现在,看一下
hudson.plugins.s3.Destination
的构造函数:Destination
类JavaDoc表示:这里实现的约定是桶名中的/用于构造对象名中的结构,也就是说,将file.txt放入桶名"mybucket/v1"将导致在mybucket中创建对象"v1/file.txt"。
结论:
filePath.getName()
调用去掉所有前缀(S3没有任何目录,而是前缀,请参阅this和this线程以了解更多信息)您添加到文件中。如果您确实需要将您的文件放入"文件夹"(例如,具有包含斜线(/
)的特定前缀),我建议您将此前缀添加到存储桶名称的末尾,如Destination
类JavaDoc中所述。5ktev3wc3#
是的,这是可能的。
它看起来像每个文件夹的目的地,你需要一个单独的示例的S3插件然而。
"源"是你上传的文件。
"目的地桶"是放置路径的地方。
pxq42qpu4#
使用Jenkins 1.532.2和S3 Publisher Plug-In 0.5时,UI配置作业屏幕会拒绝额外的S3发布条目。如果插件重新创建工作区目录结构,我们将有许多目录要创建,这也会给我们带来显著的维护优势。
kxxlusnw5#
1.设置git插件。
1.设置Bash脚本
1.您的文件夹中标记为“*”的所有内容将进入存储桶