Maven 用于将人工制品从快照提升到发布存储库的Curl语法

Maven 用于将人工制品从快照提升到发布存储库的Curl语法,maven,curl,nexus,Maven,Curl,Nexus,有人知道用于将工件从Nexus Snapshot Repo升级到Release Repository的curl语法吗?据我所知,没有这样的东西。您需要更改pom文件并进行部署。据我所知,没有这样的事情。您需要更改pom文件并进行部署。不,您不能。您必须执行完整发布:mvn发布:准备发布:执行不,您不能。您必须执行完整版本:mvn发布:准备发布:执行Nexus Pro的暂存套件允许您通过多个步骤将部署到临时暂存存储库的发布工件升级到最终版本存储库中。有一个RESTAPI用于自动化此操作,但您也可以

有人知道用于将工件从Nexus Snapshot Repo升级到Release Repository的curl语法吗?

据我所知,没有这样的东西。您需要更改pom文件并进行部署。

据我所知,没有这样的事情。您需要更改pom文件并进行部署。

不,您不能。您必须执行完整发布:
mvn发布:准备发布:执行

不,您不能。您必须执行完整版本:
mvn发布:准备发布:执行

Nexus Pro的暂存套件允许您通过多个步骤将部署到临时暂存存储库的发布工件升级到最终版本存储库中。有一个RESTAPI用于自动化此操作,但您也可以使用Nexus Staging Maven插件或Ant任务。对于所有这些和更多的问题,这个系统有更多的指针


但是,它与将快照工件升级到发行版无关。这通常被视为一种不好的做法,因为它需要POM文件重写。

Nexus Pro的暂存套件允许您通过多个步骤将部署到临时暂存存储库的发布工件升级到最终发布存储库中。有一个RESTAPI用于自动化此操作,但您也可以使用Nexus Staging Maven插件或Ant任务。对于所有这些和更多的问题,这个系统有更多的指针


但是,它与将快照工件升级到发行版无关。这通常被视为一种不好的做法,因为它需要重写POM文件。

您可以绝对地对所有内容使用curl。我个人使用的是HttpClient(v1.8.16)

无论出于何种原因,Sonatype都让我们很难弄清楚正确的URL、头和有效负载应该是什么;我不得不嗅着车流猜测。。。那里有一些几乎没有用处的博客/文档,但是它要么与oss.sonatype.org无关,要么是基于XML的(我发现它甚至不起作用)。IMHO,他们的垃圾文档,希望未来的搜索者能找到有用的答案

我不认为您可以在不生成另一个构建的情况下从一个快照转到另一个发布,但是如果您创建另一个构建并直接部署到staging repo,并从staging->RELEASE升级,这将实现我认为您想要的

如果您发布到Nexus而不是oss.sonatype.org,只需将其替换为正确的主机即可

您感兴趣的URL
”https://oss.sonatype.org/service/local/staging/profiles/“+profile+”/finish“

其中,
profile
是您上传初始POM/Jar时的sonatype/nexus profileID(例如,
4364f3bbaf163

下面是我为实现这一点而编写的(CC0许可)代码。上传初始POM/Jar时,
repo
(例如
comdorkbox-1003
)也会从响应中解析出来

结束回购:

/**
 * Closes the repo and (the server) will verify everything is correct.
 * @throws IOException
 */
private static
String closeRepo(final String authInfo, final String profile, final String repo, final String nameAndVersion) throws IOException {

    String repoInfo = "{'data':{'stagedRepositoryId':'" + repo + "','description':'Closing " + nameAndVersion + "'}}";
    RequestBuilder builder = new RequestBuilder("POST");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/profiles/" + profile + "/finish")
                             .addHeader("Content-Type", "application/json")
                             .addHeader("Authorization", "Basic " + authInfo)

                             .setBody(repoInfo.getBytes(OS.UTF_8))

                             .build();

    return sendHttpRequest(request);
}
促进回购:

/**
 * Promotes (ie: release) the repo. Make sure to drop when done
 * @throws IOException
 */
private static
String promoteRepo(final String authInfo, final String profile, final String repo, final String nameAndVersion) throws IOException {

    String repoInfo = "{'data':{'stagedRepositoryId':'" + repo + "','description':'Promoting " + nameAndVersion + "'}}";
    RequestBuilder builder = new RequestBuilder("POST");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/profiles/" + profile + "/promote")
                     .addHeader("Content-Type", "application/json")
                     .addHeader("Authorization", "Basic " + authInfo)

                     .setBody(repoInfo.getBytes(OS.UTF_8))

                     .build();
    return sendHttpRequest(request);
}
放弃回购:

/**
 * Drops the repo
 * @throws IOException
 */
private static
String dropRepo(final String authInfo, final String profile, final String repo, final String nameAndVersion) throws IOException {

    String repoInfo = "{'data':{'stagedRepositoryId':'" + repo + "','description':'Dropping " + nameAndVersion + "'}}";
    RequestBuilder builder = new RequestBuilder("POST");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/profiles/" + profile + "/drop")
                     .addHeader("Content-Type", "application/json")
                     .addHeader("Authorization", "Basic " + authInfo)

                     .setBody(repoInfo.getBytes(OS.UTF_8))

                     .build();

    return sendHttpRequest(request);
}
删除签名垃圾:

/**
 * Deletes the extra .asc.md5 and .asc.sh1 'turds' that show-up when you upload the signature file. And yes, 'turds' is from sonatype
 * themselves. See: https://issues.sonatype.org/browse/NEXUS-4906
 * @throws IOException
 */
private static
void deleteSignatureTurds(final String authInfo, final String repo, final String groupId_asPath, final String name,
                          final String version, final File signatureFile)
                throws IOException {

    String delURL = "https://oss.sonatype.org/service/local/repositories/" + repo + "/content/" +
                    groupId_asPath + "/" + name + "/" + version + "/" + signatureFile.getName();

    RequestBuilder builder;
    Request request;

    builder = new RequestBuilder("DELETE");
    request = builder.setUrl(delURL + ".sha1")
                     .addHeader("Authorization", "Basic " + authInfo)
                     .build();
    sendHttpRequest(request);

    builder = new RequestBuilder("DELETE");
    request = builder.setUrl(delURL + ".md5")
                     .addHeader("Authorization", "Basic " + authInfo)
                     .build();
    sendHttpRequest(request);
}
文件上载:

    public
    String upload(final File file, final String extension, String classification) throws IOException {

        final RequestBuilder builder = new RequestBuilder("POST");
        final RequestBuilder requestBuilder = builder.setUrl(uploadURL);
        requestBuilder.addHeader("Authorization", "Basic " + authInfo)

                      .addBodyPart(new StringPart("r", repo))
                      .addBodyPart(new StringPart("g", groupId))
                      .addBodyPart(new StringPart("a", name))
                      .addBodyPart(new StringPart("v", version))
                      .addBodyPart(new StringPart("p", "jar"))
                      .addBodyPart(new StringPart("e", extension))
                      .addBodyPart(new StringPart("desc", description));


        if (classification != null) {
            requestBuilder.addBodyPart(new StringPart("c", classification));
        }

        requestBuilder.addBodyPart(new FilePart("file", file));
        final Request request = requestBuilder.build();

        return sendHttpRequest(request);
    }
EDIT1:

如何获取回购的活动/状态

/**
 * Gets the activity information for a repo. If there is a failure during verification/finish -- this will provide what it was.
 * @throws IOException
 */
private static
String activityForRepo(final String authInfo, final String repo) throws IOException {

    RequestBuilder builder = new RequestBuilder("GET");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/repository/" + repo + "/activity")
                             .addHeader("Content-Type", "application/json")
                             .addHeader("Authorization", "Basic " + authInfo)

                             .build();

    return sendHttpRequest(request);
}

你可以绝对地对任何事情都使用curl。我个人使用的是HttpClient(v1.8.16)

无论出于何种原因,Sonatype都让我们很难弄清楚正确的URL、头和有效负载应该是什么;我不得不嗅着车流猜测。。。那里有一些几乎没有用处的博客/文档,但是它要么与oss.sonatype.org无关,要么是基于XML的(我发现它甚至不起作用)。IMHO,他们的垃圾文档,希望未来的搜索者能找到有用的答案

我不认为您可以在不生成另一个构建的情况下从一个快照转到另一个发布,但是如果您创建另一个构建并直接部署到staging repo,并从staging->RELEASE升级,这将实现我认为您想要的

如果您发布到Nexus而不是oss.sonatype.org,只需将其替换为正确的主机即可

您感兴趣的URL
”https://oss.sonatype.org/service/local/staging/profiles/“+profile+”/finish“

其中,
profile
是您上传初始POM/Jar时的sonatype/nexus profileID(例如,
4364f3bbaf163

下面是我为实现这一点而编写的(CC0许可)代码。上传初始POM/Jar时,
repo
(例如
comdorkbox-1003
)也会从响应中解析出来

结束回购:

/**
 * Closes the repo and (the server) will verify everything is correct.
 * @throws IOException
 */
private static
String closeRepo(final String authInfo, final String profile, final String repo, final String nameAndVersion) throws IOException {

    String repoInfo = "{'data':{'stagedRepositoryId':'" + repo + "','description':'Closing " + nameAndVersion + "'}}";
    RequestBuilder builder = new RequestBuilder("POST");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/profiles/" + profile + "/finish")
                             .addHeader("Content-Type", "application/json")
                             .addHeader("Authorization", "Basic " + authInfo)

                             .setBody(repoInfo.getBytes(OS.UTF_8))

                             .build();

    return sendHttpRequest(request);
}
促进回购:

/**
 * Promotes (ie: release) the repo. Make sure to drop when done
 * @throws IOException
 */
private static
String promoteRepo(final String authInfo, final String profile, final String repo, final String nameAndVersion) throws IOException {

    String repoInfo = "{'data':{'stagedRepositoryId':'" + repo + "','description':'Promoting " + nameAndVersion + "'}}";
    RequestBuilder builder = new RequestBuilder("POST");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/profiles/" + profile + "/promote")
                     .addHeader("Content-Type", "application/json")
                     .addHeader("Authorization", "Basic " + authInfo)

                     .setBody(repoInfo.getBytes(OS.UTF_8))

                     .build();
    return sendHttpRequest(request);
}
放弃回购:

/**
 * Drops the repo
 * @throws IOException
 */
private static
String dropRepo(final String authInfo, final String profile, final String repo, final String nameAndVersion) throws IOException {

    String repoInfo = "{'data':{'stagedRepositoryId':'" + repo + "','description':'Dropping " + nameAndVersion + "'}}";
    RequestBuilder builder = new RequestBuilder("POST");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/profiles/" + profile + "/drop")
                     .addHeader("Content-Type", "application/json")
                     .addHeader("Authorization", "Basic " + authInfo)

                     .setBody(repoInfo.getBytes(OS.UTF_8))

                     .build();

    return sendHttpRequest(request);
}
删除签名垃圾:

/**
 * Deletes the extra .asc.md5 and .asc.sh1 'turds' that show-up when you upload the signature file. And yes, 'turds' is from sonatype
 * themselves. See: https://issues.sonatype.org/browse/NEXUS-4906
 * @throws IOException
 */
private static
void deleteSignatureTurds(final String authInfo, final String repo, final String groupId_asPath, final String name,
                          final String version, final File signatureFile)
                throws IOException {

    String delURL = "https://oss.sonatype.org/service/local/repositories/" + repo + "/content/" +
                    groupId_asPath + "/" + name + "/" + version + "/" + signatureFile.getName();

    RequestBuilder builder;
    Request request;

    builder = new RequestBuilder("DELETE");
    request = builder.setUrl(delURL + ".sha1")
                     .addHeader("Authorization", "Basic " + authInfo)
                     .build();
    sendHttpRequest(request);

    builder = new RequestBuilder("DELETE");
    request = builder.setUrl(delURL + ".md5")
                     .addHeader("Authorization", "Basic " + authInfo)
                     .build();
    sendHttpRequest(request);
}
文件上载:

    public
    String upload(final File file, final String extension, String classification) throws IOException {

        final RequestBuilder builder = new RequestBuilder("POST");
        final RequestBuilder requestBuilder = builder.setUrl(uploadURL);
        requestBuilder.addHeader("Authorization", "Basic " + authInfo)

                      .addBodyPart(new StringPart("r", repo))
                      .addBodyPart(new StringPart("g", groupId))
                      .addBodyPart(new StringPart("a", name))
                      .addBodyPart(new StringPart("v", version))
                      .addBodyPart(new StringPart("p", "jar"))
                      .addBodyPart(new StringPart("e", extension))
                      .addBodyPart(new StringPart("desc", description));


        if (classification != null) {
            requestBuilder.addBodyPart(new StringPart("c", classification));
        }

        requestBuilder.addBodyPart(new FilePart("file", file));
        final Request request = requestBuilder.build();

        return sendHttpRequest(request);
    }
EDIT1:

如何获取回购的活动/状态

/**
 * Gets the activity information for a repo. If there is a failure during verification/finish -- this will provide what it was.
 * @throws IOException
 */
private static
String activityForRepo(final String authInfo, final String repo) throws IOException {

    RequestBuilder builder = new RequestBuilder("GET");
    Request request = builder.setUrl("https://oss.sonatype.org/service/local/staging/repository/" + repo + "/activity")
                             .addHeader("Content-Type", "application/json")
                             .addHeader("Authorization", "Basic " + authInfo)

                             .build();

    return sendHttpRequest(request);
}

谢谢分享,谢谢分享。