JFrog CLI 无法在 JFrog Artifactory 中为第一个 属性 名称和使用 SSH 密钥示例设置多个 属性 搜索的工件属性

JFrog CLI can't set properties on an artifact in JFrog Artifactory for the first property name and using SSH key examples for multi property search

JFrog Artifactory: 5.8.4 专业版。

JFrog CLI:1.12.1

我正在使用 the official documentation of JFrog CLI 为 Artifactory 存储库中可用的工件设置一些属性。

我成功配置了 CLI 客户端(文件 ~/.jfrog/jfrog-cli.conf 包含使用 username/password 和 API 密钥进行身份验证的条目已成功创建)。

为了设置工件的属性,我参考了以下示例:

jfrog rt sp "generic-local/*.zip" "a=1;b=2,3"

和运行以下命令(在自由式 Jenkins 作业中):

$ jfrog rt sp --server-id="artifactory-dev-instance" --url=${ARTIFACTORY_URL} ${REPO}/${FILE_PATH}/${FILE_NAME} -- props="release=${RELEASE};VERSION=${VERSION};PIPELINE_VERSION=${RELEASE}_${VERSION}_${BUILD_NUMBER};fileType=automated-file;PROJECT=${PROJECT}"

此命令成功退出且未出现错误,并应用了除第一个 属性 release=${RELEASE}.

以外具有预期值的所有属性

问题: 为什么 jfrog rt sp 没有在工件上应用 release 属性 而所有其他属性都已成功应用正确的值.

实际变量值并不重要,因为我可以看到其他属性在给定的 Artifactory 实例 (ARTIFACTORY_URL)、目标文件(位于 repo/path/file)和相应的属性及其值。

所以,这实际上证明了这一点(bug part in jfrog cli)。重新添加第一个 属性 即添加缺少的第一个 属性 两次,它适用于所有属性(包括第一个),同时提供要添加的属性。

现在 release 属性 也正在申请。

$ jfrog rt sp --server-id="artifactory-dev-instance" --url=${ARTIFACTORY_URL} ${REPO}/${FILE_PATH}/${FILE_NAME} -- props="release=${RELEASE};release=${RELEASE};VERSION=${VERSION};PIPELINE_VERSION=${RELEASE}_${VERSION}_${BUILD_NUMBER};fileType=automated-file;PROJECT=${PROJECT}"

$ jfrog rt sp --server-id="artifactory-dev-instance" --url=${ARTIFACTORY_URL} ${REPO}/${FILE_PATH}/${FILE_NAME} -- props="release=${RELEASE};VERSION=${VERSION};PIPELINE_VERSION=${RELEASE}_${VERSION}_${BUILD_NUMBER};fileType=automated-file;PROJECT=${PROJECT};release=${RELEASE}"

注意:在设置属性 jfrog rt sp 时,您可以使用 , 为同一个 属性 名称指定多个值,即 --props="prop1=value1;prop2=value22,prop2=value23;prop3=value3",但在 jfrog rt s 期间(搜索),您不能使用 ,(如果您完全使用 ,; 来匹配 属性 超过 1 个可能的值,jfrog rt s --prop="..."不会为您提供所有结果,因为它只会选择最后一个值并覆盖给定 属性).

的所有其他先前值

此外,使用 jfrog cli --server-id="..." 和 --url="Artifactory URL"(如上所列)可用于 更安全的方法 如果你使用 SSH 密钥。

使用 JFROG 和 SSH 密钥(为了更好的身份验证)的示例不需要 username/password 或命令行中的服务器 ID(需要 ~/.jfrog/jfrog.conf 文件):

只需创建您的 SSH pub/private 密钥。为用户添加公钥(运行在 Artifactory wide/repo 宽设置中执行命令),然后将 JFROG_URL 变量设置为:

JFROG_URL="ssh://artifactory-develop:1339"

然后简单地 运行:

用于设置工件的属性: jfrog rt sp --ssh-key-path=/home/${USER}/.ssh/id_rsa --url=${JFROG_URL} ...same command as above for sp command

或用于搜索

jfrog rt s --ssh-key-path=/home/${USER}/.ssh/id_rsa --url=${JFROG_URL} ...same command as above for s searching artifacts(请参阅其文档站点上的 JFROG cli 帮助)。

JFROG cli 不支持给定 属性 的 --props="...." 部分内的 'AND' 和 'OR' 即,如果你想搜索 属性 prop1 包含多个值,那么 jfrog 上面显示的使用 --props="....." 的 cli 将不起作用。

为此,您可以使用 JFrog 文件搜索模式并使用 --spec ~/somefile.json 选项或 curl 命令和 -T file.json.

注意:使用jfrog打开{}的json文件(语法)不同(使用 --spec file.json)以及当您将 curl-T file.json

一起使用时

让我们先看看如何使用curl命令。

创建一个 curl-aql.json 文件,其中包含以下内容(作为示例):

items.find( 
           { "repo": { "$eq" : "libs-snapshot-local" }}, 
           { "@yourCustomProperty1": { "$match" : "someValue1" }},
           { "@yourCustomProp2": { "$match" : "anotherValue2" }},
           { "@moreCustomProps3": { "$match" : "string_or_number_or_alnum" }},
           { "$or":[ { "@customPropertyWhichHasMultipleValues" : "PASS", "@customPropertyWhichHasMultipleValues" : "UNSTABLE" } ]}
          ).include("*", "@customProperty5iWantAQLToReturnToMeBack", "@yourCustomProperty1","@yourCustomXProp","@yourCustomYProp")

注意: 您创建的所有属性(即 Artifactory 不会像 'name'、'repo' 那样免费为您提供)必须以前缀AQL 中的 @ 字符,因为您会在字符 # 74 或 75.

处发现关于格式错误的奇怪错误信息

然后运行这个curl命令(用户id是:123456,密码在$p中):

curl -u123456:$p -H 'content-type: text/plain' -X POST http://artifactory-develop:8081/artifactory/api/search/aql -T ~/curl-aql.json

这不太安全但效果很好(如果您在 Jenkins 中定义并 MASK 密码变量并调用您的脚本)。不过,我宁愿使用 jfrog --props="..." 进行简单搜索或 --spec jsonfile (进行更复杂的搜索或 jfrog CLI 支持的其他操作)使用更安全的 --ssh-key-path=/your/home/.ssh/your_private_key_id_rsa 方式使用 --url=$JFROG_URL (SSH url).

jfrog 中,如果您想使用 Artifactory 的 AQL 功能,请尝试以下操作:

创建文件 jfrog-aql.json 包含:

{ 
    "files": [
    {
        "aql": 
        {
            "items.find":  
            {
                "repo": "libs-snapshot-local" , 
                "@yourCustomProperty1": { "$match" : "ABC1.22.33" },
                "@yourCustomProperty2": { "$match" : "Project1" },
                "name": { "$match" : "ArtifactX-*.json" },
                "@yourCustomProperty3": { "$match" : "2.*" },
                "@yourCustomProperty4": { "$match" : "some-manifest-file" }
            }
        },
        "sortBy" : ["created"],
        "sortOrder" : "desc",
        "limit" : 1
    }
    ]
}

注意: 这个 json 文件有 jfrog cli 的 --spec jsonfile 要求并且语法与我们在 json 文件(在 curl 运行 期间)。

现在您可以 运行 使用 jfrog 通过:

jfrog rt s --ssh-key-path=/home/${USER}/.ssh/id_rsa --url=${JFROG_URL} --spec ~/jfrog-aql.json

最终 找到了更好的 AQL,您可以在其中使用 $and$or 对单个 属性 (您可以通过调整它来添加更多)。请在此处查看 AQL 文件:

(注意:当值已知即硬编码时,使用 $qa 比使用 $match 更好,最好使用 simple form(请参阅下面如何使用 repo。当您的值中包含 * 时,使用或 $match 才有意义,请参阅如何使用 name 属性下面):

{ 
    "files": [
      {
        "aql": 
        {
            "items.find":  
            {
                "repo": "libs-snapshot-local" , 
                "@yourCustomProperty1": "ABC1.22.33",
                "@yourCustomProperty2": "Artifact1",
                "name": { "$match" : "ArtifactX-*.json" },
                "@yourCustomProperty3": { "$match" : "2.*" },
                "@yourCustomProperty4": "some-manifest-file",
                "$or": [
                    {
                       "@customProperty5": "Hard-Coded-Known-Value1",    
                       "@customProperty5": "Hard-Coded-Known-Value2"
                    }
                ]    
            }
        },
        "sortBy" : ["created"],
        "sortOrder" : "desc",
        "limit" : 1
      }
    ]
}

注意:如果您使用 Chefberks install,请参阅相关 post (用于查找和锁定说明书版本以实现稳定的重复部署,使用 berks apply(食谱的锁定版本)并使用 knife create <Chef-Env> -c ... 创建 Chef 环境/文件)。