From d599a162a99e5c2c8f0cf70b069441f0db58737c Mon Sep 17 00:00:00 2001 From: jenkins Date: Tue, 21 Apr 2026 09:35:43 -0300 Subject: [PATCH] monitoring(testing): add branch evidence panels --- ci/scripts/publish_test_metrics.py | 2 + scripts/dashboards_render_atlas.py | 57 +++ services/logging/Jenkinsfile.data-prepper | 4 + .../monitoring/dashboards/atlas-jobs.json | 355 ++++++++++++++++++ .../monitoring/grafana-dashboard-jobs.yaml | 355 ++++++++++++++++++ 5 files changed, 773 insertions(+) diff --git a/ci/scripts/publish_test_metrics.py b/ci/scripts/publish_test_metrics.py index 4dc6ced7..214f0212 100644 --- a/ci/scripts/publish_test_metrics.py +++ b/ci/scripts/publish_test_metrics.py @@ -209,6 +209,8 @@ def _build_payload( "# TYPE titan_iac_quality_gate_run_status gauge", f'titan_iac_quality_gate_run_status{{suite="{suite}",status="ok"}} {1 if status == "ok" else 0}', f'titan_iac_quality_gate_run_status{{suite="{suite}",status="failed"}} {1 if status == "failed" else 0}', + "# TYPE platform_quality_gate_build_info gauge", + f"platform_quality_gate_build_info{build_labels} 1", "# TYPE titan_iac_quality_gate_build_info gauge", f"titan_iac_quality_gate_build_info{build_labels} 1", "# TYPE platform_quality_gate_workspace_line_coverage_percent gauge", diff --git a/scripts/dashboards_render_atlas.py b/scripts/dashboards_render_atlas.py index 9eaa73c4..8f079f16 100644 --- a/scripts/dashboards_render_atlas.py +++ b/scripts/dashboards_render_atlas.py @@ -1138,6 +1138,24 @@ def testing_case_variable(): } +def testing_branch_variable(): + return { + "name": "branch", + "label": "Branch", + "type": "query", + "query": f'label_values(platform_quality_gate_build_info{{suite=~"${{suite:regex}}",{PLATFORM_TEST_EXPORT_FILTER}}}, branch)', + "current": {"text": "All", "value": "$__all", "selected": True}, + "options": [], + "hide": 0, + "multi": False, + "includeAll": True, + "allValue": ".*", + "refresh": 2, + "sort": 1, + "skipUrlSync": False, + } + + def jenkins_base_variable(): return { "name": "jenkins_base", @@ -3020,6 +3038,7 @@ def build_jobs_dashboard(): panels = [] suite_var = "${suite:regex}" test_var = "${test:regex}" + branch_var = "${branch:regex}" success = PLATFORM_TEST_SUCCESS_STATUS exported = PLATFORM_TEST_EXPORT_FILTER runs_selector = f'suite=~"{suite_var}",{exported}' @@ -3031,6 +3050,7 @@ def build_jobs_dashboard(): workspace_coverage_selector = f'suite=~"{suite_var}",{exported}' smell_selector = f'suite=~"{suite_var}",{exported}' test_case_selector = f'suite=~"{suite_var}",test=~"{test_var}",test!="__no_test_cases__",{exported}' + build_info_selector = f'suite=~"{suite_var}",branch=~"{branch_var}",{exported}' suite_universe = " or ".join( f'label_replace(vector(1), "suite", "{suite}", "__name__", ".*")' @@ -3138,6 +3158,12 @@ def build_jobs_dashboard(): "legendFormat": "skipped · {{suite}}", }, ] + recent_branch_evidence = ( + f'sort_desc(count by (suite, branch) (max_over_time(platform_quality_gate_build_info{{{build_info_selector}}}[30d])))' + ) + non_primary_branch_evidence = ( + f'sort_desc(count by (suite, branch) (max_over_time(platform_quality_gate_build_info{{{build_info_selector},branch!~"main|master|origin/main|origin/master|unknown"}}[30d])))' + ) missing_tests_by_suite = ( f'(({suite_universe}) unless on(suite) count by (suite) ({{__name__=~".*_quality_gate_tests_total",{exported}}}))' @@ -3891,6 +3917,36 @@ def build_jobs_dashboard(): decimals=0, ) ) + panels.append( + bargauge_panel( + 149, + "Recent Branch Evidence by Suite (30d)", + recent_branch_evidence, + {"h": 7, "w": 12, "x": 0, "y": 80}, + unit="none", + instant=True, + legend="{{suite}} · {{branch}}", + sort_order="desc", + thresholds=missing_thresholds, + decimals=0, + links=jenkins_suite_links(), + ) + ) + panels.append( + bargauge_panel( + 150, + "Non-Primary Branch Evidence (30d)", + non_primary_branch_evidence, + {"h": 7, "w": 12, "x": 12, "y": 80}, + unit="none", + instant=True, + legend="{{suite}} · {{branch}}", + sort_order="desc", + thresholds=failures_thresholds, + decimals=0, + links=jenkins_suite_links(), + ) + ) return { "uid": "atlas-jobs", @@ -3907,6 +3963,7 @@ def build_jobs_dashboard(): "list": [ testing_suite_variable(), testing_case_variable(), + testing_branch_variable(), jenkins_base_variable(), ] }, diff --git a/services/logging/Jenkinsfile.data-prepper b/services/logging/Jenkinsfile.data-prepper index 20a5e91f..a2ca396a 100644 --- a/services/logging/Jenkinsfile.data-prepper +++ b/services/logging/Jenkinsfile.data-prepper @@ -295,6 +295,8 @@ EOF if [ "${status}" != "ok" ]; then gate_glue_check="failed" fi + metric_branch="$(printf '%s' "${BRANCH_NAME:-${GIT_BRANCH:-unknown}}" | jq -Rsa . | sed -e 's/^"//' -e 's/"$//')" + metric_build_number="$(printf '%s' "${BUILD_NUMBER:-unknown}" | jq -Rsa . | sed -e 's/^"//' -e 's/"$//')" cat </dev/null || \ echo "warning: metrics push failed for suite=${suite}" >&2 # TYPE platform_quality_gate_runs_total counter @@ -309,6 +311,8 @@ data_prepper_quality_gate_tests_total{suite="${suite}",result="skipped"} 0 platform_quality_gate_workspace_line_coverage_percent{suite="${suite}"} 0 # TYPE platform_quality_gate_source_lines_over_500_total gauge platform_quality_gate_source_lines_over_500_total{suite="${suite}"} 0 +# TYPE platform_quality_gate_build_info gauge +platform_quality_gate_build_info{suite="${suite}",branch="${metric_branch}",build_number="${metric_build_number}"} 1 # TYPE data_prepper_quality_gate_checks_total gauge data_prepper_quality_gate_checks_total{suite="${suite}",check="tests",result="not_applicable"} 1 data_prepper_quality_gate_checks_total{suite="${suite}",check="coverage",result="not_applicable"} 1 diff --git a/services/monitoring/dashboards/atlas-jobs.json b/services/monitoring/dashboards/atlas-jobs.json index 11f0eaea..35a7db74 100644 --- a/services/monitoring/dashboards/atlas-jobs.json +++ b/services/monitoring/dashboards/atlas-jobs.json @@ -3339,6 +3339,342 @@ } } ] + }, + { + "id": 149, + "type": "bargauge", + "title": "Recent Branch Evidence by Suite (30d)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 80 + }, + "targets": [ + { + "expr": "sort_desc(count by (suite, branch) (max_over_time(platform_quality_gate_build_info{suite=~\"${suite:regex}\",branch=~\"${branch:regex}\",exported_job=\"platform-quality-ci\"}[30d])))", + "refId": "A", + "legendFormat": "{{suite}} \u00b7 {{branch}}", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "none", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "decimals": 0 + }, + "overrides": [] + }, + "options": { + "displayMode": "gradient", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + } + }, + "links": [ + { + "title": "Open Jenkins", + "url": "${jenkins_base}/", + "targetBlank": true + }, + { + "title": "ariadne: Job", + "url": "${jenkins_base}/job/ariadne/", + "targetBlank": true + }, + { + "title": "ariadne: Last Artifacts", + "url": "${jenkins_base}/job/ariadne/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "metis: Job", + "url": "${jenkins_base}/job/metis/", + "targetBlank": true + }, + { + "title": "metis: Last Artifacts", + "url": "${jenkins_base}/job/metis/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "ananke: Job", + "url": "${jenkins_base}/job/ananke/", + "targetBlank": true + }, + { + "title": "ananke: Last Artifacts", + "url": "${jenkins_base}/job/ananke/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "atlasbot: Job", + "url": "${jenkins_base}/job/atlasbot/", + "targetBlank": true + }, + { + "title": "atlasbot: Last Artifacts", + "url": "${jenkins_base}/job/atlasbot/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "pegasus: Job", + "url": "${jenkins_base}/job/pegasus/", + "targetBlank": true + }, + { + "title": "pegasus: Last Artifacts", + "url": "${jenkins_base}/job/pegasus/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "soteria: Job", + "url": "${jenkins_base}/job/Soteria/", + "targetBlank": true + }, + { + "title": "soteria: Last Artifacts", + "url": "${jenkins_base}/job/Soteria/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "titan_iac: Job", + "url": "${jenkins_base}/job/titan-iac/", + "targetBlank": true + }, + { + "title": "titan_iac: Last Artifacts", + "url": "${jenkins_base}/job/titan-iac/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "bstein_home: Job", + "url": "${jenkins_base}/job/bstein-dev-home/", + "targetBlank": true + }, + { + "title": "bstein_home: Last Artifacts", + "url": "${jenkins_base}/job/bstein-dev-home/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "data_prepper: Job", + "url": "${jenkins_base}/job/data-prepper/", + "targetBlank": true + }, + { + "title": "data_prepper: Last Artifacts", + "url": "${jenkins_base}/job/data-prepper/lastCompletedBuild/artifact/", + "targetBlank": true + } + ], + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] + }, + { + "id": 150, + "type": "bargauge", + "title": "Non-Primary Branch Evidence (30d)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 80 + }, + "targets": [ + { + "expr": "sort_desc(count by (suite, branch) (max_over_time(platform_quality_gate_build_info{suite=~\"${suite:regex}\",branch=~\"${branch:regex}\",exported_job=\"platform-quality-ci\",branch!~\"main|master|origin/main|origin/master|unknown\"}[30d])))", + "refId": "A", + "legendFormat": "{{suite}} \u00b7 {{branch}}", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "none", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "orange", + "value": 3 + }, + { + "color": "red", + "value": 5 + } + ] + }, + "decimals": 0 + }, + "overrides": [] + }, + "options": { + "displayMode": "gradient", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + } + }, + "links": [ + { + "title": "Open Jenkins", + "url": "${jenkins_base}/", + "targetBlank": true + }, + { + "title": "ariadne: Job", + "url": "${jenkins_base}/job/ariadne/", + "targetBlank": true + }, + { + "title": "ariadne: Last Artifacts", + "url": "${jenkins_base}/job/ariadne/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "metis: Job", + "url": "${jenkins_base}/job/metis/", + "targetBlank": true + }, + { + "title": "metis: Last Artifacts", + "url": "${jenkins_base}/job/metis/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "ananke: Job", + "url": "${jenkins_base}/job/ananke/", + "targetBlank": true + }, + { + "title": "ananke: Last Artifacts", + "url": "${jenkins_base}/job/ananke/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "atlasbot: Job", + "url": "${jenkins_base}/job/atlasbot/", + "targetBlank": true + }, + { + "title": "atlasbot: Last Artifacts", + "url": "${jenkins_base}/job/atlasbot/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "pegasus: Job", + "url": "${jenkins_base}/job/pegasus/", + "targetBlank": true + }, + { + "title": "pegasus: Last Artifacts", + "url": "${jenkins_base}/job/pegasus/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "soteria: Job", + "url": "${jenkins_base}/job/Soteria/", + "targetBlank": true + }, + { + "title": "soteria: Last Artifacts", + "url": "${jenkins_base}/job/Soteria/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "titan_iac: Job", + "url": "${jenkins_base}/job/titan-iac/", + "targetBlank": true + }, + { + "title": "titan_iac: Last Artifacts", + "url": "${jenkins_base}/job/titan-iac/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "bstein_home: Job", + "url": "${jenkins_base}/job/bstein-dev-home/", + "targetBlank": true + }, + { + "title": "bstein_home: Last Artifacts", + "url": "${jenkins_base}/job/bstein-dev-home/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "data_prepper: Job", + "url": "${jenkins_base}/job/data-prepper/", + "targetBlank": true + }, + { + "title": "data_prepper: Last Artifacts", + "url": "${jenkins_base}/job/data-prepper/lastCompletedBuild/artifact/", + "targetBlank": true + } + ], + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] } ], "time": { @@ -3442,6 +3778,25 @@ "sort": 1, "skipUrlSync": false }, + { + "name": "branch", + "label": "Branch", + "type": "query", + "query": "label_values(platform_quality_gate_build_info{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}, branch)", + "current": { + "text": "All", + "value": "$__all", + "selected": true + }, + "options": [], + "hide": 0, + "multi": false, + "includeAll": true, + "allValue": ".*", + "refresh": 2, + "sort": 1, + "skipUrlSync": false + }, { "name": "jenkins_base", "label": "Jenkins Base URL", diff --git a/services/monitoring/grafana-dashboard-jobs.yaml b/services/monitoring/grafana-dashboard-jobs.yaml index 5d6e270c..a149788c 100644 --- a/services/monitoring/grafana-dashboard-jobs.yaml +++ b/services/monitoring/grafana-dashboard-jobs.yaml @@ -3348,6 +3348,342 @@ data: } } ] + }, + { + "id": 149, + "type": "bargauge", + "title": "Recent Branch Evidence by Suite (30d)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 80 + }, + "targets": [ + { + "expr": "sort_desc(count by (suite, branch) (max_over_time(platform_quality_gate_build_info{suite=~\"${suite:regex}\",branch=~\"${branch:regex}\",exported_job=\"platform-quality-ci\"}[30d])))", + "refId": "A", + "legendFormat": "{{suite}} \u00b7 {{branch}}", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "none", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "decimals": 0 + }, + "overrides": [] + }, + "options": { + "displayMode": "gradient", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + } + }, + "links": [ + { + "title": "Open Jenkins", + "url": "${jenkins_base}/", + "targetBlank": true + }, + { + "title": "ariadne: Job", + "url": "${jenkins_base}/job/ariadne/", + "targetBlank": true + }, + { + "title": "ariadne: Last Artifacts", + "url": "${jenkins_base}/job/ariadne/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "metis: Job", + "url": "${jenkins_base}/job/metis/", + "targetBlank": true + }, + { + "title": "metis: Last Artifacts", + "url": "${jenkins_base}/job/metis/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "ananke: Job", + "url": "${jenkins_base}/job/ananke/", + "targetBlank": true + }, + { + "title": "ananke: Last Artifacts", + "url": "${jenkins_base}/job/ananke/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "atlasbot: Job", + "url": "${jenkins_base}/job/atlasbot/", + "targetBlank": true + }, + { + "title": "atlasbot: Last Artifacts", + "url": "${jenkins_base}/job/atlasbot/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "pegasus: Job", + "url": "${jenkins_base}/job/pegasus/", + "targetBlank": true + }, + { + "title": "pegasus: Last Artifacts", + "url": "${jenkins_base}/job/pegasus/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "soteria: Job", + "url": "${jenkins_base}/job/Soteria/", + "targetBlank": true + }, + { + "title": "soteria: Last Artifacts", + "url": "${jenkins_base}/job/Soteria/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "titan_iac: Job", + "url": "${jenkins_base}/job/titan-iac/", + "targetBlank": true + }, + { + "title": "titan_iac: Last Artifacts", + "url": "${jenkins_base}/job/titan-iac/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "bstein_home: Job", + "url": "${jenkins_base}/job/bstein-dev-home/", + "targetBlank": true + }, + { + "title": "bstein_home: Last Artifacts", + "url": "${jenkins_base}/job/bstein-dev-home/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "data_prepper: Job", + "url": "${jenkins_base}/job/data-prepper/", + "targetBlank": true + }, + { + "title": "data_prepper: Last Artifacts", + "url": "${jenkins_base}/job/data-prepper/lastCompletedBuild/artifact/", + "targetBlank": true + } + ], + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] + }, + { + "id": 150, + "type": "bargauge", + "title": "Non-Primary Branch Evidence (30d)", + "datasource": { + "type": "prometheus", + "uid": "atlas-vm" + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 80 + }, + "targets": [ + { + "expr": "sort_desc(count by (suite, branch) (max_over_time(platform_quality_gate_build_info{suite=~\"${suite:regex}\",branch=~\"${branch:regex}\",exported_job=\"platform-quality-ci\",branch!~\"main|master|origin/main|origin/master|unknown\"}[30d])))", + "refId": "A", + "legendFormat": "{{suite}} \u00b7 {{branch}}", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "unit": "none", + "min": 0, + "max": null, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "orange", + "value": 3 + }, + { + "color": "red", + "value": 5 + } + ] + }, + "decimals": 0 + }, + "overrides": [] + }, + "options": { + "displayMode": "gradient", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + } + }, + "links": [ + { + "title": "Open Jenkins", + "url": "${jenkins_base}/", + "targetBlank": true + }, + { + "title": "ariadne: Job", + "url": "${jenkins_base}/job/ariadne/", + "targetBlank": true + }, + { + "title": "ariadne: Last Artifacts", + "url": "${jenkins_base}/job/ariadne/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "metis: Job", + "url": "${jenkins_base}/job/metis/", + "targetBlank": true + }, + { + "title": "metis: Last Artifacts", + "url": "${jenkins_base}/job/metis/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "ananke: Job", + "url": "${jenkins_base}/job/ananke/", + "targetBlank": true + }, + { + "title": "ananke: Last Artifacts", + "url": "${jenkins_base}/job/ananke/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "atlasbot: Job", + "url": "${jenkins_base}/job/atlasbot/", + "targetBlank": true + }, + { + "title": "atlasbot: Last Artifacts", + "url": "${jenkins_base}/job/atlasbot/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "pegasus: Job", + "url": "${jenkins_base}/job/pegasus/", + "targetBlank": true + }, + { + "title": "pegasus: Last Artifacts", + "url": "${jenkins_base}/job/pegasus/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "soteria: Job", + "url": "${jenkins_base}/job/Soteria/", + "targetBlank": true + }, + { + "title": "soteria: Last Artifacts", + "url": "${jenkins_base}/job/Soteria/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "titan_iac: Job", + "url": "${jenkins_base}/job/titan-iac/", + "targetBlank": true + }, + { + "title": "titan_iac: Last Artifacts", + "url": "${jenkins_base}/job/titan-iac/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "bstein_home: Job", + "url": "${jenkins_base}/job/bstein-dev-home/", + "targetBlank": true + }, + { + "title": "bstein_home: Last Artifacts", + "url": "${jenkins_base}/job/bstein-dev-home/lastCompletedBuild/artifact/", + "targetBlank": true + }, + { + "title": "data_prepper: Job", + "url": "${jenkins_base}/job/data-prepper/", + "targetBlank": true + }, + { + "title": "data_prepper: Last Artifacts", + "url": "${jenkins_base}/job/data-prepper/lastCompletedBuild/artifact/", + "targetBlank": true + } + ], + "transformations": [ + { + "id": "sortBy", + "options": { + "fields": [ + "Value" + ], + "order": "desc" + } + } + ] } ], "time": { @@ -3451,6 +3787,25 @@ data: "sort": 1, "skipUrlSync": false }, + { + "name": "branch", + "label": "Branch", + "type": "query", + "query": "label_values(platform_quality_gate_build_info{suite=~\"${suite:regex}\",exported_job=\"platform-quality-ci\"}, branch)", + "current": { + "text": "All", + "value": "$__all", + "selected": true + }, + "options": [], + "hide": 0, + "multi": false, + "includeAll": true, + "allValue": ".*", + "refresh": 2, + "sort": 1, + "skipUrlSync": false + }, { "name": "jenkins_base", "label": "Jenkins Base URL",