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

AKS

JFrog Artifactory: 5.8.4 专业版。

JFrog CLI: 1.12.1

我正在使用JFrog CLI 的官方文档在 Artifactory 存储库中可用的工件上设置一些属性。

  • 注意:我现在不想使用Artifactory AQL并尝试使用jfrogcli使其工作

我成功配置了 CLI 客户端(~/.jfrog/jfrog-cli.conf成功创建了使用用户名/密码和 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 中)和各自的属性及其值中成功应用。

AKS

所以,这实际上证明了这一点(cli 中的错误部分jfrog)。重新添加第一个属性,即添加丢失的第一个属性两次,它适用于所有属性(包括第一个),同时提供要添加的属性。

现在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}"

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

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

将 JFROG 与 SSH 密钥(为了更好的身份验证)一起使用的示例在命令行中不需要用户名/密码或服务器 ID(需要 ~/.jfrog/jfrog.conf 文件):

只需创建您的 SSH 发布/私有密钥。为用户添加 pub 密钥(在 Artifactory 范围/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如上所示使用的 cli--props="....."将不起作用。

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

注意:用于打开{}使用的 json 文件(语法)在使用时jfrog(使用 --spec file.json)和使用curl时不同-T file.json

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

创建一个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 没有免费提供给您的属性,例如“名称”、“仓库”)必须在 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 中定义并屏蔽密码变量并调用您的脚本)。不过,我更愿意使用安全的方式使用(SSH url)jfrog --props="..."进行简单搜索或--spec jsonfile(用于更复杂的搜索或jfrogCLI 支持的其他操作)。--ssh-key-path=/your/home/.ssh/your_private_key_id_rsa--url=$JFROG_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 文件具有jfrogcli 的--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
      }
    ]
}

注意:请参阅相关帖子Chef Berks 安装 (Berkshelf) 超时联系 Artifactory 存储库(法拉第超时/演员崩溃)如果您使用Chefberks install(用于查找和锁定食谱版本以实现稳定的重复部署,使用berks apply(锁定版本的食谱)和使用knife create <Chef-Env> -c ...for创建 Chef 环境/文件)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章