Jenkins工作目录意外变更原因排查
问题分析与解决方案
问题1:Jenkins自动切换到@2工作目录
出现DBClusterMigration@2这类目录,是因为你在Pipeline中同时使用了agent any和嵌套的node("jenkins-prod")块,Jenkins会为node块单独分配备用工作空间,而非复用预期目录。
解决方法
方式1:直接指定agent节点,避免嵌套node块
pipeline { options { disableConcurrentBuilds() } agent { label "jenkins-prod" } // 直接绑定目标节点 environment { REGION = 'us-east-1' ENV = "${params.ENVIRONMENT}" JENKINS_NODE="jenkins-${ENV}" BUILDVERSION = sh(script: 'date +%Y%m%d%H%M', returnStdout: true).trim() } stages { stage('Creating and sharing snapshot from prod') { steps { dir("/home/centos/workspace/DBClusterMigration") { // 执行脚本逻辑 } } } } }
方式2:在node块中显式指定自定义工作空间
node("jenkins-prod") { customWorkspace "/home/centos/workspace/DBClusterMigration" dir("/home/centos/workspace/DBClusterMigration") { // 执行脚本逻辑 } }
问题2:RDS快照ID无效错误
从日志可见prod-${BUILDVERSION}未正确替换为prod-202310250709,直接丢失前缀,核心问题有两个:
environment块中变量定义错误,不应加def关键字,且shell命令的反引号会导致嵌套解析问题;- 单引号包裹的shell脚本无法引用Jenkins环境变量,变量替换会失效。
解决方法
修正环境变量定义与shell脚本的变量引用:
pipeline { options { disableConcurrentBuilds() } agent { label "jenkins-prod" } environment { REGION = 'us-east-1' ENV = "${params.ENVIRONMENT}" JENKINS_NODE="jenkins-${ENV}" // 移除def,直接通过sh步骤赋值,避免反引号嵌套问题 BUILDVERSION = sh(script: 'date +%Y%m%d%H%M', returnStdout: true).trim() } stages { stage('Creating and sharing snapshot from prod') { steps { dir("/home/centos/workspace/DBClusterMigration") { // 用双引号包裹脚本,让Jenkins先替换环境变量再执行shell sh """ aws rds create-db-cluster-snapshot --db-cluster-snapshot-identifier prod-${BUILDVERSION} --db-cluster-identifier prod --region ${REGION} aws rds copy-db-cluster-snapshot --source-db-cluster-snapshot-identifier prod-${BUILDVERSION} --target-db-cluster-snapshot-identifier reencrypted-prod-${BUILDVERSION} --kms-key-id b21e3752-3797-4604-9136-b0fc6d40cd3b --region ${REGION} aws rds modify-db-cluster-snapshot-attribute --db-cluster-snapshot-identifier reencrypted-prod-${BUILDVERSION} --attribute-name restore --values-to-add "782918959274" "953441081555" "451870394779" --region ${REGION} """ } } } } }
关键修正点
- 去掉
environment中BUILDVERSION的def关键字,Jenkins环境变量无需用def声明; - 移除shell命令里的反引号,直接执行
date +%Y%m%d%H%M,避免嵌套解析; - 将shell脚本的单引号改为双引号(三引号),确保Jenkins先替换变量再传递给shell执行。
内容的提问来源于stack exchange,提问作者Evgeniy Pozdnyakov
相关产品推荐
相关产品推荐

