1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package org
import future.keywords
import data.circleci.config
policy_name["project_lock"]
target_node_image = "cimg/node:19.7.0"
# enables the rule only for the setup workflow
enable_hard["check_project_config"] { input.setup == true }
check_project_config[reason] {
# check the case where version is not in the input
not input.version
reason := "version must be defined"
} {
# check that version is number
not is_number(input.version)
reason := "version must be a number"
} {
# check that version is at least 2.1
not input.version >= 2.1
reason := sprintf("version must be at least 2.1 but got %q", [input.version])
}{
# check that setup is true
not input.setup
reason := "setup must be true"
} {
# check that only circleci orbs are used
some orb, _ in config.orbs
not startswith(orb, "circleci/")
reason := sprintf("%q is not an approved orb", [orb])
} {
# Check that cimg/node image is used
object.get(input, ["jobs", "setup", "docker", 0, "image"], "") != "cimg/node:19.7.0"
reason := sprintf("job %q must use image %q", ["setup", target_node_image])
} {
# Check that small resource class is used
resource_class := object.get(input, ["jobs", "setup", "resource_class"], "")
resource_class != "small"
reason := sprintf("job %q must use resource_class %q but got %q", ["setup", "small", resource_class])
} {
# Check that the setup job contains only the expected steps
steps := object.get(input, ["jobs", "setup", "steps"], [])
expected_steps := [
"checkout",
{"node/install-packages": {"app-dir": ".circleci/generated"}},
{"run": "node .circleci/generated/generated.index.js"},
{"continuation/continue": {"configuration_path": "basic_workflow.yml"}},
]
steps != expected_steps
reason := sprintf("setup steps must be %v", [expected_steps])
} {
# Check that the workflow only contains expected jobs
workflow := object.get(input, ["workflows"], "")
expected_workflow := {"setup-workflow": {"jobs": ["setup"]}}
workflow != expected_workflow
reason := sprintf("workflow must be %q but got %q", [expected_workflow, workflow])
}
|