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

Groovy脚本中保存AWS实例IP到变量导致构建失败

解决Jenkins Groovy脚本获取AWS实例公网IP的exit code 1问题

首先,咱们先明确两个核心问题导致了你遇到的报错:

  1. readFile的路径上下文问题:你在agent节点生成了ipv4.txt,但readFile可能因为没有指定完整工作空间路径,或者步骤不小心跑到Jenkins master上执行,导致找不到文件;
  2. curl命令的隐性非0退出码:虽然你能看到IP输出,但某些环境下curl可能返回非0退出码(比如隐藏的警告输出),触发Jenkins的失败判定。

下面是几个经过验证的可行解决方案:

方案1:直接用sh returnStdout捕获输出(推荐)

这种方式最简洁,还能避免文件读写的路径问题,修改后的代码如下:

node('你的AWS节点标签') {
    String ip = sh(
        returnStdout: true,
        label: '获取实例公网IP',
        script: 'curl -s --connect-timeout 3 --max-time 5 http://169.254.169.254/latest/meta-data/public-ipv4 || echo ""'
    ).trim()

    // 手动验证IP是否有效,避免空值
    if (ip.isEmpty()) {
        error("无法从实例元数据获取公网IP")
    }

    println("实例公网IP:${ip}")
}

为什么这么改?

  • 加上--connect-timeout和--max-time防止命令因为网络问题挂起;
  • 末尾的|| echo ""确保即使curl意外失败,也返回空字符串而非非0退出码,让我们可以手动处理错误;
  • trim()去除输出中多余的换行和空格,保证IP格式干净。

方案2:正确使用文件读写(确保在agent上下文内)

如果你偏好文件读写的方式,一定要显式指定agent的工作空间路径,避免歧义:

node('你的AWS节点标签') {
    sh(
        label: '将公网IP写入文件',
        script: 'wget -qO "${WORKSPACE}/ipv4.txt" http://169.254.169.254/latest/meta-data/public-ipv4'
    )

    // 用WORKSPACE环境变量指定agent工作空间的绝对路径
    String ip = readFile("${WORKSPACE}/ipv4.txt").trim()
    println("实例公网IP:${ip}")
}

关键注意点

  • WORKSPACE是Jenkins内置的环境变量,指向当前agent的工作空间绝对路径;
  • 确保readFile和前面的sh步骤都在同一个node块内,不要切换到master节点执行。

方案3:用AWS CLI获取(适合有IAM角色的实例)

如果你的AWS实例关联了IAM角色,并且agent节点安装了AWS CLI,可以用更稳定的方式获取IP:

node('你的AWS节点标签') {
    String ip = sh(
        returnStdout: true,
        label: '通过AWS CLI获取公网IP',
        script: 'aws ec2 describe-instances --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --query "Reservations[0].Instances[0].PublicIpAddress" --output text'
    ).trim()

    println("实例公网IP:${ip}")
}

优势

这种方式不依赖元数据的HTTP访问,直接调用AWS API,可靠性更高,适合复杂的环境。

额外排查建议

  • 手动在agent节点执行curl http://169.254.169.254/latest/meta-data/public-ipv4,然后用echo $?查看退出码,确认是否为0;
  • 检查agent节点的工作空间权限,确保Jenkins agent用户有读写权限;
  • 如果是Docker类型的agent,要确认Docker网络配置允许访问169.254.169.254这个元数据地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:51:14