in detection_rules/devtools.py [0:0]
def build_release(ctx: click.Context, config_file, update_version_lock: bool, generate_navigator: bool,
generate_docs: str, update_message: str, release=None, verbose=True):
"""Assemble all the rules into Kibana-ready release files."""
if RULES_CONFIG.bypass_version_lock:
click.echo('WARNING: You cannot run this command when the versioning strategy is configured to bypass the '
'version lock. Set `bypass_version_lock` to `False` in the rules config to use the version lock.')
ctx.exit()
config = load_dump(config_file)['package']
err_msg = f'No `registry_data` in package config. Please see the {get_etc_path("package.yaml")} file for an' \
f' example on how to supply this field in {PACKAGE_FILE}.'
assert 'registry_data' in config, err_msg
registry_data = config['registry_data']
if generate_navigator:
config['generate_navigator'] = True
if release is not None:
config['release'] = release
if verbose:
click.echo(f'[+] Building package {config.get("name")}')
package = Package.from_config(config=config, verbose=verbose)
if update_version_lock:
loaded_version_lock.manage_versions(package.rules, save_changes=True, verbose=verbose)
package.save(verbose=verbose)
previous_pkg_version = find_latest_integration_version("security_detection_engine", "ga",
registry_data['conditions']['kibana.version'].strip("^"))
sde = SecurityDetectionEngine()
historical_rules = sde.load_integration_assets(previous_pkg_version)
current_pkg_version = Version.parse(registry_data['version'])
# pre-release versions are not included in the version comparison
# Version 8.17.0-beta.1 is considered lower than 8.17.0
current_pkg_version_no_prerelease = Version(major=current_pkg_version.major,
minor=current_pkg_version.minor, patch=current_pkg_version.patch)
hist_versions_num = (
MAX_HISTORICAL_VERSIONS_FOR_DIFF
if current_pkg_version_no_prerelease >= MIN_DIFF_FEATURE_VERSION
else MAX_HISTORICAL_VERSIONS_PRE_DIFF
)
click.echo(
'[+] Limit historical rule versions in the release package for '
f'version {current_pkg_version_no_prerelease}: {hist_versions_num} versions')
limited_historical_rules = sde.keep_latest_versions(historical_rules, num_versions=hist_versions_num)
package.add_historical_rules(limited_historical_rules, registry_data['version'])
click.echo(f'[+] Adding historical rules from {previous_pkg_version} package')
# NOTE: stopgap solution until security doc migration
if generate_docs:
click.echo(f'[+] Generating security docs for {registry_data["version"]} package')
docs = IntegrationSecurityDocsMDX(registry_data['version'], Path(f'releases/{config["name"]}-docs'),
True, limited_historical_rules, package, note=update_message)
docs.generate()
if verbose:
package.get_package_hash(verbose=verbose)
click.echo(f'- {len(package.rules)} rules included')
return package