policies
Define the policies section of lunar-config.yml — rules that Lunar evaluates against components to enforce standards and check health.
lunar-config.yml -> policiesType:
arrayForm:
policies: - <policy-object> - <policy-object> - ...
Policies are used to define the rules that Lunar uses to evaluate the health of components.
Example policies definition:
policies:
- uses: github://third-party/some-policy@v1
on: [my-domain]
enforcement: block-pr
- uses: ./security-scanning
on: [my-domain, another-domain]
runs_on: [default-branch]
enforcement: score
- name: Collect code coverage information
runPython: |
from lunar_policy import Check, Path
with Check("codecov-check", "Verify code coverage was collected") as check:
check.assert_true(Path(".codecov.was_run"), "Code coverage data should be collected")
on: [another-domain]
- name: Should have unit tests
mainPython: ./unit-tests.py
on: [another-domain]
enforcement: block-pr-and-releasePolicy
lunar-config.yml -> policies.<policy-index>Type:
objectForms:
Uses form:
Run form:
Main form:
Policies are used to define the rules that Lunar uses to evaluate the health of components. Policies are associated with domains and are automatically inherited by child domains.
name
lunar-config.yml -> policies.<policy-index>.nameType:
stringRequired for Run and Main policy forms, Optional for Uses policy form
The name field is used to specify the name of the policy. If a name is not provided in the case of a policy plugin, the name from the policy plugin is used. The name must be unique within the configuration.
uses
lunar-config.yml -> policies.<policy-index>.usesType
stringForms
GitHub form:
github://<owner>/<repo>@<version>GitLab form:
gitlab://<host>/<namespace>/<project>@<version>Local form:
./<path-to-policy>
Required in Uses policy form
The uses field is used to import an external (plugin) policy from a GitHub or GitLab repository, or from a local file. The GitLab form requires an explicit host, including for gitlab.com. The policy is then associated with a domain. Browse the 100+ available guardrails to find policies for your standards.
with
lunar-config.yml -> policies.<policy-index>.withType:
objectOptional
The with field specifies the inputs to pass to the policy plugin. The inputs are defined in the policy's configuration file. Input values are available to policy scripts via the variable_or_default function from the lunar_policy SDK.
Plugin authors can also reference inputs in their plugin YAML definitions using the ${{ inputs.NAME }} syntax. This allows plugins to expose configurable fields as explicit settings. See policy plugins for details.
include
lunar-config.yml -> policies.<policy-index>.includeType:
arrayOptional
The include field specifies which sub-policies to include from an imported policy plugin. When a policy is imported via uses, it may define (or import) multiple sub-policies. Use include to control which of those sub-policies are used.
If neither include nor exclude is specified, all sub-policies are included by default.
exclude
lunar-config.yml -> policies.<policy-index>.excludeType:
arrayOptional
The exclude field specifies which sub-policies to exclude from an imported policy plugin. Use exclude when you want to include most sub-policies but skip a few specific ones.
If neither include nor exclude is specified, all sub-policies are included by default.
For example, if a policy called security includes sub-policies named vulnerability-scan, license-check, and dependency-audit:
description
lunar-config.yml -> policies.<policy-index>.descriptionType:
stringOptional
The description field is used to specify a description of the policy. If a description is not provided in the case of a policy plugin, the description from the policy plugin is used.
run<language>
lunar-config.yml -> policies.<policy-index>.run<language>Type:
stringRequired in Run policy form
Defines the command to execute when the policy is invoked. Only Python is supported. So runPython is the only valid field.
Running Python supports installing dependencies.
runPython
lunar-config.yml -> policies.<policy-index>.runPythonType:
string
The runPython field specifies the python policy script to run. Running Python supports installing dependencies.
main<language>
lunar-config.yml -> policies.<policy-index>.main<language>Type:
stringRequired in Main policy form
Defines the main file path used to execute when the policy is invoked. Only Python is supported. So mainPython is the only valid field.
The file path is relative to the directory of the configuration file that declares it.
Running Python supports installing dependencies.
mainPython
lunar-config.yml -> policies.<policy-index>.mainPythonType:
string
The mainPython field specifies the path to the python main file to run. Running Python supports installing dependencies.
on
lunar-config.yml -> policies.<policy-index>.onType:
arrayRequired
The on field specifies the tags that the policy should be associated with. The policy will apply when the component has one or more of the specified tags.
For detailed documentation on tag matching syntax, including domain/component targeting, expressions, and cross-references to other collectors or policies, see Tag Matching with on.
runs_on
lunar-config.yml -> policies.<policy-index>.runs_onType:
arrayDefault:
[prs, default-branch]
Specifies the contexts in which the policy should run. The available values are:
prs- the policy will run on pull requestsdefault-branch- the policy will run on the default branch
By default, policies run in both contexts. To restrict a policy to only run on pull requests, use runs_on: [prs]. To restrict a policy to only run on the default branch, use runs_on: [default-branch].
enforcement
lunar-config.yml -> policies.<policy-index>.enforcementType:
string. One ofdraft,score,report-pr,block-pr,block-release,block-pr-and-releaseOptional - defaults to
report-pr
The enforcement field specifies the enforcement level of the policy. It determines how the policy affects the component.
The following enforcement levels are supported:
draft- the policy is still under development and does not affect the score, and is not enforced or shown to application teamsscore- the checks under this policy contribute to the score of the component and are not reported in PRs. They still run on pull requests, subject toruns_on, with their results visible on the pull request's dashboard — which makesscorethe level to trial a guardrail at, including one that only does anything in a PR, before application teams see itreport-pr- the checks under this policy report the results in PRs, but do not block themblock-pr- the checks under this policy block PRs from being mergedblock-release- the checks under this policy block releases, but not PRs. This level may be useful for checks that don't necessarily run in PRs due to performance reasons, but are nevertheless important to gate the release process.block-pr-and-release- the checks under this policy block both PRs and releases
initiative
lunar-config.yml -> policies.<policy-index>.initiativeType:
stringOptional - defaults to
default
The initiative field specifies the initiative that the policy belongs to. Initiatives are used to group related policies together for easier management and reporting. If not specified, the policy will be associated with the built-in "default" initiative.
For information on how to configure initiatives, see initiatives.
meta
lunar-config.yml -> policies.<policy-index>.metaType:
objectofstringtostringOptional
The meta field attaches your own key/value annotations to a policy. Lunar stores them and exposes them through the SQL API so you can select checks by an identifier of your own, such as the control a policy enforces in your compliance framework:
Keys and values are free-form; Lunar does not validate them against a schema. Two things to know before you pick a naming convention:
metais never shown to a human. It does not appear in pull request comments or in the dashboards. To put a control ID in front of a developer, render it withfailureText.metaapplies to every sub-policy in the entry it is written on. A plugin bundles many sub-policies, andinclude/excludeselect which ones run — but they all share the entry'smeta. To map sub-policies to different values, import the plugin once per sub-policy, as the example above does withinclude: [aws-ebs-volume-encryption].
meta is not a replacement for initiatives. An initiative groups policies for reporting and can cover many controls; meta is a flat tagging dimension that sits alongside it.
failureText
lunar-config.yml -> policies.<policy-index>.failureTextType:
string, a Go text/templateOptional - defaults to the built-in list of failing assertion messages
The failureText field replaces what a failing check writes into the pull request comment, so you can wrap a plugin's wording in your own prose and links without forking the policy:
The comment then reads:
The template renders as Markdown, so links, emphasis, and lists all work. Three namespaces are available:
{{ .check.failure }}
Every failing assertion as one bullet list, the same block Lunar writes by default. Position it as a unit.
{{ range .check.failure_msgs }}{{ .message }}{{ end }}
The failing assertions one at a time, for full control of the layout. Ordered as the policy asserted them
{{ .check.name }}
The check's name, qualified by its policy
{{ .meta.<key> }}
A value from the policy's meta
{{ .policy.name }}, {{ .policy.description }}
The policy's own name and description
Two details worth knowing when you write one:
Hyphenated
metakeys needindex. Go reads the hyphen in{{ .meta.enforce-control }}as subtraction, so a key likeenforce-controlhas to be written{{ index .meta "enforce-control" }}. Underscored keys avoid it. Hyphens are fine on the SQL side either way.A broken template falls back to the default. An unknown key renders as empty text, and a template that fails to parse leaves the built-in assertion list in place. A typo costs you your wording, never the reason the check failed.
Like meta, failureText applies to every sub-policy in the entry it is written on.
image
lunar-config.yml -> policies.<policy-index>.imageType:
stringOptional
The image field specifies the Docker image to use when running the policy. When set, the policy runs inside a container instead of natively on the host.
Use the special value native to explicitly run the policy without a container, even when a default image has been configured.
Example:
For more information about default images and container execution, see Images.
Last updated
