OPA是否支持单独检查规则?GitLab CI/CD集成OPA规则配置问询
OPA集成GitLab CI/CD实现独立规则评估与失败退出
不需要将所有规则合并为单一父规则,通过OPA CLI的两种方式即可实现你的需求:输出每条规则的true/false结果,同时在存在失败规则时返回非零退出码。
方法一:扩展Rego规则收集状态并统一校验
在你的rules.rego中添加两个辅助规则:一个用于收集所有规则的结果,另一个用于判断是否全部通过:
package play.terraform passing_rule{ 1 = 1 } failing_rule{ 1 = 0 } # 收集所有规则的执行结果 rule_results := { "passing_rule": passing_rule, "failing_rule": failing_rule, } # 校验所有规则是否都为true all_passed { all r in rule_results { r == true } }
执行以下命令:
opa eval 'data.play.terraform.rule_results; data.play.terraform.all_passed' --data rules.rego --fail
- 输出会包含每条规则的
true/false状态,以及all_passed的整体结果; - 当存在
false/undefined的规则时,all_passed会求值为false,触发--fail选项让OPA返回非零退出码,符合GitLab CI的失败判定逻辑。
方法二:使用OPA Test命令验证规则
创建测试文件rules_test.rego,为每个规则编写预期为true的测试用例:
package play.terraform test_passing_rule { passing_rule } test_failing_rule { failing_rule }
执行测试命令:
opa test rules.rego rules_test.rego --format=json
- 命令会输出每个测试用例的通过/失败状态;
- 只要有一个测试失败(对应原规则为
false/undefined),OPA就会返回非零退出码; --format=json参数可让输出结构化,方便GitLab CI后续处理。
原命令无效的原因
你之前执行的opa eval 'data.play.terraform' --data rules.rego --fail,查询的是整个包的对象。由于包中存在passing_rule: true,整个表达式的求值结果是一个非空对象,并非false或undefined,因此--fail选项不会触发,OPA返回退出码0。
内容的提问来源于stack exchange,提问作者kini_dot
相关产品推荐
相关产品推荐

