JFrog CLI 无法在 JFrog 工件工厂中为第一个属性名称设置项目的属性,也无法使用 SSH 键示例进行多属性搜索



JFrog Artifactory:5.8.4 专业。

JFrog CLI:1.12.1

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

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

我成功配置了 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)、目标文件(位于存储库/路径/文件中)及其值的相应属性中成功应用。

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

现在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="..."不会为您提供所有结果,因为它只会选择最后一个值并覆盖该给定属性的所有其他先前值)。

另外,使用jfrogcli --server-id="..."如果使用 SSH 密钥,则可以以更安全的方式使用 --url="Artifactory URL"(如上所列)。

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

只需创建您的 SSH 公共/私钥。为用户添加 pub 密钥(在 Artifactory 宽/存储库宽设置中运行命令),然后将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一起使用。

注意:当您使用jfrog(使用 --spec file.json)和将curl-T file.json一起使用时,用于打开{}的 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 中定义并屏蔽密码变量并调用你的脚本)。尽管如此,我还是宁愿使用jfrog--props="..."进行简单的搜索或--spec jsonfile(用于更复杂的搜索或jfrogCLI 支持的其他操作)使用更安全--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 文件具有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
}
]
}

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

最新更新