eclipse - Bintray对Eclipse p2存储库的支持

标签 eclipse p2 bintray

可能这是一个反复出现的问题,但是我找不到在Bintray上发布Eclipse p2存储库的可靠方法。

手动创建仓库/产品/版本并填充文件是可以的,但是对于生产环境,需要可靠的可脚本化解决方案。

目的

将Eclipse p2存储库部署到Bintray。

什么是Eclipse p2存储库?

(对不起Eclipse的人们,但是对于Bintry的支持者,我们最好定义我们在说什么)。

Eclipse p2存储库是一个文件夹,必须在稳定且不会更改的单个URL上发布,即使及时发布了多个版本也是如此。

使用最新版本的Tycho Maven插件生成的Eclipse p2存储库文件夹具有以下结构:


根目录中的5个文件(p2.indexartifacts.jarartifacts.xml.xzcontent.jarcontent.xml.xz
2个子文件夹pluginsfeatures,每个都有多个.jar文件,具有特定于版本的名称,例如ilg.gnuarmeclipse.core_3.3.1.201702251311.jar


例如:

artifacts.jar
artifacts.xml.xz
content.jar
content.xml.xz
features
    ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar
    ...
p2.index
plugins
    ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar
    ...


我要部署的确切的p2存储库文件夹是:


https://sourceforge.net/projects/gnuarmeclipse/files/Eclipse/updates/
https://sourceforge.net/projects/gnuarmeclipse/files/Eclipse/updates-test/


(都是GNU ARM Eclipse项目的一部分)。

必须在Eclipse中配置才能访问这两个p2存储库的实际URL是:


http://gnuarmeclipse.sourceforge.net/updates
http://gnuarmeclipse.sourceforge.net/updates-test


访问这些p2存储库实际上是对这些URL下方的文件的一系列访问,例如:

$ curl -L http://gnuarmeclipse.sourceforge.net/updates/p2.index 
#Sat Feb 25 15:11:37 EET 2017 version=1 
metadata.repository.factory.order=content.xml.xz,content.xml,\! 
artifact.repository.factory.order=artifacts.xml.xz,artifacts.xml,\! 
$


使用版本特定的子文件夹

Eclipse p2存储库没有特定于版本的子文件夹,使用的两个子文件夹(pluginsfeatures)在每个版本中都具有相同的名称;无法访问特定于版本的子文件夹。

因此,部署多个版本不应创建特定于版本的子文件夹,因为它们的内容将被忽略。

使用特定版本的URL

Eclipse插件在其中配置了一个URL,该URL可用于自动获取新更新。这是p2存储库的URL,不能更改为指向特定于版本的URL,因此,为使更新生效,p2存储库应具有唯一的URL。

Eclipse p2存储库生命周期

Eclipse p2存储库的生命周期应允许新版本完全替换先前版本,即,前5个文件和两个子文件夹都应属于一个版本;如果由于某种原因发布失败,则以前的版本应该继续可见,并且保持不变


一旦发布版本,与之关联的文件将永远不会更改,因此不必将给定文件替换为具有相同名称但内容不同的文件
但是,顶级文件和文件夹在所有发行版中都具有相同的名称,并且服务器应允许上传它们,而不会抱怨该名称已由先前版本上传
尚不清楚提前发布新版本的时间,每个月可能会有一个版本,但也可能相隔180天以上


发布到产品/版本URL

第一次尝试是使用以下bash函数将所有文件上传到产品/版本URL:

curl \
  --request PUT \
  --upload-file "${file_absolute_path}" \
  --user ${BINTRAY_USER}:${BINTRAY_API_KEY} \
"${API}/content/${BINTRAY_OWNER}/${repo}/${package}/${version}/${file_relative_path}?publish=1?override=1?explode=0"


上载成功:

Processing artifacts.jar file...
{"message":"success"}
Processing artifacts.xml.xz file...
{"message":"success"}
Processing content.jar file...
{"message":"success"}
Processing content.xml.xz file...
{"message":"success"}
Processing p2.index file...
{"message":"success"}
Processing feature: features/ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar file...
{"message":"success"}
Processing plugin: plugins/ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar file...
{"message":"success"}


但是,尽管所有文件的上传方式相同,但是某些文件还是按预期方式存储在repo文件夹中,而不是在product / version文件夹中:

artifacts.xml.xz
content.xml.xz
features
    ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar
pack3
    3.2.1-201701141320
        artifacts.jar
        content.jar
        p2.index
plugins
    ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar


请注意,尽管我没有为任何文件明确设置list_in_downloads属性,但是上载到product / version的某些文件已移至父仓库目录。

可以看出,*.xz文件以及featuresplugins文件夹被提升为repo文件夹,而*.jar文件和p2.index文件被忽略了。

通过此过程创建的存储库为:


https://dl.bintray.com/ilg-ul/repo3/


使用不同的POST方法发布到产品/版本URL

如所记载,有3种传递参数以卷曲的方法。先前的测试使用了一个。在另外两个测试中,我尝试了以下两个,并使用以下上传代码:

curl \
  --request PUT \
  --upload-file "${file_absolute_path}" \
  --user ${BINTRAY_USER}:${BINTRAY_API_KEY} \
  --header "X-Bintray-Package: ${package}" \
  --header "X-Bintray-Version: ${version}" \
  --header "X-Bintray-Publish: 1" \
  --header "X-Bintray-Override: 1" \
  --header "X-Bintray-Explode: 0" \
  "${API}/content/${BINTRAY_OWNER}/${repo}/${file_relative_path}"


并分别与

curl \
  --request PUT \
  --upload-file "${file_absolute_path}" \
  --user ${BINTRAY_USER}:${BINTRAY_API_KEY} \
  "${API}/content/${BINTRAY_OWNER}/${repo}/${file_relative_path};bt_package=${package};bt_version=${version};publish=1;override=1;explode=0"


两者的表现都比以前的测试好,第一个版本的上传成功,并且文件夹结构得以保留:

artifacts.jar
artifacts.xml.xz
content.jar
content.xml.xz
features
    ilg.gnuarmeclipse.codered_1.1.1.201701141320.jar
p2.index        
plugins
    ilg.gnuarmeclipse.codered_1.1.1.201701141320.jar


但是上传第二个版本时,大多数文件都可以,除了artifacts.xml.xzcontent.xml.xz失败:

Upload 'artifacts.jar' to '/repo6/pack6/3.3.1-201702251311/'
{"message":"success"}
Upload 'artifacts.xml.xz' to '/repo6/pack6/3.3.1-201702251311/'
{"message":"Unable to upload files: An artifact with the path 'artifacts.xml.xz' already exists under another version"}
Upload 'content.jar' to '/repo6/pack6/3.3.1-201702251311/'
{"message":"success"}
Upload 'content.xml.xz' to '/repo6/pack6/3.3.1-201702251311/'
{"message":"Unable to upload files: An artifact with the path 'content.xml.xz' already exists under another version"}
Upload 'p2.index' to '/repo6/pack6/3.3.1-201702251311/'
{"message":"success"}
...


请注意,据我所知,这些文件没有什么特别之处。

使用此过程创建的存储库是


https://dl.bintray.com/ilg-ul/repo6/


尽管它看起来像一个有效的p2存储库,但它不是,因为大多数文件来自第二个版本,但是artifacts.xml.xzcontent.xml.xz来自第一个版本,因此存储库不一致。

发布到仓库URL

尽管Bintray文档中没有正式提及,但有些人建议尝试上传到较短的路径,该路径对应于根或回购URL。

我做到了,使用以下代码:

curl \
  --request PUT \
  --upload-file "${file_absolute_path}" \
  --user ${BINTRAY_USER}:${BINTRAY_API_KEY} \
  "${API}/content/${BINTRAY_OWNER}/${repo}/${file_relative_path}?publish=1?override=1"


但是在这种情况下,大多数文件都出现错误:

Processing artifacts.jar file...
{"message":"success"}
Processing artifacts.xml.xz file...
{"message":"Invalid file path and name"}
Processing content.jar file...
{"message":"success"}
Processing content.xml.xz file...
{"message":"Invalid file path and name"}
Processing p2.index file...
{"message":"success"}
Processing feature: features/ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar file...
{"message":"Invalid file path and name"}
Processing plugin: plugins/ilg.gnuarmeclipse.codered_1.1.1.201702231729.jar file...
{"message":"Invalid file path and name"}


看起来上传机制很挑剔,并且可以将某些文件(例如artifacts.jarcontent.jarp2.index)上传到存储库URL,但是对于所有其他文件,它将失败。

通过此过程创建的存储库为:


https://dl.bintray.com/ilg-ul/repo1/


发布到仓库和产品/版本URL

我还尝试有选择地将一些文件上传到存储库,将一些文件上传到产品/版本(artifacts.xml.xzcontent.xml.xzfeatures / plugins文件夹);这创建了正确的p2,但是当我尝试为另一个版本重复该过程时,出现错误:

Processing artifacts.jar file...
{"message":"success"}
Processing artifacts.xml.xz file...
{"message":"Unable to upload files: An artifact with the path 'artifacts.xml.xz' already exists under another version"}
Processing content.jar file...
{"message":"success"}
Processing content.xml.xz file...
{"message":"Unable to upload files: An artifact with the path 'content.xml.xz' already exists under another version"}
Processing p2.index file...
{"message":"success"}


override标志

请注意,所有测试均设置了override标志。

publish标志

请注意,尽管不是预期的行为,但所有测试均设置了publish标志。

为了使存储库保持一致,预期的行为是尝试上载没有发布标志的所有文件,并在所有文件都正确上载后在最后进行发布。如果发生错误,而没有发出publish命令,则预期可以为旧版本发布的文件仍然可访问。

完整的测试脚本

可以从GitHub gists获得用于这些测试的完整bash脚本(还有更多):


https://gist.github.com/ilg-ul/568a6806d5e97fcc1384d7acda4ffe36


要下载此脚本,请使用以下命令

mkdir -p "${HOME}/Downloads"
curl -L https://gist.github.com/ilg-ul/568a6806d5e97fcc1384d7acda4ffe36/raw/2df98f4899862f1d7e65f1601ccdbd320dce9021/bintray-test.sh -o "${HOME}/Downloads/bintray-test.sh"


该脚本期望在环境中设置以下变量:

export BINTRAY_USER=<user>
export BINTRAY_API_KEY=<auth>
export BINTRAY_OWNER=${BINTRAY_USER}


要运行脚本,请输入:

bash "${HOME}/Downloads/bintray-test.sh"


发现的问题

拒绝服务器上传artifacts.xml.xzcontent.xml.xz

考虑到使用不同的POST方法(repo6)发布到产品/版本URL是最高级的测试,因此确定的唯一问题是服务器拒绝上传artifacts.xml.xzcontent.xml.xz

创建中间文件夹并存储内容

URL(repo3)作为部分传递软件包和版本产生了最奇怪的结果,并带有其他文件夹:

pack3
    3.2.1-201701141320
        artifacts.jar
        content.jar
        p2.index


所有其他文件均已正确上载,但是以特殊(我会说是错误的)方式处理了这三个文件。

大多数文件尝试发布到仓库URL均失败

如果这不是发布到Bintray的合法方法,请忽略本节,但是仅尝试对以下3个文件artifacts.jarcontent.jarp2.index成功发布到仓库URL,而对于其他所有文件均失败。

结论

作为结论,基于现有文档,我找不到可靠的方法将常用的Eclipse p2存储库发布到Bintray。

我看到了一些关于发布复合p2存储库的奇妙解决方案的建议,但这不是我的情况,我有两个通用的存储库,不需要任何版本控制(http://gnuarmeclipse.sourceforge.net/updateshttp://gnuarmeclipse.sourceforge.net/updates-test),我想将其发布在Bintray。

对Bintray的建议

删除通用存储库中某些文件的特殊处理

这些测试证明,Bintray通用存储库不是通用的,因为它们没有按预期方式平等地处理所有文件。似乎已经尝试过支持Eclipse p2存储库,并且对服务器上载代码进行了补丁处理,以不同方式处理某些Eclipse文件,但是结果并不能完全发挥功能,并且非常令人困惑。

添加对Eclipse p2存储库的显式支持

如果Bintray支持新的存储库类型“ Eclipse p2”(其中没有产品或版本,并且每次发布都将允许删除所有现有文件并添加新的存储库),则不是为不幸的通用仓库打补丁,这将是很好的那些。

这等效于被允许在repo文件夹中发布,并且被允许以后随时删除并再次上传文件。

如果无法摆脱版本控制机制,则可以发布到版本文件夹,但是可以自动将最新版本的文件显示在产品文件夹中,如repo6所示,但请确保所有文件被接受,包括artifacts.xml.xzcontent.xml.xz

2017-03-31更新

在与Bintray支持人员交换了无数消息之后,他们终于了解了问题并提供了解决方案。

现在运行脚本可用于测试4、5和6,它们基本上是相同的,只是信息传递给Bintray的方式略有不同。

测试结果为:


上载到仓库根目录无法正常工作
直接上载,将包和版本指定为文件目标路径的路径前缀(不起作用)
使用HTTP标头指定软件包和版本时可以上传
使用HTTP矩阵参数指定软件包和版本时进行上传是可以的


总之,请勿尝试上传到根URL并使用HTTP标头或HTTP矩阵参数。

2017-07-31更新

我已经将更新站点托管在Bintray上已有几个月了,事情似乎还不错:https://bintray.com/gnu-mcu-eclipse

用于发布的实际脚本为:https://github.com/gnu-mcu-eclipse/eclipse-plugins/blob/develop/scripts/publish-updates.sh

用于更新站点的公共URL如下:https://dl.bintray.com/gnu-mcu-eclipse/updates

实际上,有多个Bintray存储库,用于项目的不同“阶段”(https://bintray.com/gnu-mcu-eclipse);在它们下面是一个单一的Bintray软件包(我称之为p2),在它下面是多个Bintray版本(https://bintray.com/gnu-mcu-eclipse/v4-neon-updates-experimental/p2)。

最佳答案

去年我一直在努力解决完全相同的问题
尝试通过curl将简单的Eclipse p2存储库上载到Bintray时。
article of Lorenzo Bettini的启发
我找到了解决方案。
关键是在URL中使用路径和矩阵参数,例如:

curl -X PUT -T $F -u $BINTRAY_USER:$BINTRAY_API_KEY "https://api.bintray.com/content/$BT_OWNER/$BT_REPO/$BT_PACKAGE/$BT_VERSION/$F;bt_package=$BT_PACKAGE;bt_version=$BT_VERSION;publish=1"


随时查看我的shell脚本deployToBintray.sh

关于eclipse - Bintray对Eclipse p2存储库的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42445278/

相关文章:

c++ - 未使用 SDL 执行的程序

android - 如何在eclipse上从android 5.0降级到android 4.1

java - 为什么解析器可以工作,但当我尝试打印它时却返回空数据?

eclipse - 如何构建 Eclipse RCP 应用程序以便其功能可以自动更新?

eclipse - P2 Touchpoint chmod 不起作用?

android - 无法将android库添加到JCenter

node.js - 比较编辑器不在 node.js 项目上的 eclipse 上工作

eclipse - 用于管理/托管自己的 p2 存储库的工具?

android - ProjectScopeServices 中没有可用的工厂类型服务

android-studio - 任务 ':bintrayUpload' 执行失败。 > 无法创建版本 '1.1-Final TestApp' : HTTP/1. 1 400 错误请求