Gitlab CI中Expect脚本循环签名RPM包报错求助
问题分析与解决建议
核心问题
你的Expect脚本和CI循环存在两处关键逻辑问题,导致签名成功但脚本报错:
- Expect脚本里的
foreach循环完全多余,且exp_continue位置错误,会触发超时等待 - 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
错误原因说明
- 原脚本里的
foreach循环:你在CI中已经循环调用脚本处理单个文件,但脚本里又用glob *遍历,还立刻把files变量重新赋值为传入的参数,等于glob完全没用;而且exp_continue放在expect eof之后,会让Expect在命令结束后继续等待匹配,最终触发超时错误。 - 原CI的
ls -l解析:这种方式在文件名含空格时会拆分错误,还会遍历目录下所有文件(包括非RPM),虽然签名成功,但脚本可能处理了不该处理的文件,导致额外报错。
内容的提问来源于stack exchange,提问作者user19698007
相关产品推荐
相关产品推荐

