GitLab CI中使用Curl上传文件至JFrog Artifactory报错求助
JFrog Artifactory文件上传400错误排查与解决
问题场景
尝试将文件上传至JFrog Artifactory时遭遇400错误,具体操作及报错如下:
初始报错命令
执行GitLab CI命令时返回400错误:
++ curl -sSf -H 'X-JFrog-Art-Api: <API_KEY>' -X PUT -T dist/myfile.egg 'https://artifactory.mycompany.com/artifactory/dev/apps/myapp/myfile.egg;released=true;build.number=0.1' curl: (22) The requested URL returned error: 400 ERROR: Job failed: exit status 1
成功但不符合需求的命令
修改命令后可执行,但无法创建目标文件夹并将文件放入其中:
++ curl -sSf -H 'X-JFrog-Art-Api: <API_KEY>' -X PUT -T dist/myfile.egg 'https://artifactory.mycompany.com/artifactory/dev/apps/myapp;released=true;build.number=0.1'
额外尝试的报错
去掉元数据直接上传时,返回明确错误提示:
curl -H 'X-JFrog-Art-Api: <API_KEY>' -XPUT 'https://artifactory.mycompany.com/artifactory/dev/apps/myapp/myfile.egg' -T dist/myfile.egg % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 120 0 120 0 0 882 0 --:--:-- --:--:-- --:--:-- 882 { "errors" : [ { "status" : 400, "message" : "Parent apps/myapp must be a folder" } ] }Job succeeded
原因定位
从报错信息Parent apps/myapp must be a folder可明确:目标路径中的apps/myapp不存在,且Artifactory默认不会自动创建多级父文件夹,导致上传失败。第二个命令之所以成功,是因为它将myapp当作文件名而非文件夹,直接把文件传到了dev/apps/myapp路径,不符合预期的文件夹层级要求。
解决方法
方法1:先创建父文件夹
上传文件前,先通过PUT请求创建apps/myapp文件夹(URL末尾必须加斜杠/,否则会被识别为文件):
curl -H 'X-JFrog-Art-Api: <API_KEY>' -X PUT 'https://artifactory.mycompany.com/artifactory/dev/apps/myapp/'
文件夹创建成功后,再执行最初的带元数据上传命令即可:
curl -sSf -H 'X-JFrog-Art-Api: <API_KEY>' -X PUT -T dist/myfile.egg 'https://artifactory.mycompany.com/artifactory/dev/apps/myapp/myfile.egg;released=true;build.number=0.1'
方法2:使用JFrog CLI(推荐)
如果频繁进行此类操作,建议用JFrog CLI,它会自动处理文件夹创建逻辑,命令更简洁:
jf rt upload dist/myfile.egg dev/apps/myapp/myfile.egg --props "released=true;build.number=0.1" --url https://artifactory.mycompany.com/artifactory --api-key <API_KEY>
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

