GitLab CI Bash脚本逻辑优化求助:避免双条件同时触发
解决GitLab CI脚本中双条件同时触发的问题
你的问题出在使用了两个独立的if判断——当match_A和match_B同时为真时,两段代码会依次执行。要实现互斥的触发逻辑,你需要用if-elif-else的分支结构,根据实际需求选择以下两种方案:
方案1:仅单个job匹配时执行对应重试(双匹配时不执行)
这个方案适用于你只想在只有其中一个job存在时才触发重试的场景:
keyWord_A="jobA" keyword_B="jobB" # 调用GitLab API获取当前流水线的任务列表 job_list=$(curl --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs") # 用jq检查是否匹配到目标job,返回0表示匹配成功,1表示未匹配 match_A=$(echo "$job_list" | jq -e '.[] | select(.name == "'"$keyWord_A"'")' > /dev/null; echo $?) match_B=$(echo "$job_list" | jq -e '.[] | select(.name == "'"$keyword_B"'")' > /dev/null; echo $?) if [[ $match_A -eq 0 && $match_B -ne 0 ]]; then # 仅找到jobA时,执行重试jobB的逻辑 echo "仅检测到jobA,开始重试jobB" # 在这里添加你的重试jobB代码(比如调用GitLab API触发重试) elif [[ $match_B -eq 0 && $match_A -ne 0 ]]; then # 仅找到jobB时,执行重试jobA的逻辑 echo "仅检测到jobB,开始重试jobA" # 在这里添加你的重试jobA代码 else # 两个job都存在或都不存在时的处理逻辑(可根据需要修改) echo "同时检测到jobA和jobB,或都未检测到,不执行重试操作" fi
方案2:双匹配时优先执行某一段逻辑
如果你希望在两个job都存在时,优先执行其中一段代码(比如优先处理jobA的重试逻辑),可以调整分支顺序:
keyWord_A="jobA" keyword_B="jobB" # 同样先获取任务列表并检查匹配状态 job_list=$(curl --header "PRIVATE-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/jobs") match_A=$(echo "$job_list" | jq -e '.[] | select(.name == "'"$keyWord_A"'")' > /dev/null; echo $?) match_B=$(echo "$job_list" | jq -e '.[] | select(.name == "'"$keyword_B"'")' > /dev/null; echo $?) if [[ $match_A -eq 0 ]]; then # 只要检测到jobA就执行重试jobB的逻辑(不管jobB是否存在) echo "检测到jobA,执行重试jobB操作" # 重试jobB的代码 elif [[ $match_B -eq 0 ]]; then # 只有当jobA不存在,且检测到jobB时,才执行重试jobA的逻辑 echo "检测到jobB,执行重试jobA操作" # 重试jobA的代码 fi
重要细节说明
jq -e参数:让jq在没有匹配结果时返回非零退出码,这样我们可以通过$?直接获取匹配状态,比字符串对比更可靠。- GitLab内置变量:
CI_JOB_TOKEN、CI_API_V4_URL等都是GitLab CI自动提供的内置变量,无需额外配置。 - 条件判断:用
-eq(等于)、-ne(不等于)来比较数字状态,避免字符串匹配可能带来的误差。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

