Skip to content

Commit 32ea392

Browse files
authored
AzLocal.UpdateManagement v0.8.7 - on-prem solution-update sideloading automation (5 new cmdlets, Step.6 pipeline, de-numbered filenames) (#76)
* v0.8.7 sideload Group A: auth-map + catalog parsers, catalog helper, tag const, examples * v0.8.7 sideload Group B: extract Select-AzLocalNextUpdateForCluster (behaviour-preserving) + reuse in Start-AzLocalClusterUpdate * v0.8.7 sideload Group C: KV credential resolver + media download/cache helper (Solution download/verify, SBE staged-folder, atomic concurrent-safe cache) * v0.8.7 sideload Group D: shared-state model + stale-heartbeat detection, import-share target resolver, detached robocopy worker script + scheduled-task register/cleanup * v0.8.7 sideload Group E: WinRM session factory (HTTPS 5986 default), remote SHA256 verify, remote solution import (Expand-Archive/Add-SolutionUpdate/Get-SolutionUpdate poll + SBE AdditionalContentRequired) * v0.8.7 Group F: sideload public cmdlets (plan, state machine, status report) * v0.8.7 Group R: renumber pipelines for sideload (apply->7, monitor->8, fleet-update->9, fleet-health->10) Vacates Step.6 for the upcoming on-prem sideload pipeline (Group G). Renames the 8 GH/ADO YAMLs via git mv and updates all current-state references across .ps1 source, Pester tests, the schedule example YAML, the module README, and operator docs (Automation-Pipeline-Examples README + appendix-pipelines). Immutable historical changelog/release-history entries preserved; one-level 'formerly Step.N' annotations shifted; multi-level history chains appended (not mutated). Module imports clean (60 commands), no parse errors. * v0.8.7 Group S: Step.1/Step.2 sideload-aware UpdateAuthAccountId tag Step.1 (Get-/Invoke-AzLocalClusterInventory): opt-in -IncludeSideloadColumns switch (auto-resolved from SIDELOAD_UPDATES repo var) exports a numeric UpdateAuthAccountId column before ResourceId in cluster-inventory CSV/JSON. Step.2 (Set-AzLocalClusterUpdateRingTag): new -UpdateAuthAccountIdValue param (ByResourceId) + UpdateAuthAccountId CSV column handling, validated ^\d{1,3}$ (invalid -> per-cluster Failed), written via existing merge-tags PATCH. Byte-identical output when SIDELOAD_UPDATES is unset/false (column omitted, tag not required). Module imports clean (60 commands). * AzLocal.UpdateManagement: Group G - Step.6 sideload pipelines + Step.3 sideload advisor - New Automation-Pipeline-Examples/{github-actions,azure-devops}/Step.6_sideload-updates.yml: opt-in, self-hosted runner/agent (label/demand azlocal-sideload), re-entrant state-machine, no default schedule, master gate SIDELOAD_UPDATES=='true', KV auth via OIDC (GH) / federated SP (ADO). - Export-AzLocalApplyUpdatesScheduleAudit: new -SideloadEnabled / -SideloadLeadDays params and a 'Recommended sideload schedule (Step.6 - opt-in)' section that derives a per-apply-window kickoff cron (apply firing shifted back LeadDays) plus the */30 poll cron. Gated on param override -> SIDELOAD_UPDATES env. - FIX: local accumulator renamed to \; PowerShell vars are case-insensitive so \ aliased the [bool]\ param and clobbered it to \False (explicit -SideloadEnabled \True rendered nothing). - Step.3 apply-updates-schedule-audit.yml (GH+ADO): wire SIDELOAD_UPDATES / SIDELOAD_LEAD_DAYS env/vars through to the audit step. * AzLocal.UpdateManagement: Group P - de-number pipeline filenames + rename-aware Update Breaking change (no consumers yet): drop the Step.N_ prefix from all bundled pipeline example filenames so renames/renumbering no longer strand customer CRONs. Pipelines are now matched to their destination by a stable logical ID. - Add Private/Get-AzLocalPipelineManifest.ps1: 11-row manifest mapping each logical pipeline Id -> canonical FileName, DisplayStep, IntroducedIn, and legacy Step.N_*.yml Aliases (post-R and pre-R names for the 4 renumbered ones). - Add Private/Get-AzLocalPipelineId.ps1: parse the AZLOCAL-PIPELINE-ID header comment from a YAML body. - Register both privates in the .psd1 NestedModules. - Rename 22 example YAMLs (GH + ADO) dropping Step.N_ prefix; prepend the AZLOCAL-PIPELINE-ID header comment as line 1. Display names/artifacts inside the YAML keep Step.N labels (intentional). - Update-AzLocalPipelineExample: match destination files by logical ID (canonical name -> embedded ID -> legacy alias filename), rename matched files to the canonical name while preserving BEGIN/END-AZLOCAL-CUSTOMIZE bodies (e.g. schedule CRONs), and emit a new RenamedFrom output field plus rename/platform-implication warnings. Updated .DESCRIPTION + OUTPUTS docs. - Read-AzLocalApplyUpdatesYamlCrons: switch directory discovery to ID-based matching (ID == apply-updates), with a name fallback that explicitly EXCLUDES the de-numbered apply-updates-schedule-audit.yml sibling so its poll crons are never mistaken for apply-updates windows. - Update advisor + doc-comment filename references to the de-numbered names. * AzLocal.UpdateManagement: Group H1a - de-number pipeline filename refs in current-state docs De-numbered Step.N_ filename references in current-state docs (Automation README + appendix-pipelines, module README body, cmdlet-reference, rbac) to match the Group P file renames. Left Step.N display labels, #step-N anchors, and all historical records (CHANGELOG, release-history, README Release History appendix, ITSM planning docs) untouched. Also removed 4 stray untracked numbered duplicate YAMLs left by an earlier Update/test run. * AzLocal.UpdateManagement: Group H1b - sideload (Step.6) docs + table/appendix entry Added the missing Step.6 sideload row to the section-1 pipeline table, a full Step 6 reference section in appendix-pipelines.md, and two new docs (sideload.md architecture/runbook + sideload-robocopy.md throttling). Updated pipeline count nine/ten -> eleven and fixed the section 1.1 naming explanation to reflect de-numbered filenames. * Group H3 - v0.8.7 version bump (sideload Step.6 + de-numbered filenames) psd1/psm1 ModuleVersion 0.8.6->0.8.7; ReleaseNotes prepend v0.8.7 (4959 chars); 55->60 export count; CHANGELOG + README What's New + release-history pointer; GENERATED_AGAINST_MODULE_VERSION 0.8.6->0.8.7 across all 22 bundled pipeline templates; Tests version + function-count (55->60) assertions. * Group H2 - Pester de-number filename literals + sideload tests + 60-func assertion Updated all test filename literals from Step.N_*.yml to de-numbered names (glob filters, ForEach paths, banner/Node24/smoke/calendar/copy/update tests); added the 5 v0.8.7 sideload cmdlets to the expected-functions list; bumped both function-count assertions 55->60; de-numbered the Ring CRON calendar column header to '(apply-updates pipeline)' in the cmdlet + audit doc + 3 tests; added the Node24 opt-in to sideload-updates.yml (GH). Full suite: 1070 passed, 0 failed, 1 skipped. * AzLocal.UpdateManagement: add mock-based Pester tests for v0.8.7 sideload cmdlets Adds 18 behaviour tests covering the 5 new on-prem sideloading public cmdlets: Update-AzLocalSideloadCatalog (offline HTML parse + SBE-preserving merge + WhatIf no-write), Resolve-AzLocalSideloadPlan (UnknownAuthAccountId, due/Planned with catalog, NoCatalogEntry), Invoke-AzLocalSideloadUpdate state machine (Skip/Start/Imported/InProgress/stale-Failed/Copied-import/Error), Export-AzLocalSideloadStatusReport (markdown+JUnit, Failed flagging, plan-error rows, OutputPath file writes), and Add-AzLocalSideloadStepSummary (delegates to report + step summary). Full suite: 1088 passed, 0 failed, 1 skipped. * AzLocal.UpdateManagement: Step.7 monitor CurrentStep now shows deepest active step, not 'Start update' wrapper Format-AzLocalUpdateRun (and the duplicate logic in Get-AzLocalFleetStatusData) selected CurrentStep from the TOP-LEVEL progress.steps array only. Azure Local nests a coarse wrapper step ('Start update') that stays InProgress for the entire run, so CurrentStep always rendered 'Start update' in the in-flight monitor. Now both paths reuse Get-DeepestActiveStep to walk to the deepest InProgress/Error/Failed leaf (preserving the (FAILED) suffix), matching CurrentStepDetail / Get-CurrentStepPath and the standard update-progress output. Adds 2 Format-AzLocalUpdateRun regression tests. * AzLocal.UpdateManagement: document CurrentStep deepest-step fix in CHANGELOG + README (v0.8.7) * v0.8.7: config/ standardization + sideload catalog schema framework + Step.6 smoke coverage + test timing ledger * v0.8.7: fix strict-mode 'CurrentState cannot be found' in JUnit export on UpdateStarted rows
1 parent 348c9c5 commit 32ea392

87 files changed

Lines changed: 6288 additions & 609 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

AzLocal.UpdateManagement/Automation-Pipeline-Examples/README.md

Lines changed: 123 additions & 124 deletions
Large diffs are not rendered by default.

AzLocal.UpdateManagement/Automation-Pipeline-Examples/apply-updates-schedule.example.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# This is the single source of truth for "which UpdateRing(s) is/are
66
# eligible to apply updates on a given UTC date". It is consumed by:
77
#
8-
# * Step.6_apply-updates.yml - reads it at every cron firing and
8+
# * Step.7_apply-updates.yml - reads it at every cron firing and
99
# resolves the UpdateRingValue (and,
1010
# schema v2+, the AllowedUpdateVersions
1111
# allow-list) to use for that run.
@@ -59,13 +59,13 @@ cycleAnchorYear: 2026
5959

6060
# ---- AllowedUpdateVersions (schema v2, MANDATORY top-level) -------
6161
# >>> ALLOWED-UPDATE-VERSIONS-V2 <<<
62-
# Fleet-wide allow-list of Azure Local update identifiers that Step.6
62+
# Fleet-wide allow-list of Azure Local update identifiers that Step.7
6363
# (apply-updates) is permitted to install.
6464
#
6565
# Default 'Latest' (case-insensitive) is a reserved sentinel meaning
6666
# 'no constraint - install the latest Ready update on each cluster'
6767
# (the historic v0.7.88 default). Leave it as 'Latest' to keep that
68-
# behaviour. When set to an explicit list, Step.6 only installs
68+
# behaviour. When set to an explicit list, Step.7 only installs
6969
# updates whose `name` OR `properties.version` is an EXACT
7070
# (case-insensitive) match for one of the entries. If a cluster has
7171
# no Ready update that matches, that cluster is SKIPPED with status
@@ -98,7 +98,7 @@ cycleAnchorYear: 2026
9898
# customer ask in v0.7.89): install ONLY the YY04 + YY10 feature
9999
# updates plus the cumulative updates immediately preceding each
100100
# feature update (YY03 + YY09). With v2 schema you list those four
101-
# update names here once and Step.6 ignores every other 'Ready'
101+
# update names here once and Step.7 ignores every other 'Ready'
102102
# update. Example using real Azure Local update names:
103103
# allowedUpdateVersions: 'Solution12.2603.1002.15;Solution12.2604.1003.1005;Solution12.2609.1002.XX;Solution12.2610.1003.XX'
104104
#

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.3_apply-updates-schedule-audit.yml renamed to AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/apply-updates-schedule-audit.yml

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
1+
# AZLOCAL-PIPELINE-ID: apply-updates-schedule-audit
12
# Step.3 - Apply-Updates Schedule Coverage Audit Pipeline
23
# This pipeline runs the read-only Test-AzLocalApplyUpdatesScheduleCoverage advisor
34
# weekly to detect drift between the cron schedule(s) in your apply-updates pipeline
45
# YAML and the UpdateStartWindow tags that operators have placed on Azure Local clusters.
56
#
67
# WHY THIS PIPELINE EXISTS
78
# ------------------------
8-
# Step.6_apply-updates.yml ships with NO default schedule (trigger:none) on purpose, so
9+
# Step.7_apply-updates.yml ships with NO default schedule (trigger:none) on purpose, so
910
# customers must consciously choose when updates fire. After you have configured
10-
# UpdateStartWindow tags on your clusters and added cron entries to Step.6_apply-updates.yml, this
11+
# UpdateStartWindow tags on your clusters and added cron entries to Step.7_apply-updates.yml, this
1112
# pipeline is the safety net that catches:
12-
# - a new ring tagged with UpdateStartWindow that no cron in Step.6_apply-updates.yml will reach
13+
# - a new ring tagged with UpdateStartWindow that no cron in Step.7_apply-updates.yml will reach
1314
# - an UpdateStartWindow tag value that fails to parse (typo / wrong syntax)
14-
# - Step.6_apply-updates.yml cron entries that the advisor cannot reason about
15+
# - Step.7_apply-updates.yml cron entries that the advisor cannot reason about
1516
# (DayOfMonth restrictions, step values) so you can audit them manually
1617
#
1718
# REPORTS GENERATED:
@@ -43,14 +44,14 @@ schedules:
4344

4445
parameters:
4546
- name: pipelinePath
46-
displayName: 'Path (file or folder) to Step.6_apply-updates.yml to audit, repo-relative. REQUIRED so the Recommend view can diff its proposed crons against what is already present in Step.6 and only emit a snippet for the truly missing entries. Default `.azure-pipelines` matches the standard Azure DevOps consumer layout; for repos that keep Step.6_apply-updates.yml at the repo root pass `.`'
47+
displayName: 'Path (file or folder) to Step.7_apply-updates.yml to audit, repo-relative. REQUIRED so the Recommend view can diff its proposed crons against what is already present in Step.7 and only emit a snippet for the truly missing entries. Default `.azure-pipelines` matches the standard Azure DevOps consumer layout; for repos that keep Step.7_apply-updates.yml at the repo root pass `.`'
4748
type: string
4849
default: '.azure-pipelines'
4950

5051
- name: schedulePath
5152
displayName: 'Path to apply-updates-schedule.yml. When set, the audit also reports RingMissingFromSchedule (fleet ring with no schedule row) and RingOrphanedInSchedule (schedule ring no cluster carries). Leave empty to skip the schedule-file two-way diff.'
5253
type: string
53-
default: './apply-updates-schedule.yml'
54+
default: './config/apply-updates-schedule.yml'
5455

5556
- name: leadTimeMinutes
5657
displayName: 'Minutes before UpdateStartWindow opens that the pipeline should fire (0-60)'
@@ -86,9 +87,14 @@ parameters:
8687
default: false
8788

8889
variables:
89-
GENERATED_AGAINST_MODULE_VERSION: '0.8.6'
90+
GENERATED_AGAINST_MODULE_VERSION: '0.8.7'
9091
REQUIRED_MODULE_VERSION: '${{ parameters.moduleVersion }}'
9192
reportsPath: '$(Build.ArtifactStagingDirectory)/reports'
93+
# v0.8.7 sideload advisor defaults. Override at the pipeline / variable-group
94+
# level (set SIDELOAD_UPDATES=true to enable the recommended-sideload-schedule
95+
# section). Defaults keep the audit byte-identical to v0.8.6 when unset.
96+
SIDELOAD_UPDATES: 'false'
97+
SIDELOAD_LEAD_DAYS: '7'
9298

9399
stages:
94100
- stage: ScheduleCoverage
@@ -156,6 +162,10 @@ stages:
156162
INPUT_DEBUG: ${{ lower(parameters.debug) }}
157163
INSTALLED_MODULE_VERSION: $(moduleVersion.installed_module_version)
158164
REPORTS_PATH: $(reportsPath)
165+
# v0.8.7 sideload advisor (opt-in). When SIDELOAD_UPDATES=true the audit
166+
# appends a "Recommended sideload schedule" section. Inert when unset/false.
167+
SIDELOAD_UPDATES: $(SIDELOAD_UPDATES)
168+
SIDELOAD_LEAD_DAYS: $(SIDELOAD_LEAD_DAYS)
159169
inputs:
160170
# Replace with your service connection name
161171
azureSubscription: 'AzureLocal-ServiceConnection' # Update with your service connection name

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.6_apply-updates.yml renamed to AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/apply-updates.yml

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
# Step.6 - Apply Updates to Azure Local Clusters
1+
# AZLOCAL-PIPELINE-ID: apply-updates
2+
# Step.7 - Apply Updates to Azure Local Clusters
23
# This pipeline applies updates to clusters filtered by UpdateRing tag value
34

45
# BEGIN-AZLOCAL-CUSTOMIZE:schedule-triggers
56
# PREFERRED PATTERN - drive automated update runs from a ring-aware
6-
# schedule file (apply-updates-schedule.yml at the repo root by default),
7+
# schedule file (config/apply-updates-schedule.yml by default),
78
# not from per-window crons.
89
#
910
# How it works:
@@ -20,7 +21,7 @@
2021
# New-AzLocalApplyUpdatesScheduleConfig.
2122
#
2223
# Generate a STRAWMAN schedule file from your fleet via:
23-
# New-AzLocalApplyUpdatesScheduleConfig -OutputPath .\apply-updates-schedule.yml
24+
# New-AzLocalApplyUpdatesScheduleConfig -OutputPath .\config\apply-updates-schedule.yml
2425
# Every row is commented out by default - review and uncomment to activate.
2526
#
2627
# Concurrency: ADO has no first-class YAML concurrency block; use Pipeline
@@ -114,18 +115,20 @@ variables:
114115
# log if the YAML appears stale - prompting you to refresh via
115116
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
116117
- name: GENERATED_AGAINST_MODULE_VERSION
117-
value: '0.8.6'
118+
value: '0.8.7'
118119
# Resolution order for the module version pin (leave all unset to install the latest,
119120
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
120121
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).
121122
- name: REQUIRED_MODULE_VERSION
122123
value: '${{ parameters.moduleVersion }}'
123124
# Path to the ring-aware apply-updates-schedule.yml (relative to repo
124125
# root). The 'Resolve UpdateRing from schedule' task reads this file when
125-
# $(Build.Reason)='Schedule'. Override at queue time if you keep the schedule
126-
# outside the repo root.
126+
# $(Build.Reason)='Schedule'. Default 'config/apply-updates-schedule.yml'
127+
# matches where Copy-AzLocalPipelineExample drops the starter, alongside
128+
# config/ClusterUpdateRings.csv. Override at queue time if you keep the
129+
# schedule elsewhere.
127130
- name: APPLY_UPDATES_SCHEDULE_PATH
128-
value: './apply-updates-schedule.yml'
131+
value: './config/apply-updates-schedule.yml'
129132
# ITSM connector. Uncomment the group reference once you
130133
# have created a variable group named 'AzureLocal-ITSM-Secrets' containing:
131134
# ITSM_SN_INSTANCE_URL, ITSM_SN_CLIENT_ID, ITSM_SN_CLIENT_SECRET
@@ -230,7 +233,7 @@ stages:
230233
displayName: 'Publish Readiness Report'
231234
inputs:
232235
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
233-
ArtifactName: 'azlocal-step.6-apply-updates-readiness-report_$(stamp.artifactStamp)'
236+
ArtifactName: 'azlocal-step.7-apply-updates-readiness-report_$(stamp.artifactStamp)'
234237
publishLocation: 'Container'
235238

236239
# Stage 2: Apply Updates (with approval gate for production)
@@ -324,7 +327,7 @@ stages:
324327
source: 'current'
325328
# artifact name now carries a UTC timestamp - rebuild via the
326329
# readinessArtifactStamp variable mapped from the CheckReadiness stage.
327-
artifact: 'azlocal-step.6-apply-updates-readiness-report_$(readinessArtifactStamp)'
330+
artifact: 'azlocal-step.7-apply-updates-readiness-report_$(readinessArtifactStamp)'
328331
path: '$(Build.ArtifactStagingDirectory)'
329332

330333
# v0.8.5 thin-YAML - readiness-gated apply via shared helper. Validates
@@ -379,7 +382,7 @@ stages:
379382
displayName: 'Publish Update Logs'
380383
inputs:
381384
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
382-
ArtifactName: 'azlocal-step.6-apply-updates-logs_$(stamp.artifactStamp)'
385+
ArtifactName: 'azlocal-step.7-apply-updates-logs_$(stamp.artifactStamp)'
383386
publishLocation: 'Container'
384387

385388
- task: PublishTestResults@2
@@ -447,7 +450,7 @@ stages:
447450
condition: and(always(), eq('${{ parameters.raiseItsmTicket }}', 'true'))
448451
inputs:
449452
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
450-
ArtifactName: 'azlocal-step.6-apply-updates-itsm-results_$(stamp.artifactStamp)'
453+
ArtifactName: 'azlocal-step.7-apply-updates-itsm-results_$(stamp.artifactStamp)'
451454
publishLocation: 'Container'
452455
continueOnError: true
453456

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.5_assess-update-readiness.yml renamed to AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/assess-update-readiness.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
# AZLOCAL-PIPELINE-ID: assess-update-readiness
12
# Step.5 - Assess Update Readiness (Pre-flight go/no-go gate)
23
# --------------------------------------------------
34
# Runs Get-AzLocalClusterUpdateReadiness and Test-AzLocalClusterHealth -BlockingOnly
4-
# against a target UpdateRing (or the whole fleet) BEFORE Step.6_apply-updates.yml runs.
5+
# against a target UpdateRing (or the whole fleet) BEFORE Step.7_apply-updates.yml runs.
56
#
67
# Publishes two JUnit XML diagnostic results to the Azure DevOps Tests tab:
78
# - readiness.xml (one test per cluster; fails if ReadyForUpdate = $false)
@@ -14,7 +15,7 @@
1415
# does NOT block downstream runs. In large fleets, day-to-day environmental issues
1516
# (transient storage noise, a single node out, etc.) routinely affect a small subset of
1617
# clusters; blocking the entire wave for one unhealthy cluster is rarely the desired
17-
# behavior. Step.6_apply-updates.yml is itself per-cluster scoped, so clusters that are not
18+
# behavior. Step.7_apply-updates.yml is itself per-cluster scoped, so clusters that are not
1819
# ready will simply no-op there too.
1920
#
2021
# If you want a hard pass/fail signal for a chained gate, read the output variables
@@ -69,7 +70,7 @@ variables:
6970
# the version actually installed and to the latest on PSGallery, and emits a warning
7071
# log if the YAML appears stale - prompting you to refresh via
7172
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
72-
GENERATED_AGAINST_MODULE_VERSION: '0.8.6'
73+
GENERATED_AGAINST_MODULE_VERSION: '0.8.7'
7374
# Resolution order for the module version pin (leave all unset to install the latest,
7475
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
7576
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.0_authentication-test.yml renamed to AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/authentication-test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# AZLOCAL-PIPELINE-ID: authentication-test
12
# Step.0 - Authentication Validation and Subscription Scope Report
23
#
34
# PURPOSE:
@@ -59,7 +60,7 @@ variables:
5960
# log if the YAML appears stale - prompting you to refresh via
6061
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
6162
- name: GENERATED_AGAINST_MODULE_VERSION
62-
value: '0.8.6'
63+
value: '0.8.7'
6364
# Resolution order for the module version pin (leave all unset to install the latest,
6465
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
6566
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.4_fleet-connectivity-status.yml renamed to AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/fleet-connectivity-status.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# AZLOCAL-PIPELINE-ID: fleet-connectivity-status
12
# Step.4 - Fleet Connectivity Status Monitoring Pipeline
23
# This pipeline surfaces network-connectivity issues across every Azure Local
34
# cluster the service connection can read - four scopes in one pipeline:
@@ -12,7 +13,7 @@
1213
# - Find clusters where Arc agent or ARB has dropped off and updates / management calls will fail
1314
# - Catch Disconnected physical NICs that still have a real IP (likely cable / driver / port issues -
1415
# Disconnected adapters with no IP or APIPA self-assignment are intentionally excluded as noise)
15-
# - Triage hand-off into ITSM (wired identically to Step.8 / Step.9 - opt-in via parameter)
16+
# - Triage hand-off into ITSM (wired identically to Step.9 / Step.10 - opt-in via parameter)
1617
#
1718
# REPORTS GENERATED:
1819
# - Pipeline run summary (uploaded via ##vso[task.uploadsummary]): one section per
@@ -56,7 +57,7 @@ name: Step.4 - Fleet Connectivity Status
5657
trigger: none # Manual or scheduled only
5758

5859
schedules:
59-
# Daily at 05:30 UTC - offset 30 min ahead of Step.8 (06:00) and Step.9 (07:00)
60+
# Daily at 05:30 UTC - offset 30 min ahead of Step.9 (06:00) and Step.10 (07:00)
6061
# so the three fleet-scope read pipelines stagger their ARG calls.
6162
- cron: '30 5 * * *'
6263
displayName: 'Daily Fleet Connectivity Check'
@@ -109,7 +110,7 @@ variables:
109110
# the version actually installed and to the latest on PSGallery, and emits a warning
110111
# log if the YAML appears stale - prompting you to refresh via
111112
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
112-
GENERATED_AGAINST_MODULE_VERSION: '0.8.6'
113+
GENERATED_AGAINST_MODULE_VERSION: '0.8.7'
113114
# Resolution order for the module version pin (leave all unset to install the latest,
114115
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
115116
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).
@@ -121,7 +122,7 @@ variables:
121122
# named 'AzureLocal-ITSM-Secrets'. ADO does not allow mixing mapping-form
122123
# variables with '- group:' entries in the same block, so to enable the
123124
# group reference convert this entire 'variables:' block to list form (see
124-
# Step.9 for the conversion recipe). When raiseItsmTicket=false the Raise
125+
# Step.10 for the conversion recipe). When raiseItsmTicket=false the Raise
125126
# ITSM task is skipped and the secrets are not consulted.
126127

127128
stages:
@@ -228,7 +229,7 @@ stages:
228229
# ----------------------------------------------------------------------
229230
# ITSM Connector (ServiceNow auto-raise on connectivity failures)
230231
# Opt-in (gated on parameters.raiseItsmTicket == true). Mirrors the
231-
# Step.8 / Step.9 wiring - reads the JUnit file produced above, uses
232+
# Step.9 / Step.10 wiring - reads the JUnit file produced above, uses
232233
# the same azurelocal-itsm.yml trigger matrix, same dedupe key.
233234
# ----------------------------------------------------------------------
234235
- task: PowerShell@2

AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/Step.9_fleet-health-status.yml renamed to AzLocal.UpdateManagement/Automation-Pipeline-Examples/azure-devops/fleet-health-status.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# Step.9 - Fleet Health Status Monitoring Pipeline
1+
# AZLOCAL-PIPELINE-ID: fleet-health-status
2+
# Step.10 - Fleet Health Status Monitoring Pipeline
23
# This pipeline surfaces 24-hour system health-check failures across every Azure Local
34
# cluster the service connection can read - including clusters that are already
45
# "up to date" with no available updates. The 24-hour health checks continue to run
@@ -104,7 +105,7 @@ variables:
104105
# the version actually installed and to the latest on PSGallery, and emits a warning
105106
# log if the YAML appears stale - prompting you to refresh via
106107
# Copy-AzLocalPipelineExample -Update. See Automation-Pipeline-Examples/README.md section 5.
107-
GENERATED_AGAINST_MODULE_VERSION: '0.8.6'
108+
GENERATED_AGAINST_MODULE_VERSION: '0.8.7'
108109
# Resolution order for the module version pin (leave all unset to install the latest,
109110
# which is the default "fix-forward" behaviour): queue-time parameter > pipeline variable
110111
# 'REQUIRED_MODULE_VERSION' overridden at queue time > empty (latest).
@@ -217,7 +218,7 @@ stages:
217218
condition: always()
218219
inputs:
219220
PathtoPublish: '$(reportsPath)'
220-
ArtifactName: 'azlocal-step.9-fleet-health-status-report_$(stamp.artifactStamp)'
221+
ArtifactName: 'azlocal-step.10-fleet-health-status-report_$(stamp.artifactStamp)'
221222
publishLocation: 'Container'
222223

223224
# Publish JUnit test results LAST so the Test Results tab is populated but the
@@ -321,7 +322,7 @@ stages:
321322
condition: and(always(), eq('${{ parameters.raiseItsmTicket }}', 'true'))
322323
inputs:
323324
PathtoPublish: '$(reportsPath)'
324-
ArtifactName: 'azlocal-step.9-fleet-health-status-itsm-results_$(stamp.artifactStamp)'
325+
ArtifactName: 'azlocal-step.10-fleet-health-status-itsm-results_$(stamp.artifactStamp)'
325326
publishLocation: 'Container'
326327
continueOnError: true
327328

@@ -331,5 +332,5 @@ stages:
331332
inputs:
332333
testResultsFormat: 'JUnit'
333334
testResultsFiles: '$(reportsPath)/itsm-results.xml'
334-
testRunTitle: 'ITSM Tickets (Step.9) - $(Build.BuildNumber)'
335+
testRunTitle: 'ITSM Tickets (Step.10) - $(Build.BuildNumber)'
335336
failTaskOnFailedTests: false

0 commit comments

Comments
 (0)