mirror of
https://github.com/espressif/esp-idf.git
synced 2025-10-05 12:51:31 +00:00
100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
# SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
"""This file is used for generating the child pipeline for build jobs."""
|
|
|
|
import argparse
|
|
import os
|
|
import typing as t
|
|
|
|
import __init__ # noqa: F401 # inject the system path
|
|
import yaml
|
|
from idf_build_apps.manifest import FolderRule
|
|
from idf_build_apps.utils import semicolon_separated_str_to_list
|
|
from idf_ci.idf_gitlab import build_child_pipeline
|
|
from idf_ci_utils import IDF_PATH
|
|
|
|
BUILD_CHILD_PIPELINE_FILEPATH = os.path.join(IDF_PATH, 'build_child_pipeline.yml')
|
|
TEST_PATHS = ['examples', os.path.join('tools', 'test_apps'), 'components']
|
|
|
|
|
|
def _separate_str_to_list(s: str) -> t.List[str]:
|
|
"""
|
|
Gitlab env file will escape the doublequotes in the env file, so we need to remove them
|
|
|
|
For example,
|
|
|
|
in pipeline.env file we have
|
|
|
|
MR_MODIFIED_COMPONENTS="app1;app2"
|
|
MR_MODIFIED_FILES="main/app1.c;main/app2.c"
|
|
|
|
gitlab will load the doublequotes as well, so we need to remove the doublequotes
|
|
"""
|
|
return semicolon_separated_str_to_list(s.strip('"')) # type: ignore
|
|
|
|
|
|
def main(arguments: argparse.Namespace) -> None:
|
|
# load from default build test rules config file
|
|
extra_default_build_targets: t.List[str] = []
|
|
if arguments.default_build_test_rules:
|
|
with open(arguments.default_build_test_rules) as fr:
|
|
configs = yaml.safe_load(fr)
|
|
|
|
if configs:
|
|
extra_default_build_targets = configs.get('extra_default_build_targets') or []
|
|
|
|
if extra_default_build_targets:
|
|
FolderRule.DEFAULT_BUILD_TARGETS.extend(extra_default_build_targets)
|
|
|
|
build_child_pipeline(
|
|
paths=args.paths,
|
|
modified_files=args.modified_files,
|
|
compare_manifest_sha_filepath=args.compare_manifest_sha_filepath,
|
|
yaml_output=args.yaml_output,
|
|
)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(
|
|
description='Generate build child pipeline',
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
)
|
|
parser.add_argument(
|
|
'-o',
|
|
'--yaml-output',
|
|
default=BUILD_CHILD_PIPELINE_FILEPATH,
|
|
help='Output YAML path',
|
|
)
|
|
# use relative path to avoid absolute path in pipeline
|
|
parser.add_argument(
|
|
'-p',
|
|
'--paths',
|
|
nargs='+',
|
|
default=TEST_PATHS,
|
|
help='Paths to the apps to build.',
|
|
)
|
|
parser.add_argument(
|
|
'--default-build-test-rules',
|
|
default=os.path.join(IDF_PATH, '.gitlab', 'ci', 'default-build-test-rules.yml'),
|
|
help='default build test rules config file',
|
|
)
|
|
parser.add_argument(
|
|
'--compare-manifest-sha-filepath',
|
|
default=os.path.join(IDF_PATH, '.manifest_sha'),
|
|
help='Path to the recorded manifest sha file generated by `idf-build-apps dump-manifest-sha`',
|
|
)
|
|
parser.add_argument(
|
|
'--modified-files',
|
|
type=_separate_str_to_list,
|
|
default=os.getenv('MR_MODIFIED_FILES'),
|
|
help='semicolon-separated string which specifies the modified files. '
|
|
'app with `depends_filepatterns` set in the corresponding manifest files would only be built '
|
|
'if any of the specified file pattern matches any of the specified modified files. '
|
|
'If set to "", the value would be considered as None. '
|
|
'If set to ";", the value would be considered as an empty list',
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
main(args)
|