如何使用 cURL 命令从 Jenkins 构建中获取和存储不断变化的版本号?

How can I get and store a changing version number from a Jenkins build using a cURL command?

我正在尝试提取具有最新版本号的文件的名称,以便我可以使用 bash 将其移动到另一个目录。我有一个名为 "deb-files" 的目录,我想将下载的 .deb 文件移动到该目录中。这是我正在寻找的基本版本:

if [ "$REPOSITORY_NAME" = "repository" ];
    then : curl https://example.com/$REPOSITORY_NAME*.deb

    mv $REPOSITORY_NAME*.deb ./deb-files/;

$REPOSITORY_NAME 由用户输入填充。请假设他们输入 "repository"。请注意,文件名与存储库名称相同。我以为在扩展名前面放一个星号意味着 "latest version",但每次我 运行 它时,我都会在代码的 mv 部分收到一个错误,说它找不到文件 - "No such file or directory".有任何想法吗?我试过转义星号并引用变量名。运气不好。

以防万一,我正在尝试访问由 Jenkins 中的构建创建的工件。

curl 和 Jenkins 服务器都不理解 shell 通配符“*”。您必须找到要下载的工件的确切名称。

一种方法是修改 Jenkins 作业以创建(并存档为工件)符号 link 到具有固定名称的工件(pkg1_latest.deb).

另一种方法是使用 Jenkins REST API 来获取有关最新版本的信息,但通常情况下,您需要解析一些 JSON.

curl http://jenkins:8080/job/JOB_NAME/lastSuccessfulBuild/api/json?tree=artifacts[*]

生成如下内容:

{
  "artifacts" : [
    {
      "displayPath" : "platformA/pkg1_VERSION.deb",
      "fileName" : "pkg1_VERSION.deb",
      "relativePath" : "build/platformA/pkg1_VERSION.deb"
    },
    {
      "displayPath" : "platformB/pkg1_VERSION.deb",
      "fileName" : "pkg1_VERSION.deb",
      "relativePath" : "build/platformB/pkg1_VERSION.deb"
    },
    ...
  ]
}

然后解析输出以找到合适的相对路径。使用相对路径,你可以检索神器:

curl http://jenkins:8080/job/JOB_NAME/lastSuccessfulBuild/artifact/$relpath

更新: 另一种解决方案是下载包含 所有 工件的 zip 存档,然后提取您感兴趣的工件。

curl "http://jenkins:8080/job/JOB_NAME/lastSuccessfulBuild/artifact/*zip*/archive.zip
unzip archive.zip "$REPOSITORY_PATH*.deb"

URL 中的特殊 *zip* 告诉 Jenkins 创建所有内容的 zip 存档。