JFrog Artifactory: 5.8.4 专业版。
JFrog CLI: 1.12.1
我正在使用JFrog CLI 的官方文档在 Artifactory 存储库中可用的工件上设置一些属性。
Artifactory AQL
并尝试使用jfrog
cli使其工作。我成功配置了 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 中)和各自的属性及其值中成功应用。
所以,这实际上证明了这一点(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
(用于更复杂的搜索或jfrog
CLI 支持的其他操作)。--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 文件具有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
}
]
}
注意:请参阅相关帖子Chef Berks 安装 (Berkshelf) 超时联系 Artifactory 存储库(法拉第超时/演员崩溃)如果您使用Chef
和berks install
(用于查找和锁定食谱版本以实现稳定的重复部署,使用berks apply
(锁定版本的食谱)和使用knife create <Chef-Env> -c ...
for创建 Chef 环境/文件)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句