jenkins-job-builder/jenkins_jobs/defaults.py
Johannes Carlsson 50dd589966 Fix "abort-builds" for WorkflowMultiBranchProject
"abort-builds" must be present in job_contents_keys in order for it to
properly work.

Also add a multibranch test for the yamlparser that will verify that
this works properly.

Change-Id: Ide9cd0f89a19002977cdcc2dfb9cd873e7d16945
2024-11-19 11:30:35 +01:00

200 lines
4.4 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from dataclasses import dataclass
from .loc_loader import LocDict
from .position import Pos
job_contents_keys = {
# Same as for macros.
"parameters",
"properties",
"builders",
"wrappers",
"triggers",
"publishers",
"scm",
"pipeline-scm",
"reporters",
# General.
"description",
"project-type",
"folder",
"node",
"jdk",
"actions",
"disabled",
"display-name",
"block-downstream",
"block-upstream",
"auth-token",
"concurrent",
"workspace",
"child-workspace",
"quiet-period",
"retry-count",
"logrotate",
"raw",
# Builders.
"prebuilders",
"postbuilders",
# HipChat.
"hipchat",
# Notificatoins.
"notifications",
# project Flow.
"dsl",
"needs-workspace",
"dsl-file",
# GithubOrganization.
"prune-dead-branches",
"days-to-keep",
"number-to-keep",
"periodic-folder-trigger",
"github-org",
"script-path",
# Matrix.
"execution-strategy",
"yaml-strategy",
"p4-strategy",
"axes",
# Maven.
"maven",
"per-module-email",
# WorkflowMultiBranch.
"sandbox",
"script-id",
"script-path",
"prune-dead-branches",
"days-to-keep",
"number-to-keep",
"abort-builds",
"periodic-folder-trigger",
# Pipeline.
"dsl",
"sandbox",
# project Workflow.
"dsl",
"sandbox",
}
view_contents_keys = {
# Common.
"description",
"filter-executors",
"filter-queue",
# All
# <nothing>
# List.
"job-name",
"job-filters",
"width",
"alignment",
"columns",
"regex",
"recurse",
# Sectioned.
"sections",
# SectionedText.
"width",
"alignment",
"text",
"style",
# DeliveryPipeline.
"aggregated-changes-grouping-pattern",
"allow-abort",
"allow-manual-triggers",
"allow-pipeline-start",
"allow-rebuild",
"link-relative",
"link-to-console-log",
"max-number-of-visible-pipelines",
"name",
"no-of-columns",
"no-of-pipelines",
"paging-enabled",
"show-absolute-date-time",
"show-aggregated-changes",
"show-aggregated-pipeline",
"show-avatars",
"show-changes",
"show-description",
"show-promotions",
"show-static-analysis-results",
"show-test-results",
"show-total-build-time",
"update-interval",
"sorting",
"components",
"regexps",
# Nested.
"views",
"default-view",
"columns",
# Pipeline.
"first-job",
"name",
"no-of-displayed-builds",
"title",
"link-style",
"css-Url",
"latest-job-only",
"manual-trigger",
"show-parameters",
"parameters-in-headers",
"start-with-parameters",
"refresh-frequency",
"definition-header",
}
def split_contents_params(data, contents_keys):
contents = data.copy_with(
{key: value for key, value in data.items() if key in contents_keys}
)
params = data.copy_with(
{key: value for key, value in data.items() if key not in contents_keys}
)
return (contents, params)
@dataclass
class Defaults:
name: str
pos: Pos
params: dict
contents: dict # Values that go to job contents.
@classmethod
def add(cls, config, roots, data, pos):
d = data.copy()
name = d.pop_required_loc_string("name")
contents, params = split_contents_params(
d, job_contents_keys | view_contents_keys
)
defaults = cls(name, pos, params, contents)
roots.defaults[name] = defaults
@classmethod
def empty(cls):
return Defaults("empty", pos=None, params={}, contents={})
def merged_with_global(self, global_):
return Defaults(
name=f"{self.name}-merged-with-global",
pos=self.pos,
params=LocDict.merge(global_.params, self.params),
contents=LocDict.merge(global_.contents, self.contents),
)