GitHub Actions中字符串比较异常:值相同却判定不相等
GitHub Actions中字符串比较失效的解决办法
问题根源
你遇到的问题本质是环境变量中包含隐藏的空白字符(比如换行符、末尾空格)。虽然echo输出时看起来两个版本完全一致,但变量实际存储的内容带有这些不可见字符,导致字符串比较结果不相等,触发失败逻辑。
排查与解决步骤
1. 确认变量的真实内容
在Versions步骤中添加printf命令,输出变量的原始内容(包含不可见字符的转义形式),验证是否存在隐藏字符:
- name: Versions run: | echo build version=$build_version echo branch version=$branch_version # 输出原始内容(显示转义字符) printf "build_version: %q\n" "$build_version" printf "branch_version: %q\n" "$branch_version"
如果输出里看到\n或者额外的空格,就说明确实有隐藏字符。
2. 修正版本提取命令,清除隐藏字符
分支版本提取优化
原命令可能残留换行,添加tr -d '\n'清除换行:
- name: Get Version of Release Branch run: echo "branch_version=$(echo $branch_name | sed 's/release\///g' | tr -d '\n')" >> $GITHUB_ENV
项目版本提取优化
原sed命令处理不够精准,改用grep正则匹配更可靠地提取csproj中的PackageVersion,同时清除换行:
- name: Get Version of Project run: echo "build_version=$(grep -oP '(?<=<PackageVersion>).*(?=</PackageVersion>)' notification-abstractions.csproj | tr -d '\n')" >> $GITHUB_ENV
这个命令精准匹配<PackageVersion>标签中间的内容,避免引入多余字符。
3. 使用正确的条件表达式
GitHub Actions的if表达式中,直接使用环境变量比较即可,正确写法如下:
- name: Fail PR if versions not matching if: ${{ env.branch_version != env.build_version }} run: exit 1
注意不要嵌套${{}}(比如你最初写的'${{ env.branch_version }}'是错误的,会把变量名而非值作为字符串),也不需要用shell的括号语法。
修正后的完整脚本示例
- name: Get Version of Release Branch run: echo "branch_version=$(echo $branch_name | sed 's/release\///g' | tr -d '\n')" >> $GITHUB_ENV - name: Get Version of Project run: echo "build_version=$(grep -oP '(?<=<PackageVersion>).*(?=</PackageVersion>)' notification-abstractions.csproj | tr -d '\n')" >> $GITHUB_ENV - name: Versions run: | echo build version=$build_version echo branch version=$branch_version printf "build_version raw: %q\n" "$build_version" printf "branch_version raw: %q\n" "$branch_version" - name: Fail PR if versions not matching if: ${{ env.branch_version != env.build_version }} run: exit 1
内容的提问来源于stack exchange,提问作者Çağrı BIYIK
相关产品推荐
相关产品推荐

