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

Gitlab CI中Expect脚本循环签名RPM包报错求助

问题分析与解决建议

核心问题

你的Expect脚本和CI循环存在两处关键逻辑问题,导致签名成功但脚本报错:

  1. Expect脚本里的foreach循环完全多余,且exp_continue位置错误,会触发超时等待
  2. CI中用ls -l解析文件名的方式不可靠,还可能处理非RPM文件

修复后的Expect脚本

删掉冗余的循环和错误的exp_continue,直接处理单文件签名:

set password [lindex $argv 0]
set target_file [lindex $argv 1]

# 启动RPM签名命令
spawn rpm --define "_gpg_name <email@whatsoever.com>" --addsign $target_file
# 匹配密码输入提示
expect "Enter pass phrase:"
# 发送密码
send -- "$password\r"
# 等待命令执行结束
expect eof

优化后的CI循环

用通配符直接匹配RPM包,避免ls解析的潜在问题(比如文件名含空格),同时增加文件存在判断:

- |+
      for item in *.rpm
      do
        # 确保只处理实际存在的文件(避免无RPM包时循环报错)
        if [ -f "$item" ]; then
          # 去掉-d参数(调试用,正常运行不需要)
          expect ${CI_PROJECT_DIR}/sign.exp ${GPG_PASSWD} "$item"
        fi
      done

错误原因说明

  1. 原脚本里的foreach循环:你在CI中已经循环调用脚本处理单个文件,但脚本里又用glob *遍历,还立刻把files变量重新赋值为传入的参数,等于glob完全没用;而且exp_continue放在expect eof之后,会让Expect在命令结束后继续等待匹配,最终触发超时错误。
  2. 原CI的ls -l解析:这种方式在文件名含空格时会拆分错误,还会遍历目录下所有文件(包括非RPM),虽然签名成功,但脚本可能处理了不该处理的文件,导致额外报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:39:26