将工件上传到 Nexus,无需 Maven
我有一个生成版本化构建工件的非 Java 项目,我想将其上传到 Nexus 存储库。由于该项目不是 Java,因此它不使用 Maven 进行构建。我不想引入 Maven/POM 文件只是为了将文件导入 Nexus。
博客上的 Nexus REST API 链接最终都出现在登录墙上,我看不到“创建用户”链接。
那么,在没有 Maven 的情况下将构建工件上传到 Nexus 存储库的最佳(或任何合理)方法是什么? “bash +curl”会很棒,甚至是一个 Python 脚本。
I have a non-Java project that produces a versioned build artifact, and I want to upload this to a Nexus repository. Because the project isn't Java, it doesn't use Maven for builds. And I'd rather not introduce Maven/POM files just to get files into Nexus.
The links on blogs to the Nexus REST API all end up at a sign-in wall, with no "create user" link that I can see.
So, what's the best (or any reasonable) way to upload build artifacts to a Nexus repository without Maven? "bash + curl" would be great, or even a Python script.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
您是否考虑过使用 Maven 命令行上传文件?
这将自动生成工件的 Maven POM。
更新
以下 Sonatype 文章指出“deploy-file”maven 插件是最简单的解决方案,但它还提供了一些使用curl 的示例:
https://support.sonatype.com/entries/22189106-How-can-I-programatically-upload-an-artifact -进入-Nexus-
Have you considering using the Maven command-line to upload files?
This will automatically generate the Maven POM for the artifact.
Update
The following Sonatype article states that the "deploy-file" maven plugin is the easiest solution, but it also provides some examples using curl:
https://support.sonatype.com/entries/22189106-How-can-I-programatically-upload-an-artifact-into-Nexus-
使用curl:
您可以在此处查看参数的含义: https://support.sonatype.com/entries/22189106-How-can-I-programatically-upload-an-artifact-into-Nexus-
为了使这项工作的权限,我创建了一个新角色管理 GUI 和我为该角色添加了两个权限:Artifact Download 和 Artifact Upload。标准的“Repo:所有 Maven 存储库(完全控制)”角色还不够。
您在 Nexus 服务器附带的 REST API 文档中找不到此内容,因此这些参数将来可能会发生变化。
在 Sonatype JIRA 问题上,有人提到他们“将彻底改革 REST API(及其方式)文档是在即将发布的版本中生成的,很可能是在今年晚些时候”。
Using curl:
You can see what the parameters mean here: https://support.sonatype.com/entries/22189106-How-can-I-programatically-upload-an-artifact-into-Nexus-
To make the permissions for this work, I created a new role in the admin GUI and I added two privileges to that role: Artifact Download and Artifact Upload. The standard "Repo: All Maven Repositories (Full Control)"-role is not enough.
You won't find this in the REST API documentation that comes bundled with the Nexus server, so these parameters might change in the future.
On a Sonatype JIRA issue, it was mentioned that they "are going to overhaul the REST API (and the way it's documentation is generated) in an upcoming release, most likely later this year".
您绝对可以在不使用任何与 MAVEN 相关的内容的情况下执行此操作。我个人使用NING HttpClient(v1.8.16,支持java6)。
无论出于何种原因,Sonatype 都让我们很难弄清楚正确的 URL、标头和有效负载应该是什么;我不得不嗅探流量并猜测...那里有一些几乎有用的博客/文档,但是它要么与
oss.sonatype.org
无关,要么就是基于 XML(我发现它根本不起作用)。恕我直言,他们的文档是垃圾,希望未来的寻求者能发现这个答案有用。非常感谢 https://stackoverflow.com/a/33414423/2101812 他们的帖子,因为它很有帮助。如果您在 oss.sonatype.org 以外的地方发布,只需将其替换为正确的主机即可。
这是我为完成此任务而编写的(CC0 许可)代码。其中
profile
是您的 sonatype/nexus profileID(例如4364f3bbaf163
)和repo
(例如comdorkbox-1003
)当您上传初始 POM/Jar 时,会从响应中解析。关闭存储库:
升级存储库:
删除存储库:
删除签名粪便:
文件上传:
编辑1:
如何获取存储库的活动/状态
You can ABSOLUTELY do this without using anything MAVEN related. I personally use the NING HttpClient (v1.8.16, to support java6).
For whatever reason, Sonatype makes it incredibly difficulty to figure out what the correct URLs, headers, and payloads are supposed to be; and I had to sniff the traffic and guess... There are some barely useful blogs/documentation there, however it is either irrelevant to
oss.sonatype.org
, or it's XML based (and I found out it doesn't even work). Crap documentation on their part, IMHO, and hopefully future seekers can find this answer useful. Many thanks to https://stackoverflow.com/a/33414423/2101812 for their post, as it helped a lot.If you release somewhere other than
oss.sonatype.org
, just replace it with whatever the correct host is.Here is the (CC0 licensed) code I wrote to accomplish this. Where
profile
is your sonatype/nexus profileID (such as4364f3bbaf163
) andrepo
(such ascomdorkbox-1003
) are parsed from the response when you upload your initial POM/Jar.Close repo:
Promote repo:
Drop repo:
Delete signature turds:
File uploads:
EDIT1:
How to get the activity/status for a repo
无需使用这些命令..您可以直接使用 Nexus Web 界面,以便使用 GAV 参数上传您的 JAR。
所以非常简单。
No need to use these commands .. you can directly use the nexus web Interface in order to upload your JAR using GAV parameters.
So it is very simple.
您需要对 Nexus 进行的调用是 REST api 调用。
maven-nexus-plugin 是一个 Maven 插件,您可以使用它来进行这些调用。您可以创建一个具有必要属性的虚拟 pom,并通过 Maven 插件进行这些调用。
类似的事情:
假设的事情:
最终,这一切都是为了创建对 Nexus 的 REST 调用。有一个完整的 Nexus REST api,但我很难找到不在付费专区后面的文档。您可以打开上面插件的调试模式并使用
-Dnexus.verboseDebug=true -X
来弄清楚。理论上,您还可以进入 UI,打开 Firebug Net 面板,观察 /service POST 并推断出那里的路径。
The calls that you need to make against Nexus are REST api calls.
The maven-nexus-plugin is a Maven plugin that you can use to make these calls. You could create a dummy pom with the necessary properties and make those calls through the Maven plugin.
Something like:
Assumed things:
Ultimately, all this is doing is creating REST calls into Nexus. There is a full Nexus REST api but I have had little luck finding documentation for it that's not behind a paywall. You can turn on the debug mode for the plugin above and figure it out however by using
-Dnexus.verboseDebug=true -X
.You could also theoretically go into the UI, turn on the Firebug Net panel, and watch for /service POSTs and deduce a path there as well.
您还可以使用curl 来使用直接部署方法。您的文件不需要 pom,但它也不会生成,因此如果您想要一个,则必须单独上传。
这是命令:
You can also use the direct deploy method using curl. You don't need a pom for your file for it but it will not be generated as well so if you want one, you will have to upload it separately.
Here is the command:
在 ruby 中 https://github.com/RiotGames/nexus_cli 围绕 Sonatype Nexus REST 调用的 CLI 包装器。
使用示例:
配置是通过
.nexus_cli
文件完成的。In ruby https://github.com/RiotGames/nexus_cli A CLI wrapper around Sonatype Nexus REST calls.
Usage Example:
Configuration is done via the
.nexus_cli
file.对于那些需要 Java 的人,使用 apache httpcomponents 4.0:
for those who need it in Java, using apache httpcomponents 4.0:
如果您需要方便的命令行界面或 python API,请查看 repositorytools
使用它,您可以使用命令将工件上传到nexus
要使其工作,您还需要设置一些环境变量
If you need a convenient command line interface or python API, look at repositorytools
Using it, you can upload artifact to nexus with command
To make it work, you will also need to set some environment variables
对于最新版本的 Nexus OSS (>= 3.9.0)
https://support.sonatype.com/hc/en-us/articles/115006744008-How-can-I-programmatically-upload-files-into-Nexus -3-
版本 3.9.0 至 3.13.0 的示例:
For recent versions of Nexus OSS (>= 3.9.0)
https://support.sonatype.com/hc/en-us/articles/115006744008-How-can-I-programmatically-upload-files-into-Nexus-3-
Example for versions 3.9.0 to 3.13.0:
您可以通过单击 Nexus 服务器中的上传工件按钮来手动上传工件,并提供上传所需的 GAV 属性(通常是用于存储工件的文件结构)
You can manually upload the artifact's by clicking on upload artifacts button in the Nexus server and provide the necessary GAV properties for uploading(it's generally the file structure for storing the artifact)
如果您想在 2023 年上传到 Nexus 中的存储库,请按照如下所示的步骤操作。 Nexus 更新了他们的 API 端点。
(该示例已使用 Node 项目中的 tar/zip 文件进行了测试,如 OP 请求的那样)
注意确保您的用户名和密码使用 base64 进行编码,否则这将不起作用。
将您的用户名和密码转换为 Base64 字符串。
在授权标头中添加该回显的输出。
本例中的资产名称是您要上传的文件。
If you want to upload to your repository in Nexus in 2023, follow steps as shown below. Nexus updated their API endpoints.
(The example has been tested with a tar/zip file from a Node project, like OP requested)
Note make sure your username and password are encoded with base64, else this won't work.
Transform your username and password into a base64 string.
Add the output of that echo in the Authorization Header.
The asset name in this case is the file you want to upload.
@Adam Vandenberg 用于将 Java 代码发布到 Nexus。
https://github.com/manbalagan/nexusuploader
@Adam Vandenberg For Java code to POST to Nexus.
https://github.com/manbalagan/nexusuploader
您可以使用卷曲代替。
You can use curl instead.