CI Config File

This page is a reference for available keys and their defaults. For step-by-step usage and examples, see idf-ci Configuration. To generate a starter file, run idf-ci init.

Default Settings

component_mapping_regexes = [
    "/components/(.+)/",
    "/common_components/(.+)/",
]

component_ignored_file_extensions = [
    ".md",
    ".rst",
    ".yaml",
    ".yml",
    ".py",
]

built_app_list_filepatterns = [
    "app_info_*.txt",   # collect_app_info_filename
]

Configuration Options

The following sections describe all configuration options in the CI config file.

pydantic settings idf_ci.settings.CiSettings

Show JSON schema
{
   "title": "CiSettings",
   "type": "object",
   "properties": {
      "component_mapping_regexes": {
         "default": [
            "/components/(.+?)/",
            "/common_components/(.+?)/"
         ],
         "description": "List of regex patterns to extract component names from file paths.",
         "items": {
            "type": "string"
         },
         "title": "Component Mapping Regexes",
         "type": "array"
      },
      "extend_component_mapping_regexes": {
         "default": [],
         "description": "Additional component mapping regex patterns to extend the default list.",
         "items": {
            "type": "string"
         },
         "title": "Extend Component Mapping Regexes",
         "type": "array"
      },
      "component_mapping_exclude_regexes": {
         "default": [
            "/test_apps/"
         ],
         "description": "List of regex patterns to exclude certain paths from component mapping.",
         "items": {
            "type": "string"
         },
         "title": "Component Mapping Exclude Regexes",
         "type": "array"
      },
      "component_ignored_file_extensions": {
         "default": [
            ".md",
            ".rst",
            ".yaml",
            ".yml",
            ".py"
         ],
         "description": "File extensions to ignore when mapping files to components.",
         "items": {
            "type": "string"
         },
         "title": "Component Ignored File Extensions",
         "type": "array"
      },
      "extend_component_ignored_file_extensions": {
         "default": [],
         "description": "Additional file extensions to ignore.",
         "items": {
            "type": "string"
         },
         "title": "Extend Component Ignored File Extensions",
         "type": "array"
      },
      "built_app_list_filepatterns": {
         "default": [
            "app_info_*.txt"
         ],
         "description": "Glob patterns for files containing built app information.",
         "items": {
            "type": "string"
         },
         "title": "Built App List Filepatterns",
         "type": "array"
      },
      "collected_test_related_apps_filepath": {
         "default": "test_related_apps.txt",
         "description": "Path to file containing test-related apps.",
         "title": "Collected Test Related Apps Filepath",
         "type": "string"
      },
      "collected_non_test_related_apps_filepath": {
         "default": "non_test_related_apps.txt",
         "description": "Path to file containing non-test-related apps.",
         "title": "Collected Non Test Related Apps Filepath",
         "type": "string"
      },
      "preserve_test_related_apps": {
         "default": true,
         "description": "Whether to preserve test-related apps.",
         "title": "Preserve Test Related Apps",
         "type": "boolean"
      },
      "preserve_non_test_related_apps": {
         "default": true,
         "description": "Whether to preserve non-test-related apps.",
         "title": "Preserve Non Test Related Apps",
         "type": "boolean"
      },
      "extra_default_build_targets": {
         "default": [],
         "description": "Additional build targets to include by default.",
         "items": {
            "type": "string"
         },
         "title": "Extra Default Build Targets",
         "type": "array"
      },
      "exclude_dirs": {
         "default": [],
         "description": "Directories to ignore when searching for apps.",
         "items": {
            "type": "string"
         },
         "title": "Exclude Dirs",
         "type": "array"
      },
      "ci_detection_envs": {
         "default": [
            "CI",
            "GITHUB_ACTIONS",
            "CIRCLECI",
            "TRAVIS",
            "JENKINS_URL",
            "DRONE",
            "APPVEYOR",
            "BITBUCKET_COMMIT",
            "SEMAPHORE",
            "TEAMCITY_VERSION"
         ],
         "description": "Environment variables used to detect if running in CI.",
         "items": {
            "type": "string"
         },
         "title": "Ci Detection Envs",
         "type": "array"
      },
      "local_runtime_envs": {
         "additionalProperties": true,
         "default": {},
         "description": "Environment variables to set in local development.",
         "title": "Local Runtime Envs",
         "type": "object"
      },
      "ci_runtime_envs": {
         "additionalProperties": true,
         "default": {},
         "description": "Environment variables to set in CI environment.",
         "title": "Ci Runtime Envs",
         "type": "object"
      },
      "gitlab": {
         "$ref": "#/$defs/GitlabSettings",
         "default": {
            "project": "espressif/esp-idf",
            "known_failure_cases_bucket_name": "ignore-test-result-files",
            "artifacts": {
               "native": {
                  "build_job_filepatterns": [
                     "**/build*/bootloader/*.map",
                     "**/build*/bootloader/*.elf",
                     "**/build*/*.map",
                     "**/build*/*.elf",
                     "**/build*/bootloader/*.bin",
                     "**/build*/*.bin",
                     "**/build*/partition_table/*.bin",
                     "**/build*/flasher_args.json",
                     "**/build*/flash_project_args",
                     "**/build*/config/sdkconfig.json",
                     "**/build*/sdkconfig",
                     "**/build*/project_description.json",
                     "**/build*/build.log",
                     "app_info_*.txt",
                     "build_summary_*.xml"
                  ],
                  "enable": true,
                  "test_job_filepatterns": [
                     "pytest-embedded/",
                     "XUNIT_RESULT*.xml"
                  ]
               },
               "s3": {
                  "configs": {
                     "debug": {
                        "base_dir_pattern": "**/build*/",
                        "bucket": "idf-artifacts",
                        "file_patterns": [
                           "bootloader/*.map",
                           "bootloader/*.elf",
                           "*.map",
                           "*.elf",
                           "build.log"
                        ],
                        "if_clause": null,
                        "is_public": false,
                        "zip_first": true
                     },
                     "flash": {
                        "base_dir_pattern": "**/build*/",
                        "bucket": "idf-artifacts",
                        "file_patterns": [
                           "bootloader/*.bin",
                           "*.bin",
                           "partition_table/*.bin",
                           "flasher_args.json",
                           "flash_project_args",
                           "config/sdkconfig.json",
                           "sdkconfig",
                           "project_description.json"
                        ],
                        "if_clause": null,
                        "is_public": false,
                        "zip_first": true
                     }
                  },
                  "enable": false
               }
            },
            "build_pipeline": {
               "job_image": "espressif/idf:latest",
               "job_stage": "build",
               "job_tags": [
                  "build"
               ],
               "job_template_jinja": "{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.build_pipeline.job_stage }}\"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: \"{{ settings.gitlab.build_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}",
               "job_template_name": ".default_build_settings",
               "jobs_jinja": "{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: \"1\"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: \"1\"\n\n{% endif %}",
               "parent_pipeline_job_suffix": "",
               "pre_yaml_jinja": "",
               "presigned_json_job_name": "generate_presigned_json",
               "runs_per_job": 60,
               "workflow_name": "Build Child Pipeline",
               "yaml_filename": "build_child_pipeline.yml",
               "yaml_jinja": "{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.build_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n  needs:\n    - \"build_test_related_apps\"\n  artifacts:\n    paths:\n      - \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n  script:\n    - idf-ci\n      --config 'gitlab.test_pipeline.job_image=\"{{ settings.gitlab.test_pipeline.job_image }}\"'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: \".post\"\n  needs:\n    - \"generate_test_child_pipeline\"\n  variables:\n    PARENT_PIPELINE_ID: \"$CI_PIPELINE_ID\"\n  trigger:\n    include:\n      - artifact: \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n        job: \"generate_test_child_pipeline\"\n    strategy: \"depend\"\n{%- endif %}"
            },
            "test_pipeline": {
               "job_image": "python:3-slim",
               "job_stage": "test",
               "job_tags": [],
               "job_template_jinja": "{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.test_pipeline.job_stage }}\"\n  image: \"{{ settings.gitlab.test_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  variables:\n    PYTEST_EXTRA_FLAGS: \"\"\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"build_test_related_apps\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml \"XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml\"\n      ${PYTEST_EXTRA_FLAGS}",
               "job_template_name": ".default_test_settings",
               "jobs_jinja": "{% for job in jobs %}\n{{ job['name'] }}:\n  extends:\n    - \"{{ settings.gitlab.test_pipeline.job_template_name }}\"\n    {%- for extra_extend in job.get('extra_extends', []) %}\n    - \"{{ extra_extend }}\"\n    {%- endfor %}\n  tags: {{ job['tags'] }}\n{%- if job['parallel_count'] > 1 %}\n  parallel: {{ job['parallel_count'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job['nodes'] }}\n{% endfor %}",
               "parent_pipeline_job_suffix": "",
               "pre_yaml_jinja": "",
               "presigned_json_job_name": "generate_presigned_json",
               "runs_per_job": 30,
               "workflow_name": "Test Child Pipeline",
               "yaml_filename": "test_child_pipeline.yml",
               "yaml_jinja": "{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.test_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}"
            }
         },
         "description": "GitLab-specific settings."
      }
   },
   "$defs": {
      "ArtifactSettings": {
         "properties": {
            "s3": {
               "$ref": "#/$defs/ArtifactSettingsS3",
               "default": {
                  "enable": false,
                  "configs": {
                     "debug": {
                        "base_dir_pattern": "**/build*/",
                        "bucket": "idf-artifacts",
                        "file_patterns": [
                           "bootloader/*.map",
                           "bootloader/*.elf",
                           "*.map",
                           "*.elf",
                           "build.log"
                        ],
                        "if_clause": null,
                        "is_public": false,
                        "zip_first": true
                     },
                     "flash": {
                        "base_dir_pattern": "**/build*/",
                        "bucket": "idf-artifacts",
                        "file_patterns": [
                           "bootloader/*.bin",
                           "*.bin",
                           "partition_table/*.bin",
                           "flasher_args.json",
                           "flash_project_args",
                           "config/sdkconfig.json",
                           "sdkconfig",
                           "project_description.json"
                        ],
                        "if_clause": null,
                        "is_public": false,
                        "zip_first": true
                     }
                  }
               }
            },
            "native": {
               "$ref": "#/$defs/ArtifactSettingsNative",
               "default": {
                  "enable": true,
                  "build_job_filepatterns": [
                     "**/build*/bootloader/*.map",
                     "**/build*/bootloader/*.elf",
                     "**/build*/*.map",
                     "**/build*/*.elf",
                     "**/build*/bootloader/*.bin",
                     "**/build*/*.bin",
                     "**/build*/partition_table/*.bin",
                     "**/build*/flasher_args.json",
                     "**/build*/flash_project_args",
                     "**/build*/config/sdkconfig.json",
                     "**/build*/sdkconfig",
                     "**/build*/project_description.json",
                     "**/build*/build.log",
                     "app_info_*.txt",
                     "build_summary_*.xml"
                  ],
                  "test_job_filepatterns": [
                     "pytest-embedded/",
                     "XUNIT_RESULT*.xml"
                  ]
               }
            }
         },
         "title": "ArtifactSettings",
         "type": "object"
      },
      "ArtifactSettingsNative": {
         "properties": {
            "enable": {
               "default": true,
               "title": "Enable",
               "type": "boolean"
            },
            "build_job_filepatterns": {
               "default": [
                  "**/build*/bootloader/*.map",
                  "**/build*/bootloader/*.elf",
                  "**/build*/*.map",
                  "**/build*/*.elf",
                  "**/build*/bootloader/*.bin",
                  "**/build*/*.bin",
                  "**/build*/partition_table/*.bin",
                  "**/build*/flasher_args.json",
                  "**/build*/flash_project_args",
                  "**/build*/config/sdkconfig.json",
                  "**/build*/sdkconfig",
                  "**/build*/project_description.json",
                  "**/build*/build.log",
                  "app_info_*.txt",
                  "build_summary_*.xml"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Build Job Filepatterns",
               "type": "array"
            },
            "test_job_filepatterns": {
               "default": [
                  "pytest-embedded/",
                  "XUNIT_RESULT*.xml"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Test Job Filepatterns",
               "type": "array"
            }
         },
         "title": "ArtifactSettingsNative",
         "type": "object"
      },
      "ArtifactSettingsS3": {
         "properties": {
            "enable": {
               "default": false,
               "title": "Enable",
               "type": "boolean"
            },
            "configs": {
               "anyOf": [
                  {
                     "additionalProperties": {
                        "$ref": "#/$defs/S3ArtifactConfig"
                     },
                     "type": "object"
                  },
                  {
                     "additionalProperties": {
                        "additionalProperties": true,
                        "type": "object"
                     },
                     "type": "object"
                  }
               ],
               "default": {
                  "debug": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.map",
                        "bootloader/*.elf",
                        "*.map",
                        "*.elf",
                        "build.log"
                     ]
                  },
                  "flash": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.bin",
                        "*.bin",
                        "partition_table/*.bin",
                        "flasher_args.json",
                        "flash_project_args",
                        "config/sdkconfig.json",
                        "sdkconfig",
                        "project_description.json"
                     ]
                  }
               },
               "title": "Configs"
            }
         },
         "title": "ArtifactSettingsS3",
         "type": "object"
      },
      "BuildPipelineSettings": {
         "properties": {
            "workflow_name": {
               "default": "Build Child Pipeline",
               "title": "Workflow Name",
               "type": "string"
            },
            "presigned_json_job_name": {
               "default": "generate_presigned_json",
               "title": "Presigned Json Job Name",
               "type": "string"
            },
            "job_template_name": {
               "default": ".default_build_settings",
               "title": "Job Template Name",
               "type": "string"
            },
            "job_image": {
               "default": "espressif/idf:latest",
               "title": "Job Image",
               "type": "string"
            },
            "job_stage": {
               "default": "build",
               "title": "Job Stage",
               "type": "string"
            },
            "job_template_jinja": {
               "default": "{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.build_pipeline.job_stage }}\"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: \"{{ settings.gitlab.build_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}",
               "title": "Job Template Jinja",
               "type": "string"
            },
            "job_tags": {
               "default": [
                  "build"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Job Tags",
               "type": "array"
            },
            "runs_per_job": {
               "default": 60,
               "title": "Runs Per Job",
               "type": "integer"
            },
            "parent_pipeline_job_suffix": {
               "default": "",
               "title": "Parent Pipeline Job Suffix",
               "type": "string"
            },
            "jobs_jinja": {
               "default": "{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: \"1\"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: \"1\"\n\n{% endif %}",
               "title": "Jobs Jinja",
               "type": "string"
            },
            "pre_yaml_jinja": {
               "default": "",
               "title": "Pre Yaml Jinja",
               "type": "string"
            },
            "yaml_jinja": {
               "default": "{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.build_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n  needs:\n    - \"build_test_related_apps\"\n  artifacts:\n    paths:\n      - \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n  script:\n    - idf-ci\n      --config 'gitlab.test_pipeline.job_image=\"{{ settings.gitlab.test_pipeline.job_image }}\"'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: \".post\"\n  needs:\n    - \"generate_test_child_pipeline\"\n  variables:\n    PARENT_PIPELINE_ID: \"$CI_PIPELINE_ID\"\n  trigger:\n    include:\n      - artifact: \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n        job: \"generate_test_child_pipeline\"\n    strategy: \"depend\"\n{%- endif %}",
               "title": "Yaml Jinja",
               "type": "string"
            },
            "yaml_filename": {
               "default": "build_child_pipeline.yml",
               "title": "Yaml Filename",
               "type": "string"
            }
         },
         "title": "BuildPipelineSettings",
         "type": "object"
      },
      "GitlabSettings": {
         "properties": {
            "project": {
               "default": "espressif/esp-idf",
               "title": "Project",
               "type": "string"
            },
            "known_failure_cases_bucket_name": {
               "default": "ignore-test-result-files",
               "title": "Known Failure Cases Bucket Name",
               "type": "string"
            },
            "artifacts": {
               "$ref": "#/$defs/ArtifactSettings",
               "default": {
                  "s3": {
                     "configs": {
                        "debug": {
                           "base_dir_pattern": "**/build*/",
                           "bucket": "idf-artifacts",
                           "file_patterns": [
                              "bootloader/*.map",
                              "bootloader/*.elf",
                              "*.map",
                              "*.elf",
                              "build.log"
                           ],
                           "if_clause": null,
                           "is_public": false,
                           "zip_first": true
                        },
                        "flash": {
                           "base_dir_pattern": "**/build*/",
                           "bucket": "idf-artifacts",
                           "file_patterns": [
                              "bootloader/*.bin",
                              "*.bin",
                              "partition_table/*.bin",
                              "flasher_args.json",
                              "flash_project_args",
                              "config/sdkconfig.json",
                              "sdkconfig",
                              "project_description.json"
                           ],
                           "if_clause": null,
                           "is_public": false,
                           "zip_first": true
                        }
                     },
                     "enable": false
                  },
                  "native": {
                     "build_job_filepatterns": [
                        "**/build*/bootloader/*.map",
                        "**/build*/bootloader/*.elf",
                        "**/build*/*.map",
                        "**/build*/*.elf",
                        "**/build*/bootloader/*.bin",
                        "**/build*/*.bin",
                        "**/build*/partition_table/*.bin",
                        "**/build*/flasher_args.json",
                        "**/build*/flash_project_args",
                        "**/build*/config/sdkconfig.json",
                        "**/build*/sdkconfig",
                        "**/build*/project_description.json",
                        "**/build*/build.log",
                        "app_info_*.txt",
                        "build_summary_*.xml"
                     ],
                     "enable": true,
                     "test_job_filepatterns": [
                        "pytest-embedded/",
                        "XUNIT_RESULT*.xml"
                     ]
                  }
               }
            },
            "build_pipeline": {
               "$ref": "#/$defs/BuildPipelineSettings",
               "default": {
                  "workflow_name": "Build Child Pipeline",
                  "presigned_json_job_name": "generate_presigned_json",
                  "job_template_name": ".default_build_settings",
                  "job_image": "espressif/idf:latest",
                  "job_stage": "build",
                  "job_template_jinja": "{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.build_pipeline.job_stage }}\"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: \"{{ settings.gitlab.build_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}",
                  "job_tags": [
                     "build"
                  ],
                  "runs_per_job": 60,
                  "parent_pipeline_job_suffix": "",
                  "jobs_jinja": "{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: \"1\"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: \"1\"\n\n{% endif %}",
                  "pre_yaml_jinja": "",
                  "yaml_jinja": "{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.build_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n  needs:\n    - \"build_test_related_apps\"\n  artifacts:\n    paths:\n      - \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n  script:\n    - idf-ci\n      --config 'gitlab.test_pipeline.job_image=\"{{ settings.gitlab.test_pipeline.job_image }}\"'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: \".post\"\n  needs:\n    - \"generate_test_child_pipeline\"\n  variables:\n    PARENT_PIPELINE_ID: \"$CI_PIPELINE_ID\"\n  trigger:\n    include:\n      - artifact: \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n        job: \"generate_test_child_pipeline\"\n    strategy: \"depend\"\n{%- endif %}",
                  "yaml_filename": "build_child_pipeline.yml"
               }
            },
            "test_pipeline": {
               "$ref": "#/$defs/TestPipelineSettings",
               "default": {
                  "workflow_name": "Test Child Pipeline",
                  "presigned_json_job_name": "generate_presigned_json",
                  "job_template_name": ".default_test_settings",
                  "job_image": "python:3-slim",
                  "job_stage": "test",
                  "job_template_jinja": "{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.test_pipeline.job_stage }}\"\n  image: \"{{ settings.gitlab.test_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  variables:\n    PYTEST_EXTRA_FLAGS: \"\"\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"build_test_related_apps\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml \"XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml\"\n      ${PYTEST_EXTRA_FLAGS}",
                  "job_tags": [],
                  "runs_per_job": 30,
                  "parent_pipeline_job_suffix": "",
                  "jobs_jinja": "{% for job in jobs %}\n{{ job['name'] }}:\n  extends:\n    - \"{{ settings.gitlab.test_pipeline.job_template_name }}\"\n    {%- for extra_extend in job.get('extra_extends', []) %}\n    - \"{{ extra_extend }}\"\n    {%- endfor %}\n  tags: {{ job['tags'] }}\n{%- if job['parallel_count'] > 1 %}\n  parallel: {{ job['parallel_count'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job['nodes'] }}\n{% endfor %}",
                  "pre_yaml_jinja": "",
                  "yaml_jinja": "{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.test_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}",
                  "yaml_filename": "test_child_pipeline.yml"
               }
            }
         },
         "title": "GitlabSettings",
         "type": "object"
      },
      "S3ArtifactConfig": {
         "properties": {
            "bucket": {
               "title": "Bucket",
               "type": "string"
            },
            "is_public": {
               "default": false,
               "title": "Is Public",
               "type": "boolean"
            },
            "zip_first": {
               "default": true,
               "title": "Zip First",
               "type": "boolean"
            },
            "base_dir_pattern": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Base Dir Pattern"
            },
            "file_patterns": {
               "default": [
                  "**/*"
               ],
               "items": {
                  "type": "string"
               },
               "title": "File Patterns",
               "type": "array"
            },
            "if_clause": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "If Clause"
            }
         },
         "required": [
            "bucket"
         ],
         "title": "S3ArtifactConfig",
         "type": "object"
      },
      "TestPipelineSettings": {
         "properties": {
            "workflow_name": {
               "default": "Test Child Pipeline",
               "title": "Workflow Name",
               "type": "string"
            },
            "presigned_json_job_name": {
               "default": "generate_presigned_json",
               "title": "Presigned Json Job Name",
               "type": "string"
            },
            "job_template_name": {
               "default": ".default_test_settings",
               "title": "Job Template Name",
               "type": "string"
            },
            "job_image": {
               "default": "python:3-slim",
               "title": "Job Image",
               "type": "string"
            },
            "job_stage": {
               "default": "test",
               "title": "Job Stage",
               "type": "string"
            },
            "job_template_jinja": {
               "default": "{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.test_pipeline.job_stage }}\"\n  image: \"{{ settings.gitlab.test_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  variables:\n    PYTEST_EXTRA_FLAGS: \"\"\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"build_test_related_apps\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml \"XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml\"\n      ${PYTEST_EXTRA_FLAGS}",
               "title": "Job Template Jinja",
               "type": "string"
            },
            "job_tags": {
               "default": [],
               "items": {
                  "type": "string"
               },
               "title": "Job Tags",
               "type": "array"
            },
            "runs_per_job": {
               "default": 30,
               "title": "Runs Per Job",
               "type": "integer"
            },
            "parent_pipeline_job_suffix": {
               "default": "",
               "title": "Parent Pipeline Job Suffix",
               "type": "string"
            },
            "jobs_jinja": {
               "default": "{% for job in jobs %}\n{{ job['name'] }}:\n  extends:\n    - \"{{ settings.gitlab.test_pipeline.job_template_name }}\"\n    {%- for extra_extend in job.get('extra_extends', []) %}\n    - \"{{ extra_extend }}\"\n    {%- endfor %}\n  tags: {{ job['tags'] }}\n{%- if job['parallel_count'] > 1 %}\n  parallel: {{ job['parallel_count'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job['nodes'] }}\n{% endfor %}",
               "title": "Jobs Jinja",
               "type": "string"
            },
            "pre_yaml_jinja": {
               "default": "",
               "title": "Pre Yaml Jinja",
               "type": "string"
            },
            "yaml_jinja": {
               "default": "{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.test_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}",
               "title": "Yaml Jinja",
               "type": "string"
            },
            "yaml_filename": {
               "default": "test_child_pipeline.yml",
               "title": "Yaml Filename",
               "type": "string"
            }
         },
         "title": "TestPipelineSettings",
         "type": "object"
      }
   },
   "additionalProperties": false
}

Config:
  • use_attribute_docstrings: bool = True

Fields:
field built_app_list_filepatterns: List[str] = ['app_info_*.txt']

Glob patterns for files containing built app information.

field ci_detection_envs: List[str] = ['CI', 'GITHUB_ACTIONS', 'CIRCLECI', 'TRAVIS', 'JENKINS_URL', 'DRONE', 'APPVEYOR', 'BITBUCKET_COMMIT', 'SEMAPHORE', 'TEAMCITY_VERSION']

Environment variables used to detect if running in CI.

field ci_runtime_envs: Dict[str, Any] = {}

Environment variables to set in CI environment.

Path to file containing non-test-related apps.

Path to file containing test-related apps.

field component_ignored_file_extensions: List[str] = ['.md', '.rst', '.yaml', '.yml', '.py']

File extensions to ignore when mapping files to components.

field component_mapping_exclude_regexes: List[str] = ['/test_apps/']

List of regex patterns to exclude certain paths from component mapping.

field component_mapping_regexes: List[str] = ['/components/(.+?)/', '/common_components/(.+?)/']

List of regex patterns to extract component names from file paths.

field exclude_dirs: List[str] = []

Directories to ignore when searching for apps.

field extend_component_ignored_file_extensions: List[str] = []

Additional file extensions to ignore.

field extend_component_mapping_regexes: List[str] = []

Additional component mapping regex patterns to extend the default list.

field extra_default_build_targets: List[str] = []

Additional build targets to include by default.

field gitlab: GitlabSettings = GitlabSettings(project='espressif/esp-idf', known_failure_cases_bucket_name='ignore-test-result-files', artifacts=ArtifactSettings(s3=ArtifactSettingsS3(enable=False, configs={'debug': S3ArtifactConfig(bucket='idf-artifacts', is_public=False, zip_first=True, base_dir_pattern='**/build*/', file_patterns=['bootloader/*.map', 'bootloader/*.elf', '*.map', '*.elf', 'build.log'], if_clause=None), 'flash': S3ArtifactConfig(bucket='idf-artifacts', is_public=False, zip_first=True, base_dir_pattern='**/build*/', file_patterns=['bootloader/*.bin', '*.bin', 'partition_table/*.bin', 'flasher_args.json', 'flash_project_args', 'config/sdkconfig.json', 'sdkconfig', 'project_description.json'], if_clause=None)}), native=ArtifactSettingsNative(enable=True, build_job_filepatterns=['**/build*/bootloader/*.map', '**/build*/bootloader/*.elf', '**/build*/*.map', '**/build*/*.elf', '**/build*/bootloader/*.bin', '**/build*/*.bin', '**/build*/partition_table/*.bin', '**/build*/flasher_args.json', '**/build*/flash_project_args', '**/build*/config/sdkconfig.json', '**/build*/sdkconfig', '**/build*/project_description.json', '**/build*/build.log', 'app_info_*.txt', 'build_summary_*.xml'], test_job_filepatterns=['pytest-embedded/', 'XUNIT_RESULT*.xml'])), build_pipeline=BuildPipelineSettings(workflow_name='Build Child Pipeline', presigned_json_job_name='generate_presigned_json', job_template_name='.default_build_settings', job_image='espressif/idf:latest', job_stage='build', job_template_jinja='{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: "{{ settings.gitlab.build_pipeline.job_stage }}"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: "{{ settings.gitlab.build_pipeline.job_image }}"\n  timeout: "1h"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - "{{ path }}"\n    {%- endfor %}\n    expire_in: "1 week"\n    when: "always"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}', job_tags=['build'], runs_per_job=60, parent_pipeline_job_suffix='', jobs_jinja='{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: "1"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: "1"\n\n{% endif %}', pre_yaml_jinja='', yaml_jinja='{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: "{{ settings.gitlab.build_pipeline.workflow_name }}"\n  rules:\n    - when: "always"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n  needs:\n    - "build_test_related_apps"\n  artifacts:\n    paths:\n      - "{{ settings.gitlab.test_pipeline.yaml_filename }}"\n  script:\n    - idf-ci\n      --config \'gitlab.test_pipeline.job_image="{{ settings.gitlab.test_pipeline.job_image }}"\'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: ".post"\n  needs:\n    - "generate_test_child_pipeline"\n  variables:\n    PARENT_PIPELINE_ID: "$CI_PIPELINE_ID"\n  trigger:\n    include:\n      - artifact: "{{ settings.gitlab.test_pipeline.yaml_filename }}"\n        job: "generate_test_child_pipeline"\n    strategy: "depend"\n{%- endif %}', yaml_filename='build_child_pipeline.yml'), test_pipeline=TestPipelineSettings(workflow_name='Test Child Pipeline', presigned_json_job_name='generate_presigned_json', job_template_name='.default_test_settings', job_image='python:3-slim', job_stage='test', job_template_jinja='{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: "{{ settings.gitlab.test_pipeline.job_stage }}"\n  image: "{{ settings.gitlab.test_pipeline.job_image }}"\n  timeout: "1h"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - "{{ path }}"\n    {%- endfor %}\n    expire_in: "1 week"\n    when: "always"\n  variables:\n    PYTEST_EXTRA_FLAGS: ""\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "build_test_related_apps"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml "XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml"\n      ${PYTEST_EXTRA_FLAGS}', job_tags=[], runs_per_job=30, parent_pipeline_job_suffix='', jobs_jinja='{% for job in jobs %}\n{{ job[\'name\'] }}:\n  extends:\n    - "{{ settings.gitlab.test_pipeline.job_template_name }}"\n    {%- for extra_extend in job.get(\'extra_extends\', []) %}\n    - "{{ extra_extend }}"\n    {%- endfor %}\n  tags: {{ job[\'tags\'] }}\n{%- if job[\'parallel_count\'] > 1 %}\n  parallel: {{ job[\'parallel_count\'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job[\'nodes\'] }}\n{% endfor %}', pre_yaml_jinja='', yaml_jinja='{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: "{{ settings.gitlab.test_pipeline.workflow_name }}"\n  rules:\n    - when: "always"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}', yaml_filename='test_child_pipeline.yml'))

GitLab-specific settings.

field local_runtime_envs: Dict[str, Any] = {}

Environment variables to set in local development.

Whether to preserve non-test-related apps.

Whether to preserve test-related apps.

pydantic settings idf_ci.settings.GitlabSettings

Show JSON schema
{
   "title": "GitlabSettings",
   "type": "object",
   "properties": {
      "project": {
         "default": "espressif/esp-idf",
         "title": "Project",
         "type": "string"
      },
      "known_failure_cases_bucket_name": {
         "default": "ignore-test-result-files",
         "title": "Known Failure Cases Bucket Name",
         "type": "string"
      },
      "artifacts": {
         "$ref": "#/$defs/ArtifactSettings",
         "default": {
            "s3": {
               "configs": {
                  "debug": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.map",
                        "bootloader/*.elf",
                        "*.map",
                        "*.elf",
                        "build.log"
                     ],
                     "if_clause": null,
                     "is_public": false,
                     "zip_first": true
                  },
                  "flash": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.bin",
                        "*.bin",
                        "partition_table/*.bin",
                        "flasher_args.json",
                        "flash_project_args",
                        "config/sdkconfig.json",
                        "sdkconfig",
                        "project_description.json"
                     ],
                     "if_clause": null,
                     "is_public": false,
                     "zip_first": true
                  }
               },
               "enable": false
            },
            "native": {
               "build_job_filepatterns": [
                  "**/build*/bootloader/*.map",
                  "**/build*/bootloader/*.elf",
                  "**/build*/*.map",
                  "**/build*/*.elf",
                  "**/build*/bootloader/*.bin",
                  "**/build*/*.bin",
                  "**/build*/partition_table/*.bin",
                  "**/build*/flasher_args.json",
                  "**/build*/flash_project_args",
                  "**/build*/config/sdkconfig.json",
                  "**/build*/sdkconfig",
                  "**/build*/project_description.json",
                  "**/build*/build.log",
                  "app_info_*.txt",
                  "build_summary_*.xml"
               ],
               "enable": true,
               "test_job_filepatterns": [
                  "pytest-embedded/",
                  "XUNIT_RESULT*.xml"
               ]
            }
         }
      },
      "build_pipeline": {
         "$ref": "#/$defs/BuildPipelineSettings",
         "default": {
            "workflow_name": "Build Child Pipeline",
            "presigned_json_job_name": "generate_presigned_json",
            "job_template_name": ".default_build_settings",
            "job_image": "espressif/idf:latest",
            "job_stage": "build",
            "job_template_jinja": "{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.build_pipeline.job_stage }}\"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: \"{{ settings.gitlab.build_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}",
            "job_tags": [
               "build"
            ],
            "runs_per_job": 60,
            "parent_pipeline_job_suffix": "",
            "jobs_jinja": "{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: \"1\"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: \"1\"\n\n{% endif %}",
            "pre_yaml_jinja": "",
            "yaml_jinja": "{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.build_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n  needs:\n    - \"build_test_related_apps\"\n  artifacts:\n    paths:\n      - \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n  script:\n    - idf-ci\n      --config 'gitlab.test_pipeline.job_image=\"{{ settings.gitlab.test_pipeline.job_image }}\"'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: \".post\"\n  needs:\n    - \"generate_test_child_pipeline\"\n  variables:\n    PARENT_PIPELINE_ID: \"$CI_PIPELINE_ID\"\n  trigger:\n    include:\n      - artifact: \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n        job: \"generate_test_child_pipeline\"\n    strategy: \"depend\"\n{%- endif %}",
            "yaml_filename": "build_child_pipeline.yml"
         }
      },
      "test_pipeline": {
         "$ref": "#/$defs/TestPipelineSettings",
         "default": {
            "workflow_name": "Test Child Pipeline",
            "presigned_json_job_name": "generate_presigned_json",
            "job_template_name": ".default_test_settings",
            "job_image": "python:3-slim",
            "job_stage": "test",
            "job_template_jinja": "{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.test_pipeline.job_stage }}\"\n  image: \"{{ settings.gitlab.test_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  variables:\n    PYTEST_EXTRA_FLAGS: \"\"\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"build_test_related_apps\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml \"XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml\"\n      ${PYTEST_EXTRA_FLAGS}",
            "job_tags": [],
            "runs_per_job": 30,
            "parent_pipeline_job_suffix": "",
            "jobs_jinja": "{% for job in jobs %}\n{{ job['name'] }}:\n  extends:\n    - \"{{ settings.gitlab.test_pipeline.job_template_name }}\"\n    {%- for extra_extend in job.get('extra_extends', []) %}\n    - \"{{ extra_extend }}\"\n    {%- endfor %}\n  tags: {{ job['tags'] }}\n{%- if job['parallel_count'] > 1 %}\n  parallel: {{ job['parallel_count'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job['nodes'] }}\n{% endfor %}",
            "pre_yaml_jinja": "",
            "yaml_jinja": "{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.test_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}",
            "yaml_filename": "test_child_pipeline.yml"
         }
      }
   },
   "$defs": {
      "ArtifactSettings": {
         "properties": {
            "s3": {
               "$ref": "#/$defs/ArtifactSettingsS3",
               "default": {
                  "enable": false,
                  "configs": {
                     "debug": {
                        "base_dir_pattern": "**/build*/",
                        "bucket": "idf-artifacts",
                        "file_patterns": [
                           "bootloader/*.map",
                           "bootloader/*.elf",
                           "*.map",
                           "*.elf",
                           "build.log"
                        ],
                        "if_clause": null,
                        "is_public": false,
                        "zip_first": true
                     },
                     "flash": {
                        "base_dir_pattern": "**/build*/",
                        "bucket": "idf-artifacts",
                        "file_patterns": [
                           "bootloader/*.bin",
                           "*.bin",
                           "partition_table/*.bin",
                           "flasher_args.json",
                           "flash_project_args",
                           "config/sdkconfig.json",
                           "sdkconfig",
                           "project_description.json"
                        ],
                        "if_clause": null,
                        "is_public": false,
                        "zip_first": true
                     }
                  }
               }
            },
            "native": {
               "$ref": "#/$defs/ArtifactSettingsNative",
               "default": {
                  "enable": true,
                  "build_job_filepatterns": [
                     "**/build*/bootloader/*.map",
                     "**/build*/bootloader/*.elf",
                     "**/build*/*.map",
                     "**/build*/*.elf",
                     "**/build*/bootloader/*.bin",
                     "**/build*/*.bin",
                     "**/build*/partition_table/*.bin",
                     "**/build*/flasher_args.json",
                     "**/build*/flash_project_args",
                     "**/build*/config/sdkconfig.json",
                     "**/build*/sdkconfig",
                     "**/build*/project_description.json",
                     "**/build*/build.log",
                     "app_info_*.txt",
                     "build_summary_*.xml"
                  ],
                  "test_job_filepatterns": [
                     "pytest-embedded/",
                     "XUNIT_RESULT*.xml"
                  ]
               }
            }
         },
         "title": "ArtifactSettings",
         "type": "object"
      },
      "ArtifactSettingsNative": {
         "properties": {
            "enable": {
               "default": true,
               "title": "Enable",
               "type": "boolean"
            },
            "build_job_filepatterns": {
               "default": [
                  "**/build*/bootloader/*.map",
                  "**/build*/bootloader/*.elf",
                  "**/build*/*.map",
                  "**/build*/*.elf",
                  "**/build*/bootloader/*.bin",
                  "**/build*/*.bin",
                  "**/build*/partition_table/*.bin",
                  "**/build*/flasher_args.json",
                  "**/build*/flash_project_args",
                  "**/build*/config/sdkconfig.json",
                  "**/build*/sdkconfig",
                  "**/build*/project_description.json",
                  "**/build*/build.log",
                  "app_info_*.txt",
                  "build_summary_*.xml"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Build Job Filepatterns",
               "type": "array"
            },
            "test_job_filepatterns": {
               "default": [
                  "pytest-embedded/",
                  "XUNIT_RESULT*.xml"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Test Job Filepatterns",
               "type": "array"
            }
         },
         "title": "ArtifactSettingsNative",
         "type": "object"
      },
      "ArtifactSettingsS3": {
         "properties": {
            "enable": {
               "default": false,
               "title": "Enable",
               "type": "boolean"
            },
            "configs": {
               "anyOf": [
                  {
                     "additionalProperties": {
                        "$ref": "#/$defs/S3ArtifactConfig"
                     },
                     "type": "object"
                  },
                  {
                     "additionalProperties": {
                        "additionalProperties": true,
                        "type": "object"
                     },
                     "type": "object"
                  }
               ],
               "default": {
                  "debug": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.map",
                        "bootloader/*.elf",
                        "*.map",
                        "*.elf",
                        "build.log"
                     ]
                  },
                  "flash": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.bin",
                        "*.bin",
                        "partition_table/*.bin",
                        "flasher_args.json",
                        "flash_project_args",
                        "config/sdkconfig.json",
                        "sdkconfig",
                        "project_description.json"
                     ]
                  }
               },
               "title": "Configs"
            }
         },
         "title": "ArtifactSettingsS3",
         "type": "object"
      },
      "BuildPipelineSettings": {
         "properties": {
            "workflow_name": {
               "default": "Build Child Pipeline",
               "title": "Workflow Name",
               "type": "string"
            },
            "presigned_json_job_name": {
               "default": "generate_presigned_json",
               "title": "Presigned Json Job Name",
               "type": "string"
            },
            "job_template_name": {
               "default": ".default_build_settings",
               "title": "Job Template Name",
               "type": "string"
            },
            "job_image": {
               "default": "espressif/idf:latest",
               "title": "Job Image",
               "type": "string"
            },
            "job_stage": {
               "default": "build",
               "title": "Job Stage",
               "type": "string"
            },
            "job_template_jinja": {
               "default": "{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.build_pipeline.job_stage }}\"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: \"{{ settings.gitlab.build_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}",
               "title": "Job Template Jinja",
               "type": "string"
            },
            "job_tags": {
               "default": [
                  "build"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Job Tags",
               "type": "array"
            },
            "runs_per_job": {
               "default": 60,
               "title": "Runs Per Job",
               "type": "integer"
            },
            "parent_pipeline_job_suffix": {
               "default": "",
               "title": "Parent Pipeline Job Suffix",
               "type": "string"
            },
            "jobs_jinja": {
               "default": "{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: \"1\"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: \"1\"\n\n{% endif %}",
               "title": "Jobs Jinja",
               "type": "string"
            },
            "pre_yaml_jinja": {
               "default": "",
               "title": "Pre Yaml Jinja",
               "type": "string"
            },
            "yaml_jinja": {
               "default": "{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.build_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n  needs:\n    - \"build_test_related_apps\"\n  artifacts:\n    paths:\n      - \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n  script:\n    - idf-ci\n      --config 'gitlab.test_pipeline.job_image=\"{{ settings.gitlab.test_pipeline.job_image }}\"'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: \".post\"\n  needs:\n    - \"generate_test_child_pipeline\"\n  variables:\n    PARENT_PIPELINE_ID: \"$CI_PIPELINE_ID\"\n  trigger:\n    include:\n      - artifact: \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n        job: \"generate_test_child_pipeline\"\n    strategy: \"depend\"\n{%- endif %}",
               "title": "Yaml Jinja",
               "type": "string"
            },
            "yaml_filename": {
               "default": "build_child_pipeline.yml",
               "title": "Yaml Filename",
               "type": "string"
            }
         },
         "title": "BuildPipelineSettings",
         "type": "object"
      },
      "S3ArtifactConfig": {
         "properties": {
            "bucket": {
               "title": "Bucket",
               "type": "string"
            },
            "is_public": {
               "default": false,
               "title": "Is Public",
               "type": "boolean"
            },
            "zip_first": {
               "default": true,
               "title": "Zip First",
               "type": "boolean"
            },
            "base_dir_pattern": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Base Dir Pattern"
            },
            "file_patterns": {
               "default": [
                  "**/*"
               ],
               "items": {
                  "type": "string"
               },
               "title": "File Patterns",
               "type": "array"
            },
            "if_clause": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "If Clause"
            }
         },
         "required": [
            "bucket"
         ],
         "title": "S3ArtifactConfig",
         "type": "object"
      },
      "TestPipelineSettings": {
         "properties": {
            "workflow_name": {
               "default": "Test Child Pipeline",
               "title": "Workflow Name",
               "type": "string"
            },
            "presigned_json_job_name": {
               "default": "generate_presigned_json",
               "title": "Presigned Json Job Name",
               "type": "string"
            },
            "job_template_name": {
               "default": ".default_test_settings",
               "title": "Job Template Name",
               "type": "string"
            },
            "job_image": {
               "default": "python:3-slim",
               "title": "Job Image",
               "type": "string"
            },
            "job_stage": {
               "default": "test",
               "title": "Job Stage",
               "type": "string"
            },
            "job_template_jinja": {
               "default": "{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.test_pipeline.job_stage }}\"\n  image: \"{{ settings.gitlab.test_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  variables:\n    PYTEST_EXTRA_FLAGS: \"\"\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"build_test_related_apps\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml \"XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml\"\n      ${PYTEST_EXTRA_FLAGS}",
               "title": "Job Template Jinja",
               "type": "string"
            },
            "job_tags": {
               "default": [],
               "items": {
                  "type": "string"
               },
               "title": "Job Tags",
               "type": "array"
            },
            "runs_per_job": {
               "default": 30,
               "title": "Runs Per Job",
               "type": "integer"
            },
            "parent_pipeline_job_suffix": {
               "default": "",
               "title": "Parent Pipeline Job Suffix",
               "type": "string"
            },
            "jobs_jinja": {
               "default": "{% for job in jobs %}\n{{ job['name'] }}:\n  extends:\n    - \"{{ settings.gitlab.test_pipeline.job_template_name }}\"\n    {%- for extra_extend in job.get('extra_extends', []) %}\n    - \"{{ extra_extend }}\"\n    {%- endfor %}\n  tags: {{ job['tags'] }}\n{%- if job['parallel_count'] > 1 %}\n  parallel: {{ job['parallel_count'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job['nodes'] }}\n{% endfor %}",
               "title": "Jobs Jinja",
               "type": "string"
            },
            "pre_yaml_jinja": {
               "default": "",
               "title": "Pre Yaml Jinja",
               "type": "string"
            },
            "yaml_jinja": {
               "default": "{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.test_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}",
               "title": "Yaml Jinja",
               "type": "string"
            },
            "yaml_filename": {
               "default": "test_child_pipeline.yml",
               "title": "Yaml Filename",
               "type": "string"
            }
         },
         "title": "TestPipelineSettings",
         "type": "object"
      }
   }
}

Fields:
field artifacts: ArtifactSettings = ArtifactSettings(s3=ArtifactSettingsS3(enable=False, configs={'debug': S3ArtifactConfig(bucket='idf-artifacts', is_public=False, zip_first=True, base_dir_pattern='**/build*/', file_patterns=['bootloader/*.map', 'bootloader/*.elf', '*.map', '*.elf', 'build.log'], if_clause=None), 'flash': S3ArtifactConfig(bucket='idf-artifacts', is_public=False, zip_first=True, base_dir_pattern='**/build*/', file_patterns=['bootloader/*.bin', '*.bin', 'partition_table/*.bin', 'flasher_args.json', 'flash_project_args', 'config/sdkconfig.json', 'sdkconfig', 'project_description.json'], if_clause=None)}), native=ArtifactSettingsNative(enable=True, build_job_filepatterns=['**/build*/bootloader/*.map', '**/build*/bootloader/*.elf', '**/build*/*.map', '**/build*/*.elf', '**/build*/bootloader/*.bin', '**/build*/*.bin', '**/build*/partition_table/*.bin', '**/build*/flasher_args.json', '**/build*/flash_project_args', '**/build*/config/sdkconfig.json', '**/build*/sdkconfig', '**/build*/project_description.json', '**/build*/build.log', 'app_info_*.txt', 'build_summary_*.xml'], test_job_filepatterns=['pytest-embedded/', 'XUNIT_RESULT*.xml']))
field build_pipeline: BuildPipelineSettings = BuildPipelineSettings(workflow_name='Build Child Pipeline', presigned_json_job_name='generate_presigned_json', job_template_name='.default_build_settings', job_image='espressif/idf:latest', job_stage='build', job_template_jinja='{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: "{{ settings.gitlab.build_pipeline.job_stage }}"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: "{{ settings.gitlab.build_pipeline.job_image }}"\n  timeout: "1h"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - "{{ path }}"\n    {%- endfor %}\n    expire_in: "1 week"\n    when: "always"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}', job_tags=['build'], runs_per_job=60, parent_pipeline_job_suffix='', jobs_jinja='{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: "1"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: "1"\n\n{% endif %}', pre_yaml_jinja='', yaml_jinja='{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: "{{ settings.gitlab.build_pipeline.workflow_name }}"\n  rules:\n    - when: "always"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n  needs:\n    - "build_test_related_apps"\n  artifacts:\n    paths:\n      - "{{ settings.gitlab.test_pipeline.yaml_filename }}"\n  script:\n    - idf-ci\n      --config \'gitlab.test_pipeline.job_image="{{ settings.gitlab.test_pipeline.job_image }}"\'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: ".post"\n  needs:\n    - "generate_test_child_pipeline"\n  variables:\n    PARENT_PIPELINE_ID: "$CI_PIPELINE_ID"\n  trigger:\n    include:\n      - artifact: "{{ settings.gitlab.test_pipeline.yaml_filename }}"\n        job: "generate_test_child_pipeline"\n    strategy: "depend"\n{%- endif %}', yaml_filename='build_child_pipeline.yml')
field known_failure_cases_bucket_name: str = 'ignore-test-result-files'

Bucket name for storing known failure cases.

field project: str = 'espressif/esp-idf'

GitLab project path in the format ‘owner/repo’.

field test_pipeline: TestPipelineSettings = TestPipelineSettings(workflow_name='Test Child Pipeline', presigned_json_job_name='generate_presigned_json', job_template_name='.default_test_settings', job_image='python:3-slim', job_stage='test', job_template_jinja='{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: "{{ settings.gitlab.test_pipeline.job_stage }}"\n  image: "{{ settings.gitlab.test_pipeline.job_image }}"\n  timeout: "1h"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - "{{ path }}"\n    {%- endfor %}\n    expire_in: "1 week"\n    when: "always"\n  variables:\n    PYTEST_EXTRA_FLAGS: ""\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "build_test_related_apps"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml "XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml"\n      ${PYTEST_EXTRA_FLAGS}', job_tags=[], runs_per_job=30, parent_pipeline_job_suffix='', jobs_jinja='{% for job in jobs %}\n{{ job[\'name\'] }}:\n  extends:\n    - "{{ settings.gitlab.test_pipeline.job_template_name }}"\n    {%- for extra_extend in job.get(\'extra_extends\', []) %}\n    - "{{ extra_extend }}"\n    {%- endfor %}\n  tags: {{ job[\'tags\'] }}\n{%- if job[\'parallel_count\'] > 1 %}\n  parallel: {{ job[\'parallel_count\'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job[\'nodes\'] }}\n{% endfor %}', pre_yaml_jinja='', yaml_jinja='{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: "{{ settings.gitlab.test_pipeline.workflow_name }}"\n  rules:\n    - when: "always"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}', yaml_filename='test_child_pipeline.yml')
pydantic settings idf_ci.settings.ArtifactSettings

Show JSON schema
{
   "title": "ArtifactSettings",
   "type": "object",
   "properties": {
      "s3": {
         "$ref": "#/$defs/ArtifactSettingsS3",
         "default": {
            "enable": false,
            "configs": {
               "debug": {
                  "base_dir_pattern": "**/build*/",
                  "bucket": "idf-artifacts",
                  "file_patterns": [
                     "bootloader/*.map",
                     "bootloader/*.elf",
                     "*.map",
                     "*.elf",
                     "build.log"
                  ],
                  "if_clause": null,
                  "is_public": false,
                  "zip_first": true
               },
               "flash": {
                  "base_dir_pattern": "**/build*/",
                  "bucket": "idf-artifacts",
                  "file_patterns": [
                     "bootloader/*.bin",
                     "*.bin",
                     "partition_table/*.bin",
                     "flasher_args.json",
                     "flash_project_args",
                     "config/sdkconfig.json",
                     "sdkconfig",
                     "project_description.json"
                  ],
                  "if_clause": null,
                  "is_public": false,
                  "zip_first": true
               }
            }
         }
      },
      "native": {
         "$ref": "#/$defs/ArtifactSettingsNative",
         "default": {
            "enable": true,
            "build_job_filepatterns": [
               "**/build*/bootloader/*.map",
               "**/build*/bootloader/*.elf",
               "**/build*/*.map",
               "**/build*/*.elf",
               "**/build*/bootloader/*.bin",
               "**/build*/*.bin",
               "**/build*/partition_table/*.bin",
               "**/build*/flasher_args.json",
               "**/build*/flash_project_args",
               "**/build*/config/sdkconfig.json",
               "**/build*/sdkconfig",
               "**/build*/project_description.json",
               "**/build*/build.log",
               "app_info_*.txt",
               "build_summary_*.xml"
            ],
            "test_job_filepatterns": [
               "pytest-embedded/",
               "XUNIT_RESULT*.xml"
            ]
         }
      }
   },
   "$defs": {
      "ArtifactSettingsNative": {
         "properties": {
            "enable": {
               "default": true,
               "title": "Enable",
               "type": "boolean"
            },
            "build_job_filepatterns": {
               "default": [
                  "**/build*/bootloader/*.map",
                  "**/build*/bootloader/*.elf",
                  "**/build*/*.map",
                  "**/build*/*.elf",
                  "**/build*/bootloader/*.bin",
                  "**/build*/*.bin",
                  "**/build*/partition_table/*.bin",
                  "**/build*/flasher_args.json",
                  "**/build*/flash_project_args",
                  "**/build*/config/sdkconfig.json",
                  "**/build*/sdkconfig",
                  "**/build*/project_description.json",
                  "**/build*/build.log",
                  "app_info_*.txt",
                  "build_summary_*.xml"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Build Job Filepatterns",
               "type": "array"
            },
            "test_job_filepatterns": {
               "default": [
                  "pytest-embedded/",
                  "XUNIT_RESULT*.xml"
               ],
               "items": {
                  "type": "string"
               },
               "title": "Test Job Filepatterns",
               "type": "array"
            }
         },
         "title": "ArtifactSettingsNative",
         "type": "object"
      },
      "ArtifactSettingsS3": {
         "properties": {
            "enable": {
               "default": false,
               "title": "Enable",
               "type": "boolean"
            },
            "configs": {
               "anyOf": [
                  {
                     "additionalProperties": {
                        "$ref": "#/$defs/S3ArtifactConfig"
                     },
                     "type": "object"
                  },
                  {
                     "additionalProperties": {
                        "additionalProperties": true,
                        "type": "object"
                     },
                     "type": "object"
                  }
               ],
               "default": {
                  "debug": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.map",
                        "bootloader/*.elf",
                        "*.map",
                        "*.elf",
                        "build.log"
                     ]
                  },
                  "flash": {
                     "base_dir_pattern": "**/build*/",
                     "bucket": "idf-artifacts",
                     "file_patterns": [
                        "bootloader/*.bin",
                        "*.bin",
                        "partition_table/*.bin",
                        "flasher_args.json",
                        "flash_project_args",
                        "config/sdkconfig.json",
                        "sdkconfig",
                        "project_description.json"
                     ]
                  }
               },
               "title": "Configs"
            }
         },
         "title": "ArtifactSettingsS3",
         "type": "object"
      },
      "S3ArtifactConfig": {
         "properties": {
            "bucket": {
               "title": "Bucket",
               "type": "string"
            },
            "is_public": {
               "default": false,
               "title": "Is Public",
               "type": "boolean"
            },
            "zip_first": {
               "default": true,
               "title": "Zip First",
               "type": "boolean"
            },
            "base_dir_pattern": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "Base Dir Pattern"
            },
            "file_patterns": {
               "default": [
                  "**/*"
               ],
               "items": {
                  "type": "string"
               },
               "title": "File Patterns",
               "type": "array"
            },
            "if_clause": {
               "anyOf": [
                  {
                     "type": "string"
                  },
                  {
                     "type": "null"
                  }
               ],
               "default": null,
               "title": "If Clause"
            }
         },
         "required": [
            "bucket"
         ],
         "title": "S3ArtifactConfig",
         "type": "object"
      }
   }
}

Fields:
field native: ArtifactSettingsNative = ArtifactSettingsNative(enable=True, build_job_filepatterns=['**/build*/bootloader/*.map', '**/build*/bootloader/*.elf', '**/build*/*.map', '**/build*/*.elf', '**/build*/bootloader/*.bin', '**/build*/*.bin', '**/build*/partition_table/*.bin', '**/build*/flasher_args.json', '**/build*/flash_project_args', '**/build*/config/sdkconfig.json', '**/build*/sdkconfig', '**/build*/project_description.json', '**/build*/build.log', 'app_info_*.txt', 'build_summary_*.xml'], test_job_filepatterns=['pytest-embedded/', 'XUNIT_RESULT*.xml'])

GitLab native artifact settings.

field s3: ArtifactSettingsS3 = ArtifactSettingsS3(enable=False, configs={'debug': S3ArtifactConfig(bucket='idf-artifacts', is_public=False, zip_first=True, base_dir_pattern='**/build*/', file_patterns=['bootloader/*.map', 'bootloader/*.elf', '*.map', '*.elf', 'build.log'], if_clause=None), 'flash': S3ArtifactConfig(bucket='idf-artifacts', is_public=False, zip_first=True, base_dir_pattern='**/build*/', file_patterns=['bootloader/*.bin', '*.bin', 'partition_table/*.bin', 'flasher_args.json', 'flash_project_args', 'config/sdkconfig.json', 'sdkconfig', 'project_description.json'], if_clause=None)})

S3 artifact upload settings.

pydantic settings idf_ci.settings.BuildPipelineSettings

Show JSON schema
{
   "title": "BuildPipelineSettings",
   "type": "object",
   "properties": {
      "workflow_name": {
         "default": "Build Child Pipeline",
         "title": "Workflow Name",
         "type": "string"
      },
      "presigned_json_job_name": {
         "default": "generate_presigned_json",
         "title": "Presigned Json Job Name",
         "type": "string"
      },
      "job_template_name": {
         "default": ".default_build_settings",
         "title": "Job Template Name",
         "type": "string"
      },
      "job_image": {
         "default": "espressif/idf:latest",
         "title": "Job Image",
         "type": "string"
      },
      "job_stage": {
         "default": "build",
         "title": "Job Stage",
         "type": "string"
      },
      "job_template_jinja": {
         "default": "{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.build_pipeline.job_stage }}\"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: \"{{ settings.gitlab.build_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}",
         "title": "Job Template Jinja",
         "type": "string"
      },
      "job_tags": {
         "default": [
            "build"
         ],
         "items": {
            "type": "string"
         },
         "title": "Job Tags",
         "type": "array"
      },
      "runs_per_job": {
         "default": 60,
         "title": "Runs Per Job",
         "type": "integer"
      },
      "parent_pipeline_job_suffix": {
         "default": "",
         "title": "Parent Pipeline Job Suffix",
         "type": "string"
      },
      "jobs_jinja": {
         "default": "{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: \"1\"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}\"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: \"1\"\n\n{% endif %}",
         "title": "Jobs Jinja",
         "type": "string"
      },
      "pre_yaml_jinja": {
         "default": "",
         "title": "Pre Yaml Jinja",
         "type": "string"
      },
      "yaml_jinja": {
         "default": "{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.build_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: \"{{ settings.gitlab.build_pipeline.job_template_name }}\"\n  needs:\n    - \"build_test_related_apps\"\n  artifacts:\n    paths:\n      - \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n  script:\n    - idf-ci\n      --config 'gitlab.test_pipeline.job_image=\"{{ settings.gitlab.test_pipeline.job_image }}\"'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: \".post\"\n  needs:\n    - \"generate_test_child_pipeline\"\n  variables:\n    PARENT_PIPELINE_ID: \"$CI_PIPELINE_ID\"\n  trigger:\n    include:\n      - artifact: \"{{ settings.gitlab.test_pipeline.yaml_filename }}\"\n        job: \"generate_test_child_pipeline\"\n    strategy: \"depend\"\n{%- endif %}",
         "title": "Yaml Jinja",
         "type": "string"
      },
      "yaml_filename": {
         "default": "build_child_pipeline.yml",
         "title": "Yaml Filename",
         "type": "string"
      }
   }
}

Fields:
field job_image: str = 'espressif/idf:latest'

Docker image to use for build jobs.

field job_stage: str = 'build'

Default stage for build jobs in the pipeline.

field job_tags: List[str] = ['build']

List of tags for CI build jobs.

field job_template_jinja: str = '{{ settings.gitlab.build_pipeline.job_template_name }}:\n  stage: "{{ settings.gitlab.build_pipeline.job_stage }}"\n  tags: {{ settings.gitlab.build_pipeline.job_tags }}\n  image: "{{ settings.gitlab.build_pipeline.job_image }}"\n  timeout: "1h"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.build_job_filepatterns %}\n      - "{{ path }}"\n    {%- endfor %}\n    expire_in: "1 week"\n    when: "always"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - idf-ci build run\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}'

Default template for CI build jobs.

field job_template_name: str = '.default_build_settings'

Default template name for CI build jobs.

field jobs_jinja: str = '{%- if test_related_apps_count > 0 %}\nbuild_test_related_apps:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n{%- if test_related_parallel_count > 1 %}\n  parallel: {{ test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n  variables:\n    IDF_CI_BUILD_ONLY_TEST_RELATED_APPS: "1"\n\n{% endif %}\n{%- if non_test_related_apps_count > 0 %}\nbuild_non_test_related_apps:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n{%- if non_test_related_parallel_count > 1 %}\n  parallel: {{ non_test_related_parallel_count }}\n{%- endif %}\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "generate_build_child_pipeline{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "pipeline_variables{{ settings.gitlab.build_pipeline.parent_pipeline_job_suffix }}"\n  variables:\n    IDF_CI_BUILD_ONLY_NON_TEST_RELATED_APPS: "1"\n\n{% endif %}'

Jinja2 template for build jobs configuration.

field parent_pipeline_job_suffix: str = ''

Suffix to append to parent pipeline job names when referencing them.

field pre_yaml_jinja: str = ''

yaml content to be injected before the yaml template.

field presigned_json_job_name: str = 'generate_presigned_json'

Name of the job within the child pipeline that creates presigned.json.

field runs_per_job: int = 60

Maximum number of apps to build in a single job.

field workflow_name: str = 'Build Child Pipeline'

Name for the GitLab CI workflow.

field yaml_filename: str = 'build_child_pipeline.yml'

Filename for the build child pipeline YAML file.

field yaml_jinja: str = '{{ settings.gitlab.build_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: "{{ settings.gitlab.build_pipeline.workflow_name }}"\n  rules:\n    - when: "always"\n\n{% if settings.gitlab.build_pipeline.job_template_jinja %}\n{{ job_template }}\n{%- endif %}\n\n{{ jobs }}\n\n{%- if test_related_apps_count > 0 %}\ngenerate_test_child_pipeline:\n  extends: "{{ settings.gitlab.build_pipeline.job_template_name }}"\n  needs:\n    - "build_test_related_apps"\n  artifacts:\n    paths:\n      - "{{ settings.gitlab.test_pipeline.yaml_filename }}"\n  script:\n    - idf-ci\n      --config \'gitlab.test_pipeline.job_image="{{ settings.gitlab.test_pipeline.job_image }}"\'\n      gitlab test-child-pipeline\n\ntest-child-pipeline:\n  stage: ".post"\n  needs:\n    - "generate_test_child_pipeline"\n  variables:\n    PARENT_PIPELINE_ID: "$CI_PIPELINE_ID"\n  trigger:\n    include:\n      - artifact: "{{ settings.gitlab.test_pipeline.yaml_filename }}"\n        job: "generate_test_child_pipeline"\n    strategy: "depend"\n{%- endif %}'

Jinja2 template for the build child pipeline YAML content.

pydantic settings idf_ci.settings.TestPipelineSettings

Show JSON schema
{
   "title": "TestPipelineSettings",
   "type": "object",
   "properties": {
      "workflow_name": {
         "default": "Test Child Pipeline",
         "title": "Workflow Name",
         "type": "string"
      },
      "presigned_json_job_name": {
         "default": "generate_presigned_json",
         "title": "Presigned Json Job Name",
         "type": "string"
      },
      "job_template_name": {
         "default": ".default_test_settings",
         "title": "Job Template Name",
         "type": "string"
      },
      "job_image": {
         "default": "python:3-slim",
         "title": "Job Image",
         "type": "string"
      },
      "job_stage": {
         "default": "test",
         "title": "Job Stage",
         "type": "string"
      },
      "job_template_jinja": {
         "default": "{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: \"{{ settings.gitlab.test_pipeline.job_stage }}\"\n  image: \"{{ settings.gitlab.test_pipeline.job_image }}\"\n  timeout: \"1h\"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - \"{{ path }}\"\n    {%- endfor %}\n    expire_in: \"1 week\"\n    when: \"always\"\n  variables:\n    PYTEST_EXTRA_FLAGS: \"\"\n  needs:\n    - pipeline: \"$PARENT_PIPELINE_ID\"\n      job: \"build_test_related_apps\"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml \"XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml\"\n      ${PYTEST_EXTRA_FLAGS}",
         "title": "Job Template Jinja",
         "type": "string"
      },
      "job_tags": {
         "default": [],
         "items": {
            "type": "string"
         },
         "title": "Job Tags",
         "type": "array"
      },
      "runs_per_job": {
         "default": 30,
         "title": "Runs Per Job",
         "type": "integer"
      },
      "parent_pipeline_job_suffix": {
         "default": "",
         "title": "Parent Pipeline Job Suffix",
         "type": "string"
      },
      "jobs_jinja": {
         "default": "{% for job in jobs %}\n{{ job['name'] }}:\n  extends:\n    - \"{{ settings.gitlab.test_pipeline.job_template_name }}\"\n    {%- for extra_extend in job.get('extra_extends', []) %}\n    - \"{{ extra_extend }}\"\n    {%- endfor %}\n  tags: {{ job['tags'] }}\n{%- if job['parallel_count'] > 1 %}\n  parallel: {{ job['parallel_count'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job['nodes'] }}\n{% endfor %}",
         "title": "Jobs Jinja",
         "type": "string"
      },
      "pre_yaml_jinja": {
         "default": "",
         "title": "Pre Yaml Jinja",
         "type": "string"
      },
      "yaml_jinja": {
         "default": "{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: \"{{ settings.gitlab.test_pipeline.workflow_name }}\"\n  rules:\n    - when: \"always\"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}",
         "title": "Yaml Jinja",
         "type": "string"
      },
      "yaml_filename": {
         "default": "test_child_pipeline.yml",
         "title": "Yaml Filename",
         "type": "string"
      }
   }
}

Fields:
field job_image: str = 'python:3-slim'

Docker image to use for test jobs.

field job_stage: str = 'test'

Default stage for test jobs in the pipeline.

field job_tags: List[str] = []

Unused. tags are set by test cases.

field job_template_jinja: str = '{{ settings.gitlab.test_pipeline.job_template_name }}:\n  stage: "{{ settings.gitlab.test_pipeline.job_stage }}"\n  image: "{{ settings.gitlab.test_pipeline.job_image }}"\n  timeout: "1h"\n  artifacts:\n    paths:\n    {%- for path in settings.gitlab.artifacts.native.test_job_filepatterns %}\n      - "{{ path }}"\n    {%- endfor %}\n    expire_in: "1 week"\n    when: "always"\n  variables:\n    PYTEST_EXTRA_FLAGS: ""\n  needs:\n    - pipeline: "$PARENT_PIPELINE_ID"\n      job: "build_test_related_apps"\n  before_script:\n    - pip install -U idf-ci\n  script:\n    - eval pytest $nodes\n      --parallel-count ${CI_NODE_TOTAL:-1}\n      --parallel-index ${CI_NODE_INDEX:-1}\n      --junitxml "XUNIT_RESULT_${CI_JOB_NAME_SLUG}.xml"\n      ${PYTEST_EXTRA_FLAGS}'

Default template for CI test jobs.

field job_template_name: str = '.default_test_settings'

Default template name for CI test jobs.

field jobs_jinja: str = '{% for job in jobs %}\n{{ job[\'name\'] }}:\n  extends:\n    - "{{ settings.gitlab.test_pipeline.job_template_name }}"\n    {%- for extra_extend in job.get(\'extra_extends\', []) %}\n    - "{{ extra_extend }}"\n    {%- endfor %}\n  tags: {{ job[\'tags\'] }}\n{%- if job[\'parallel_count\'] > 1 %}\n  parallel: {{ job[\'parallel_count\'] }}\n{%- endif %}\n  variables:\n    nodes: {{ job[\'nodes\'] }}\n{% endfor %}'

Jinja2 template for test jobs configuration.

field runs_per_job: int = 30

Maximum number of test cases to run in a single job.

field workflow_name: str = 'Test Child Pipeline'

Name for the GitLab CI workflow.

field yaml_filename: str = 'test_child_pipeline.yml'

Filename for the test child pipeline YAML file.

field yaml_jinja: str = '{{ settings.gitlab.test_pipeline.pre_yaml_jinja }}\n\nworkflow:\n  name: "{{ settings.gitlab.test_pipeline.workflow_name }}"\n  rules:\n    - when: "always"\n\n{% if settings.gitlab.test_pipeline.job_template_jinja %}\n{{ default_template }}\n{%- endif %}\n\n{{ jobs }}'

Jinja2 template for the test child pipeline YAML content.