Jenkins流水线部署时shell/deploy.sh文件不存在的解决方法
问题分析
你的问题核心是Jenkins默认工作区被后续拉取的目标项目代码覆盖:流水线的SCM先拉取了包含shell脚本的脚本仓库,但Clone Code阶段拉取目标项目时,会将工作区替换为目标项目的内容,导致原脚本仓库中的shell/deploy.sh丢失。
解决办法
1. 用stash暂存脚本文件
在拉取目标项目前,先暂存脚本仓库里需要的文件,Deploy阶段再恢复:
pipeline { agent any stages { stage('暂存部署脚本') { steps { // 根据实际子目录选择maven或node下的脚本 stash name: 'deploy-scripts', includes: 'maven/shell/deploy.sh' } } stage('拉取目标项目代码') { steps { git url: '目标项目仓库地址', branch: 'main' } } stage('部署') { steps { unstash 'deploy-scripts' // 此时脚本已恢复到当前工作区,可正常调用 sh 'scp maven/shell/deploy.sh 目标服务器用户@服务器地址:/部署路径/' } } } }
2. 指定子目录拉取目标项目
拉取目标项目时自定义目录,避免覆盖脚本仓库的内容:
pipeline { agent any stages { stage('拉取目标项目代码') { steps { // 将目标项目拉到target-project子目录,不影响原脚本仓库文件 git url: '目标项目仓库地址', branch: 'main', destination: 'target-project' } } stage('部署') { steps { // 原脚本仓库的deploy.sh仍在初始路径下 sh 'scp maven/shell/deploy.sh 目标服务器用户@服务器地址:/部署路径/' } } } }
3. 单独拉取脚本文件(轻量方案)
如果仅需要deploy.sh,可在Deploy阶段直接从脚本仓库拉取单个文件:
pipeline { agent any stages { stage('拉取目标项目代码') { steps { git url: '目标项目仓库地址', branch: 'main' } } stage('部署') { steps { // 稀疏克隆脚本仓库,仅拉取需要的文件 sh 'git clone --depth 1 --sparse 脚本仓库地址 temp-scripts' sh 'cd temp-scripts && git sparse-checkout set maven/shell/deploy.sh' sh 'cp temp-scripts/maven/shell/deploy.sh .' // 上传文件 sh 'scp deploy.sh 目标服务器用户@服务器地址:/部署路径/' // 清理临时文件 sh 'rm -rf temp-scripts' } } } }
内容的提问来源于stack exchange,提问作者user27389714
相关产品推荐
相关产品推荐

