- Jira Issue Creation Configuration
- Rule Configuration Value Definitions
- Configuring Use With Private GCS Bucket
Firewatch was designed to allow for users to define which Jira issues get created depending on which failures are found in an OpenShift CI failed run or reporting a success in a successful run. Using an easy-to-define JSON config, users can track issues in their OpenShift CI runs efficiently.
Example:
{
"failure_rules":
[
{"step": "exact-step-name", "failure_type": "pod_failure", "classification": "Infrastructure", "jira_project": "!default", "jira_component": ["some-component"], "jira_assignee": "[email protected]", "jira_security_level": "Restricted"},
{"step": "*partial-name*", "failure_type": "all", "classification": "Misc.", "jira_project": "OTHER", "jira_component": ["component-1", "component-2", "!default"], "jira_priority": "major", "group": {"name": "some-group", "priority": 1}},
{"step": "*ends-with-this", "failure_type": "test_failure", "classification": "Test failures", "jira_epic": "!default", "jira_additional_labels": ["test-label-1", "test-label-2", "!default"], "group": {"name": "some-group", "priority": 2}},
{"step": "*ignore*", "failure_type": "test_failure", "classification": "NONE", "jira_project": "NONE", "ignore": "true"},
{"step": "affects-version", "failure_type": "all", "classification": "Affects Version", "jira_project": "TEST", "jira_epic": "!default", "jira_affects_version": "4.14", "jira_assignee": "!default"}
],
#OPTIONAL
"success_rules":
[
{"jira_project": "PROJECT", "jira_epic": "PROJECT-123", "jira_component": ["some-component"], "jira_affects_version": "!default", "jira_assignee": "[email protected]", "jira_priority": "major", "jira_security_level": "Restricted", "jira_additional_labels": ["test-label-1", "test-label-2", "!default"]},
{"jira_project": "!default"},
]
}
The firewatch configuration can be saved to a file (can be stored wherever you want and named whatever you want, it must be JSON though) or defined in the FIREWATCH_CONFIG
variable. When using the report
command, if an argument for --firewatch-config-path
is not provided, the environment variable will be used.
NOTE: For more information how to use a configuration file as a "Base" config combining with additional rules set on top of it, please see the 'Using a base config file' section.
The firewatch configuration is a list of rules, each rule is defined using the following values:
Required Values:
Optional Values:
jira_epic
jira_component
jira_affects_version
jira_additional_labels
jira_assignee
jira_priority
jira_security_level
ignore
group
Required Values:
Optional Values:
jira_epic
jira_component
jira_affects_version
jira_additional_labels
jira_assignee
jira_priority
jira_security_level
The Jira project you'd like the issue to be filed under. This should just be a string value of the project key. You can either use the default project defined in the FIREWATCH_DEFAULT_JIRA_PROJECT
environment variable (either do not define jira_project
or define it as "!default"
) or you can define a project for each rule.
Example:
"jira_project": "LPTOCPCI"
"jira_project": "!default"
($FIREWATCH_DEFAULT_JIRA_PROJECT
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_PROJECT="LPTOCPCI"
The exact or partial name of a step in OpenShift CI. Using this value, we can usually determine what may have gone wrong during an OpenShift CI run.
For a step with more than one matching rules:
The rule with the exact same name (if exists) will be prioritized over a partial name (pattern).
Example:
Say you have multiple steps whose names start with infra-setup-
and you can confidently say that most of the time, if a run fails during one of these steps, it is probably an infrastructure setup issue. You can define a rule to always file a bug in a specific Jira project so the issue can be addressed. The value in this instance would be something like infra-setup-*
.
- Exact step name:
"step": "exact-step-name"
- Partial step name:
"step": "some-partial-step-*
: This would match multiple steps likesome-partial-step-1
andsome-partial-step-2
. The*
value will match any wildcard of any length."step": "some-step-?-single-char
: This would match multiple steps likesome-step-1-single-char
andsome-step-2-single-char
. The?
value will match any single character in the name.
Notes:
- The value of this key can be whatever you'd like and can use shell-style wildcards in the definition of this key:
*
– matches everything.?
– matches any single character.
The type of failure you'd like issues to be created for.
Options:
pod_failure
: A failure where the code being executed in the step (OpenShift CI pod) returns a non-zero exit code (when thepassed
value infinished.json
is set tofalse
)test_failure
: A failure where the code being executed in the step produces one or more JUnit files (must havejunit
in the filename) that is in the artifacts (copied into the$ARTIFACT_DIR
) for the step and any failure is found in the JUnit file(s).all
: Either apod_failure
or atest_failure
.
Example:
"failure_type": "pod_failure"
"failure_type": "test_failure"
"failure_type": "all"
Notes:
This value MUST be one of the options outlined above.
How you'd like to classify the issue in Jira. This is not a formal field in Jira, but will be included in the issue description. This is meant to act as a "best-guess" value for why the failure happened.
Example:
"classification": "Infrastructure - Cluster Provisioning"
Notes:
This can be any string value and does not affect the way issues are created apart from it being included in the description of the issue.
The epic you would like issues to be related to. This value should just be the ID of the epic you would like to use.
Example:
"jira_epic": "TEST-1234"
"jira_epic": "!default"
$FIREWATCH_DEFAULT_JIRA_EPIC
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_EPIC="TEST-1234"
Notes:
- Any epic you use must have the automation user being used in Jira set as a contributor to the epic/project.
- For OpenShift CI, the default user is currently
interop-test-jenkins interop-test-jenkins
.
- For OpenShift CI, the default user is currently
- The epic can be in a different project than the project defined in the
jira_project
config value.
The component/components you would like issues to be added to.
Examples:
"jira_component": ["component-1"]
"jira_component": ["component-1", "component-2"]
jira_component": ["component-1", "component-2", "!default"]
or"jira_component": ["!default"]
$FIREWATCH_DEFAULT_JIRA_COMPONENT
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_COMPONENT='["default-1", "default-2"]'
Notes:
- Please verify the component(s) you are planning on using exist in the project defined in the
jira_project
config value.
The version affected by this bug. This will result in the "Affects Version/s" field in Jira to be populated.
Example:
"jira_affects_version": "4.14"
"jira_affects_version": "!default"
$FIREWATCH_DEFAULT_JIRA_AFFECTS_VERSION
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_AFFECTS_VERSION="4.14"
Notes:
- The version must exist in the project defined in the
jira_project
config value.
A list of additional labels to add to a bug.
Example:
"jira_additional_labels": ["test-label-1"]
"jira_additional_labels": ["test-label-1", "test-label-2"]
"jira_additional_labels": ["test-label-1", "test-label-2", "!default"]
or"jira_additional_labels": ["!default"]
$FIREWATCH_DEFAULT_JIRA_ADDITIONAL_LABELS
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_ADDITIONAL_LABELS='["default-1", "default-2"]'
Notes:
- The Jira API will not allow these strings to have spaces in them.
The email address of the user you would like a bug assigned to if a bug is created.
Example:
"jira_assignee": "[email protected]"
"jira_assignee": "!default"
$FIREWATCH_DEFAULT_JIRA_ASSIGNEE
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_ASSIGNEE="[email protected]"
Notes:
- Must be the EMAIL ADDRESS of the user you would like to assign bugs to.
The priority desired for a bug created using this rule.
Example(s):
"jira_priority": "Blocker"
"jira_priority": "critical"
"jira_priority": "MAJOR"
"jira_priority": "Normal"
"jira_priority": "minor"
"jira_priority": "!default"
$FIREWATCH_DEFAULT_JIRA_PRIORITY
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_PRIORITY="Major"
Notes:
- This value must be set to one of the following, as they are the only available options in Red Hat's Jira instance (may be expanded):
Blocker
Critical
Major
Normal
Minor
- This value is not case-sensitive.
The security level desired for a bug created using this rule.
Example(s):
"jira_security_level": "Restricted"
"jira_security_level": "!default"
$FIREWATCH_DEFAULT_JIRA_SECURITY_LEVEL
environment variable must be defined.- Example:
export FIREWATCH_DEFAULT_JIRA_SECURITY_LEVEL="Restricted"
Notes:
- If you are using Red Hat's Jira server, the list of available security levels can be found here.
A value that be set to "true" or "false" and allows the user to define step
/failure_type
combinations that should be ignored when creating tickets.
Example:
"ignore": "true"
- Ignore the
step
/failure_type
combination when a failure is found that matches this rule.
- Ignore the
"ignore": "false"
- Do not ignore the
step
/failure_type
combination when a failure is found that matches this rule. - This is the default behavior of all rules. If set to
false
, it does not need to be defined.
- Do not ignore the
A dictionary object that is used to define the group of rules a specific rule belongs to and the priority of the rule within that group. This value is useful for when you have one or more steps that are dependent on other steps. If multiple steps are members of the same group, and they all fail because one of the steps failed, firewatch will look for the highest priority failure and only report on that failure.
The dictionary object should include a string value for "name"
and an integer value for "priority"
. For example: "group": {"name": "some-group-name", "priority": 1}
Example:
In this scenario, we have three steps: step-1
, step-2
, and step-3
. If step-1
fails, it will cause step-2
and step-3
to also fail and if step-2
fails step-3
will also fail.
Because these steps are all dependent on each other, it makes sense to group them together to avoid multiple Jira issues being created for the same failure.
[
{"step": "step-1", "failure_type": "all", "classification": "Misc.", "jira_project": "TEST", "group": {"name": "some-group", "priority": 1}},
{"step": "step-2", "failure_type": "all", "classification": "Misc.", "jira_project": "TEST", "group": {"name": "some-group", "priority": 2}},
{"step": "step-3", "failure_type": "all", "classification": "Misc.", "jira_project": "TEST", "group": {"name": "some-group", "priority": 3}}
]
Using the example configuration above:
- If
step-1
fails causingstep-2
andstep-3
to fail, only the rule forstep-1
will be reported because it has the highest priority. - If
step-2
fails causingstep-3
to fail, only the rule forstep-2
will be reported because it has the highest priority. - If
step-3
fails, only the rule forstep-3
will be reported.
For reoccurring steps and workflows in our project, we can initialize a source that holds a Firewatch base config, combined with user input.
The configuration file is considered as the basis of the configuration data,
and it will be overridden and extended by the additional set of rules that will be applied by the FIREWATCH_CONFIG
environment variable.
By setting the env var, the user may override the base config with:
- Replacing steps with general patterns with specific step names and vice versa.
- Updating existing rules with new logic.
Examples:
- A project consistently uses a rule with
"ignore": "True"
, and mentions it in the base config file- A specific scenario might need to set the
"ignore"
withFalse
- In this case, we will mention this specific step in the
FIREWATCH_CONFIG
variable, and override the original rule
- A specific scenario might need to set the
- The base file configures a rule for the step
exact-step-name
- A specific scenario requires to apply this rule on a set of similar steps
- In this case, we will extend it and use
*-step-*
to override the step name by a pattern
Firewatch allows for the use of a private GCS bucket if needed. In order to use this, you will need to receive service account credentials from an administator of the GCS bucket. The credentials should be in JSON format. Example:
{
"type": "service_account",
"project_id": "some-project",
"private_key_id": "0000000000000000000000000",
"private_key": "<PRIVATE KEY>",
"client_email": "[email protected]",
"client_id": "12345678",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "<Cert URL>",
"universe_domain": "googleapis.com"
}
You will need to provide the name of the bucket and the path to the service account credentials in the CLI. Exmaple: firewatch report --gcs-bucket "my-bucket-name" --gcs-creds-file ./some/creds/file.json