You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用带通配符的curl命令向JFrog Artifactory部署工件

解决Jenkins流水线中用curl带通配符部署Artifactory工件的问题

首先,你遇到的错误核心原因是:curl本身不支持解析文件名通配符(*),通配符的扩展工作是由shell(比如bash)来完成的。你的原脚本要么是引号使用不当导致shell没扩展通配符,要么是直接让curl去处理带*的路径,自然会找不到文件。

下面给你几个可行的解决方案,按推荐程度排序:

方案1:用Shell扩展通配符(单文件场景)

如果你的构建只会生成一个匹配dan-*-SNAPSHOT.zip的文件,可以调整脚本让shell先解析通配符,再传给curl。同时建议增加文件存在性检查,避免无意义的报错:

stage('Deploy Artifacts to Artifactory') {
    withCredentials([usernameColonPassword(credentialsId: '<enter credentials ID>', variable: 'ARTIFACTORY_CREDS')]) {
        sh '''
            # 定义带通配符的文件路径
            FILE_PATH="${WORKSPACE}/soureCode/integration/dan-*-SNAPSHOT.zip"
            
            # 检查是否存在匹配的文件
            if [ -f "$FILE_PATH" ]; then
                echo "Found file: $FILE_PATH"
                # 执行curl上传,注意引号位置让shell已扩展的路径正确传递
                curl -k -u "${ARTIFACTORY_CREDS}" -T "$FILE_PATH" "https://<enter artifactory URL>/maven-prereleases-local/com/dan/"
            else
                echo "Error: No matching artifact found at $FILE_PATH"
                exit 1
            fi
        '''
    }
}

注意这里用单引号包裹整个sh脚本内容,避免Jenkins的变量和shell变量互相干扰;同时用[ -f "$FILE_PATH" ]检查文件,确保只有找到文件才执行上传。

方案2:批量处理多个匹配文件

如果你的构建可能生成多个符合通配符的zip文件,可以用find配合循环来逐个上传:

stage('Deploy Artifacts to Artifactory') {
    withCredentials([usernameColonPassword(credentialsId: '<enter credentials ID>', variable: 'ARTIFACTORY_CREDS')]) {
        sh '''
            # 遍历所有匹配的zip文件
            find "${WORKSPACE}/soureCode/integration" -name "dan-*-SNAPSHOT.zip" -type f | while read -r FILE; do
                echo "Deploying artifact: $FILE"
                curl -k -u "${ARTIFACTORY_CREDS}" -T "$FILE" "https://<enter artifactory URL>/maven-prereleases-local/com/dan/"
            done
        '''
    }
}

这个方法会自动找到所有符合条件的文件并逐一部署,适合多工件场景。

方案3:推荐使用JFrog CLI(更专业可靠)

其实Jenkins部署到Artifactory最推荐的方式是用JFrog CLI,它原生支持通配符,还能处理元数据、依赖管理、上传校验等功能,比curl更稳定易用:

stage('Deploy Artifacts to Artifactory') {
    withCredentials([usernamePassword(credentialsId: '<enter credentials ID>', usernameVariable: 'ARTIFACTORY_USER', passwordVariable: 'ARTIFACTORY_PASS')]) {
        sh '''
            # 配置JFrog CLI连接Artifactory(仅首次需要,可复用)
            jfrog rt config --url "https://<enter artifactory URL>" --user "${ARTIFACTORY_USER}" --password "${ARTIFACTORY_PASS}" --interactive=false
            
            # 用通配符批量上传工件,--insecure对应curl的-k参数
            jfrog rt u "${WORKSPACE}/soureCode/integration/dan-*-SNAPSHOT.zip" maven-prereleases-local/com/dan/ --insecure
        '''
    }
}

额外注意点

  • 原脚本里的soureCode应该是拼写错误,建议修正为sourceCode,避免路径找不到的问题
  • 原脚本的curl命令存在引号配对错误(双引号未正确闭合),这也是可能导致问题的原因之一,上面的方案已经修正了这个问题

内容的提问来源于stack exchange,提问作者itgeek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:16:04