Skip to content

Commit 37adb9d

Browse files
committed
ci: run OPA check on version matrix
Signed-off-by: Nikita Pivkin <nikita.pivkin@smartforce.io>
1 parent b884131 commit 37adb9d

File tree

4 files changed

+71
-12
lines changed

4 files changed

+71
-12
lines changed

.github/workflows/test-rego.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,7 @@ jobs:
4949
5050
- name: Test Rego checks
5151
run: make test-rego
52+
53+
- name: Run OPA Check
54+
run: make check-rego-matrix
55+
shell: bash

Makefile

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1+
SHELL := /bin/bash
2+
13
OUTDATED_API_DATA_URL=https://raw.githubusercontent.com/aquasecurity/trivy-db-data/refs/heads/main/k8s/api/k8s-outdated-api.json
24
OUTDATED_API_CHECK=checks/kubernetes/workloads/outdated_api.rego
35
BUNDLE_FILE=bundle.tar.gz
46
REGISTRY_PORT=5111
57

6-
SED ?= sed
8+
TRIVY_VERSIONS := latest v0.67.0 v0.63.0
9+
10+
SCHEMAS := cloud.json dockerfile.json kubernetes.json
11+
SCHEMAS_BASE := pkg/iac/rego/schemas
712

13+
SED ?= sed
814
ifeq ($(shell uname), Darwin)
915
SED = gsed
1016
endif
@@ -19,11 +25,24 @@ test-integration:
1925

2026
.PHONY: download-schemas
2127
download-schemas:
22-
@schemas_path=schemas ; \
23-
base_url=https://raw.githubusercontent.com/aquasecurity/trivy/main/pkg/iac/rego/schemas ; \
24-
mkdir -p $$schemas_path ; \
25-
for file in cloud.json dockerfile.json kubernetes.json ; do \
26-
wget -q -O $$schemas_path/$$file $$base_url/$$file ; \
28+
@for version in $(TRIVY_VERSIONS); do \
29+
schemas_path="schemas/$$version"; \
30+
if [ "$$version" = "latest" ]; then \
31+
base_url="https://raw.githubusercontent.com/aquasecurity/trivy/main/$(SCHEMAS_BASE)"; \
32+
else \
33+
if [ -d "$$schemas_path" ]; then \
34+
echo "Skipping $$version, schemas already exist"; \
35+
continue; \
36+
fi; \
37+
base_url="https://raw.githubusercontent.com/aquasecurity/trivy/refs/tags/$$version/$(SCHEMAS_BASE)"; \
38+
fi; \
39+
echo "Downloading schemas for $$version..."; \
40+
mkdir -p $$schemas_path; \
41+
for file in $(SCHEMAS); do \
42+
url="$$base_url/$$file"; \
43+
echo " - $$file"; \
44+
wget -q -O $$schemas_path/$$file $$url || { echo "Failed to download $$url"; exit 1; }; \
45+
done; \
2746
done
2847

2948
.PHONY: rego
@@ -39,7 +58,45 @@ test-rego:
3958

4059
.PHONY: check-rego
4160
check-rego: download-schemas
42-
@go run ./cmd/opa check lib checks --v0-v1 --strict -s schemas
61+
@go run ./cmd/opa check lib checks --v0-v1 --strict -s schemas/latest
62+
63+
.PHONY: check-rego-matrix
64+
check-rego-matrix: download-schemas build-opa
65+
@for version in $(TRIVY_VERSIONS); do \
66+
echo "Running OPA check for $$version..."; \
67+
errors=$$(./opa check lib checks --strict -s schemas/$$version -f json --max-errors -1 2>&1 | jq -c '.errors[]?'); \
68+
if [ -z "$$errors" ]; then \
69+
echo "No errors for $$version"; \
70+
continue; \
71+
fi; \
72+
errs=""; \
73+
while read -r err; do \
74+
msg=$$(echo $$err | jq -r '.message'); \
75+
file=$$(echo $$err | jq -r '.location.file'); \
76+
if echo "$$msg" | grep -q '^undefined ref'; then \
77+
min_version=$$(./opa parse "$$file" -f json --json-include -comments,-locations \
78+
| jq -r '.annotations[0]?.custom.minimum_trivy_version'); \
79+
if [ "$$min_version" != "null" ]; then \
80+
ver=$${version#v};\
81+
cmp=$$(printf "%s\n%s\n" "$$ver" "$$min_version" | sort -V | head -n1); \
82+
if [ "$$cmp" = "$$ver" ] && [ "$$ver" != "$$min_version" ]; then \
83+
echo "Skipping undefined ref in $$file: matrix version $$ver < minimum required $$min_version"; \
84+
continue; \
85+
fi; \
86+
fi; \
87+
fi; \
88+
row=$$(echo $$err | jq -r '.location.row'); \
89+
code=$$(echo $$err | jq -r '.code'); \
90+
errs="$$errs$$file:$$row: $$code: $$msg\n"; \
91+
done <<< "$$errors"; \
92+
if [ -n "$$errs" ]; then \
93+
echo "Found remaining errors for $$version:"; \
94+
echo "$$errs"; \
95+
exit 1; \
96+
else \
97+
echo "No relevant errors for $$version"; \
98+
fi; \
99+
done
43100

44101
.PHONY: lint-rego
45102
lint-rego: check-rego

cmd/opa/main.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"fmt"
54
"os"
65

76
"github.com/open-policy-agent/opa/cmd"
@@ -14,7 +13,6 @@ func main() {
1413
rego.RegisterBuiltins()
1514
// runs: opa test lib/ checks/
1615
if err := cmd.RootCommand.Execute(); err != nil {
17-
fmt.Println(err)
1816
os.Exit(1)
1917
}
2018
}

test/test_input_schema_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ func loadSchemas(t *testing.T) map[string]*gojsonschema.Schema {
123123
t.Helper()
124124

125125
return map[string]*gojsonschema.Schema{
126-
"cloud": loadSchema(t, "../schemas/cloud.json", enforceNoAdditionalProperties),
127-
"kubernetes": loadSchema(t, "../schemas/kubernetes.json"),
128-
"dockerfile": loadSchema(t, "../schemas/dockerfile.json"),
126+
"cloud": loadSchema(t, "../schemas/latest/cloud.json", enforceNoAdditionalProperties),
127+
"kubernetes": loadSchema(t, "../schemas/latest/kubernetes.json"),
128+
"dockerfile": loadSchema(t, "../schemas/latest/dockerfile.json"),
129129
}
130130
}
131131

0 commit comments

Comments
 (0)