如何使用Jenkins pipeline脚本将GitHub提交的文件下载至工作区
问题原因
你遇到的failed writing body (0 != 1364)错误由以下3个问题共同导致:
-o参数后直接传入了$WORKSPACE,Jenkins工作区是目录,curl无法将返回内容直接写入目录,需要指定完整的文件名路径- 你使用的是GitHub的
blob预览页面地址,返回的是HTML网页内容,不是原始的test.csv文件内容 - 请求头
-H github-ssh-key的写法不符合curl的GitHub认证规则,私有仓库会直接返回404/403响应,写入自然失败
正确实现方案
方案1:公开仓库(无需认证)
直接将链接替换为GitHub raw原始文件地址,同时指定完整的输出文件名即可:
stage('Download github file ') { steps{ script{ sh''' # 把链接中的blob替换为raw即可获取原始文件地址,-o参数指定完整的文件保存路径 curl -o $WORKSPACE/test.csv -L 'https://github.com/<你的用户名>/<你的仓库名>/raw/1.2.0/test.csv' ''' } } }
方案2:私有仓库(需认证,推荐使用个人访问令牌PAT)
首先在GitHub后台生成具备仓库读取权限的PAT,将PAT存储到Jenkins凭据中,假设你保存的凭据ID为github_pat,写法如下:
stage('Download github file ') { steps{ withCredentials([string(credentialsId: 'github_pat', variable: 'GITHUB_PAT')]) { script{ sh''' curl -H "Authorization: token ${GITHUB_PAT}" -o $WORKSPACE/test.csv -L 'https://github.com/<你的用户名>/<你的仓库名>/raw/1.2.0/test.csv' ''' } } } }
可选稳定方案(适合多文件下载场景)
如果需要下载多个文件或者整仓库内容,直接用Jenkins内置的git步骤更稳定,无需处理curl的各类参数问题:
stage('Checkout github repo') { steps{ // 配置好GitHub SSH凭据后直接拉取对应分支代码,执行完成后仓库所有文件都已存放在$WORKSPACE下 git branch: '1.2.0', url: 'git@github.com:<你的用户名>/<你的仓库名>.git' } }
内容的提问来源于stack exchange,提问作者reachit
相关产品推荐
相关产品推荐

