可能这是一个反复出现的问题,但是我找不到在Bintray上发布Eclipse p2存储库的可靠方法。
手动创建仓库/产品/版本并填充文件是可以的,但是对于生产环境,需要可靠的可脚本化解决方案。
目的
将Eclipse p2存储库部署到Bintray。
什么是Eclipse p2存储库?
(对不起Eclipse的人们,但是对于Bintry的支持者,我们最好定义我们在说什么)。
Eclipse p2存储库是一个文件夹,必须在稳定且不会更改的单个URL上发布,即使及时发布了多个版本也是如此。
使用最新版本的Tycho Maven插件生成的Eclipse p2存储库文件夹具有以下结构:
根目录中的5个文件(p2.index
,artifacts.jar
,artifacts.xml.xz
,content.jar
,content.xml.xz
)
2个子文件夹plugins
和features
,每个都有多个.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存储库没有特定于版本的子文件夹,使用的两个子文件夹(
plugins
和features
)在每个版本中都具有相同的名称;无法访问特定于版本的子文件夹。因此,部署多个版本不应创建特定于版本的子文件夹,因为它们的内容将被忽略。
使用特定版本的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
文件以及features
和plugins
文件夹被提升为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.xz
和content.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.xz
和content.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.jar
,content.jar
和p2.index
)上传到存储库URL,但是对于所有其他文件,它将失败。通过此过程创建的存储库为:
https://dl.bintray.com/ilg-ul/repo1/
发布到仓库和产品/版本URL
我还尝试有选择地将一些文件上传到存储库,将一些文件上传到产品/版本(
artifacts.xml.xz
,content.xml.xz
和features
/ 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.xz
和content.xml.xz
考虑到使用不同的POST方法(repo6)发布到产品/版本URL是最高级的测试,因此确定的唯一问题是服务器拒绝上传
artifacts.xml.xz
和content.xml.xz
。创建中间文件夹并存储内容
URL(repo3)作为部分传递软件包和版本产生了最奇怪的结果,并带有其他文件夹:
pack3
3.2.1-201701141320
artifacts.jar
content.jar
p2.index
所有其他文件均已正确上载,但是以特殊(我会说是错误的)方式处理了这三个文件。
大多数文件尝试发布到仓库URL均失败
如果这不是发布到Bintray的合法方法,请忽略本节,但是仅尝试对以下3个文件
artifacts.jar
,content.jar
和p2.index
成功发布到仓库URL,而对于其他所有文件均失败。结论
作为结论,基于现有文档,我找不到可靠的方法将常用的Eclipse p2存储库发布到Bintray。
我看到了一些关于发布复合p2存储库的奇妙解决方案的建议,但这不是我的情况,我有两个通用的存储库,不需要任何版本控制(http://gnuarmeclipse.sourceforge.net/updates和http://gnuarmeclipse.sourceforge.net/updates-test),我想将其发布在Bintray。
对Bintray的建议
删除通用存储库中某些文件的特殊处理
这些测试证明,Bintray通用存储库不是通用的,因为它们没有按预期方式平等地处理所有文件。似乎已经尝试过支持Eclipse p2存储库,并且对服务器上载代码进行了补丁处理,以不同方式处理某些Eclipse文件,但是结果并不能完全发挥功能,并且非常令人困惑。
添加对Eclipse p2存储库的显式支持
如果Bintray支持新的存储库类型“ Eclipse p2”(其中没有产品或版本,并且每次发布都将允许删除所有现有文件并添加新的存储库),则不是为不幸的通用仓库打补丁,这将是很好的那些。
这等效于被允许在repo文件夹中发布,并且被允许以后随时删除并再次上传文件。
如果无法摆脱版本控制机制,则可以发布到版本文件夹,但是可以自动将最新版本的文件显示在产品文件夹中,如repo6所示,但请确保所有文件被接受,包括
artifacts.xml.xz
和content.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/