Skip to content

feat: Automate reviewed SynapseML-to-Fabric releases - #2628

Open
Rana Singh (ranadeepsingh) wants to merge 13 commits into
microsoft:masterfrom
ranadeepsingh:release-automation-plan
Open

feat: Automate reviewed SynapseML-to-Fabric releases#2628
Rana Singh (ranadeepsingh) wants to merge 13 commits into
microsoft:masterfrom
ranadeepsingh:release-automation-plan

Conversation

@ranadeepsingh

@ranadeepsingh Rana Singh (ranadeepsingh) commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

What

Turns the SynapseML-to-Fabric release into a reviewed, fail-closed flow driven
by one release matrix. A release engineer provides the OSS version, optional
Internal super-patch, selected targets, and any immutable-package rebuild
counters; the tooling derives the tags, Maven coordinates, pip/UPack versions,
pipeline commands, and BBC-VHD values without retyping incompatible naming
conventions.

This complements #2540: that PR owns derivative tags and Spark release-branch
PRs; this PR owns the reviewed version bump, exact merged-commit tag, release
matrix, explicit Maven publication commands, artifact proof, GitHub Release,
and BBC-VHD edit.

Supported release matrix

For an OSS 1.1.4 / Internal patch 0 release:

Branch Runtime family OSS Maven Internal Maven
master Spark 3.5 / Scala 2.12 / Python 3.11 synapseml_2.12:1.1.4 synapseml-internal_2.12:1.1.4.0
spark4.0 Spark 4.0 / Scala 2.13 / Python 3.12 synapseml_2.13:1.1.4-spark4.0 synapseml-internal_2.13:1.1.4.0-spark4.0
spark4.1 Spark 4.1 / Scala 2.13 / Python 3.13 synapseml_2.13:1.1.4-spark4.1 synapseml-internal_2.13:1.1.4.0-spark4.1

The generated text plan includes six copy-ready Maven tag-build commands:
pipeline 17563 for all three public coordinates and pipeline 18453 for all
three Internal coordinates. Pipeline 35879 publishes pip and UPack packages;
it does not publish Maven, so the six Maven builds are explicit,
independently verified gates.

Operator flow

# Full Spark 3.5 / 4.0 / 4.1 plan
python scripts/release/release_matrix.py \
  --version 1.1.4 --internal-patch 0

# Machine-readable handoff to SynapseML-Internal
python scripts/release/release_matrix.py \
  --version 1.1.4 --internal-patch 0 --json > release-plan.json

# Nonzero Internal hotfix without republishing immutable OSS artifacts
python scripts/release/release_matrix.py \
  --version 1.1.3 --internal-patch 1 --scope internal-only
  1. Release Prepare runs from master, applies the context-anchored version
    bump, rebuilds/version-snapshots docs, opens the reviewed PR, and dispatches
    branch validation.
  2. When that exact PR merges, the workflow verifies the versioned docs, tags
    the recorded merge commit, and dispatches feat: automate release tag creation and spark branch rebase (Release Guide steps 1.4-1.5) #2540's derivative-tag and Spark
    branch orchestration.
  3. Prepare the Internal branches from the same JSON plan in order: master,
    spark4.0 from master, then spark4.1 from spark4.0.
  4. Create the matrix-provided tags at the reviewed merge commits and run all
    emitted pipeline 17563 and 18453 commands.
  5. After all six Maven coordinates exist, run the emitted pipeline 35879
    command. OSS and Internal rebuild counters are passed through its real
    SYNAPSEML_PATCH_VERSION and SYNAPSEML_INTERNAL_PATCH_VERSION queue
    variables; targets needing different counters are intentionally split into
    separate plans.
  6. Run verify_release.py, then publish the GitHub Release, update BBC-VHD,
    and complete White-Glove and train monitoring.

Fail-closed verification

verify_release.py now requires:

  • every public and Internal release tag, with GitHub annotated tags peeled and
    ADO refs resolved to commits;
  • one consistent tag commit per target;
  • POM and main JAR files for all seven public Maven modules;
  • the synapseml-core tests JAR;
  • the Internal Maven POM and JAR for each selected Spark line;
  • every expected public/Internal pip and UPack package.

Network, authentication, API-shape, and missing-Azure-CLI failures remain
errors rather than missing-artifact lookalikes. The GitHub Release gate uses
--skip ado,internal, so it proves the complete OSS publication without
requiring Internal credentials.

Internal follow-up

SynapseML-Internal PR 2269983
consumes this matrix directly. It makes the queued ADO tag authoritative for
the build version, removes the broad v* auto-publication trigger, validates
the selected Spark/Scala family, updates the two public-version pins
transactionally, and prints the exact tags, Maven coordinate, and pipeline
18453 command.

Release-guide mapping

Fabric release guide Automated here Intentionally human-gated
Step 1 - OSS Version PR, docs snapshot, exact merge tag, derivative orchestration, public Maven commands and proof, GitHub Release ESRP approval and pipeline authorization
Step 2 - Internal Shared matrix, Internal tags/Maven coordinates, complete artifact verification Internal PR review/merge and ESRP approval
Step 3 - pip/UPack Pipeline 35879 parameters, rebuild variables, post-publish proof Authorized queue and approval decisions
Step 4 - BBC-VHD Deterministic setup.sh and version.txt update BBC-VHD PR, CI triage, White-Glove approval
Step 5 - Release train Documented handoff Train selection, rollout monitoring, Fabric confirmation

No ADO PAT or approval credential is stored in GitHub. Cross-system approval
boundaries remain explicit.

Evidence

  • Public targeted release/workflow tests: 125 passed, 26 skipped.
  • Pinned Black 22.3.0 check for the CI-reported file: clean; affected pipeline
    tests: 48 passed, 26 skipped.
  • Previous-primary-tag replay passes against the live tag history, including
    the abandoned v1.1.2 gap and numeric v1.0.9 -> v1.0.10 ordering.
  • Workflow/pipeline YAML parsing and git diff --check: clean.
  • Internal helper tests: 8 passed; Black, flake8, YAML parsing, and diff
    checks are clean.
  • Internal tag-driven SBT version resolution under JDK 11 produced the exact
    requested version, and the shared change applies cleanly to the Spark 4.0
    and 4.1 port branches.
  • Final-head SynapseML-Internal validation build
    232910541
    succeeded and its PR build policy is approved.
  • Expanded live v1.1.3 replay: 56 of 57 expected rows exist. The sole
    missing row is
    com.microsoft.azure:synapseml-internal_2.13:1.1.3.0-spark4.0, a historical
    Maven hole that the previous process silently accepted and this verifier now
    blocks. The OSS-only replay is complete.

Compatibility

  • No public JVM/Python API, serialized model, dependency, or package layout
    changes.
  • Existing manual release commands remain possible; these workflows add a
    reviewed default path.
  • Existing/conflicting tags, stale or cross-target commits, malformed
    versions, mismatched runtime families, duplicate pins, partial API
    responses, absent artifacts, and accidental BBC-VHD reruns fail with
    actionable errors.

Sources

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@github-actions

Copy link
Copy Markdown

Hey Rana Singh (@ranadeepsingh) 👋!
Thank you so much for contributing to our repository 🙌.
Someone from SynapseML Team will be reviewing this pull request soon.

We use semantic commit messages to streamline the release process.
Before your pull request can be merged, you should make sure your first commit and PR title start with a semantic prefix.
This helps us to create release messages and credit you for your hard work!

Examples of commit messages with semantic prefixes:

  • fix: Fix LightGBM crashes with empty partitions
  • feat: Make HTTP on Spark back-offs configurable
  • docs: Update Spark Serving usage
  • build: Add codecov support
  • perf: improve LightGBM memory usage
  • refactor: make python code generation rely on classes
  • style: Remove nulls from CNTKModel
  • test: Add test coverage for CNTKModel

To test your commit locally, please follow our guild on building from source.
Check out the developer guide for additional guidance on testing your change.

Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## Summary
Refresh the release automation on current master, align it with the Fabric release guide and the live Publish-Official pipeline, and add proof-oriented coverage for release identifiers, artifact verification, GitHub workflows, and BBC-VHD edits.

## Prompting Intent
Refresh microsoft/SynapseML PR microsoft#2628 using the SynapseML PR readiness loop, follow the internal Fabric release guide, and derive automation from actual prior OSS, Internal, Publish-Official, and BBC-VHD releases rather than relying on stale examples.

## Linked Sources
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Release automation PR: microsoft#2628
- Derivative tag automation: microsoft#2540
- Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3
- Publish-Official pipeline: https://msdata.visualstudio.com/A365/_build?definitionId=35879
- Historical BBC-VHD release PR: https://msdata.visualstudio.com/A365/_git/BBC-VHD/pullrequest/1805064

## Rationale
Keep ESRP, review, White-Glove, and train decisions human-gated while automating deterministic mechanics. Tag the exact reviewed merge, dispatch downstream GitHub automation explicitly because GITHUB_TOKEN pushes do not recurse, gate release notes on public artifacts, use the live pipeline parameter contract, fail loudly on incomplete network evidence, and roll back paired BBC-VHD writes rather than leaving partial release state.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@ranadeepsingh Rana Singh (ranadeepsingh) added enhancement github_actions Pull requests that update GitHub Actions code labels Aug 22, 2026
@ranadeepsingh Rana Singh (ranadeepsingh) changed the title feat: Automate release preparation, notes, and artifact verification feat: Automate reviewed SynapseML-to-Fabric releases Aug 22, 2026
@ranadeepsingh
Rana Singh (ranadeepsingh) marked this pull request as ready for review August 22, 2026 03:24
Copilot AI lite review requested due to automatic review settings August 22, 2026 03:24
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
There may be pipelines that require an authorized user to comment /azp run to run.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds release-engineering automation to make SynapseML-to-Fabric releases more deterministic and reviewable, including a GitHub Actions “prepare → tag merged commit → publish notes” flow plus supporting Python tooling to derive/verify release identifiers and safely bump BBC-VHD pins.

Changes:

  • Introduces a release matrix generator (release_matrix.py) and an end-to-end verifier (verify_release.py) with accompanying tests.
  • Adds bump_bbcvhd.py (plus tests) to safely update BBC-VHD component pins while preserving line endings and rolling back on failure.
  • Adds/updates GitHub workflows for release prepare/tagging and manual, artifact-gated release notes; enables workflow_dispatch for PR validation so release PRs created via GITHUB_TOKEN can be validated.
Show a summary per file
File Description
scripts/test_bump_version.py Extends bump-version tests for denylisted repo-relative paths; normalizes path keys to POSIX.
scripts/bump-version.py Improves Windows console encoding robustness; adds path-based denylist support; normalizes path handling via as_posix().
scripts/release/release_matrix.py Adds a single-source-of-truth release matrix for tags and artifact versions + CLI rendering.
scripts/release/verify_release.py Adds live verification of GitHub/ADO tags and Maven/PyPI/UPack/Azure Artifacts presence.
scripts/release/bump_bbcvhd.py Adds deterministic, rollback-safe BBC-VHD component pin updater with CRLF/LF preservation.
scripts/release/README.md Documents how to use the new release tooling and where it fits in the guide.
scripts/release/test_release_matrix.py Adds regression/contract tests for the release matrix derivations and CLI validation.
scripts/release/test_verify_release.py Adds unit tests for verifier networking/error handling and run plan behavior.
scripts/release/test_bump_bbcvhd.py Adds tests for BBC-VHD bump idempotency, rollback, and newline preservation.
scripts/release/test_release_workflows.py Adds tests asserting key workflow contract properties (manual gating, dispatch behavior).
scripts/release/test_prev_tag.sh Adds a repo-taglist regression script for “previous primary tag” selection logic.
.github/workflows/release-prepare.yml Adds a reviewed release PR generator and a merged-commit tagger that dispatches downstream orchestration.
.github/workflows/release-notes.yml Adds a manual, artifact-gated GitHub Release publisher with explicit previous-tag selection.
.github/workflows/pr-validation.yml Enables workflow_dispatch so validations can be dispatched for bot-opened release PR branches.

Review details

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Suppressed comments (1)

scripts/release/verify_release.py:260

  • --skip internal does not currently skip the internal PyPI feed checks (the synapseml_internal package); it only skips internal git tag checks. This makes --skip internal behave inconsistently compared with --skip public.
    def pip(self, package: str, version: str) -> str:
        if "pip" in self.skip or "ado" in self.skip:
            return SKIPPED
        # Azure Artifacts normalises pypi names: synapseml_internal -> synapseml-internal
        return (
            OK
            if version
            in self._feed_versions("Synapse-Conda", "pypi", package.replace("_", "-"))
            else MISSING
        )
  • Files reviewed: 14/14 changed files
  • Comments generated: 2
  • Review effort level: Lite

Comment thread scripts/release/verify_release.py Outdated
Comment thread scripts/release/verify_release.py
Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## Summary
Make --skip internal consistently skip SynapseML-Internal tags, UPacks, and wheels while retaining OSS artifact checks, and document every skip scope with regression coverage.

## Prompting Intent
Resolve all current-head automated review findings on microsoft/SynapseML PR microsoft#2628 and preserve an explicit, safe release-verification CLI contract.

## Linked Sources
- Release automation PR: microsoft#2628
- Internal artifact skip review: microsoft#2628 (comment)
- Skip help review: microsoft#2628 (comment)

## Rationale
A release operator who opts out of Internal verification must not still query or fail on Internal packages. Passing artifact scope explicitly keeps OSS checks active, avoids hiding public release gaps, and makes combined skip behavior predictable from both CLI help and maintainer documentation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 22, 2026 03:34
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

scripts/release/verify_release.py:75

  • On Windows, subprocess.run(..., shell=True) expects a command string, but this code passes a list. That combination can fail (or behave differently) on win32, which would break the fallback ADO auth path even when az is installed. Build a platform-appropriate command (string for shell=True, list otherwise).
    out = subprocess.run(
        [
            "az",
            "account",
            "get-access-token",
            "--resource",
            ADO_RESOURCE,
            "--query",
            "accessToken",
            "-o",
            "tsv",
        ],
        capture_output=True,
        text=True,
        shell=(sys.platform == "win32"),
    )
  • Files reviewed: 14/14 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## Summary
Build the Azure CLI authentication command as a string only when Windows requires shell execution, while retaining an argument list and shell-free execution on other platforms. Add regression coverage for both command shapes.

## Prompting Intent
Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 and prove the fallback authentication path used by release verification on Windows.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
Windows resolves the Azure CLI through a command shim, so the verifier needs shell execution there; subprocess requires that shell command to be a string. Keeping list-based execution elsewhere preserves safe argument boundaries, while an actual token-less Windows replay proves the fallback can authenticate and inspect the live release.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 22, 2026 03:40
@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

Addressed the current-head suppressed Windows auth finding in 6e80f27.

  • Windows now gives subprocess.run(..., shell=True) a command string; non-Windows retains an argument list with shell=False.
  • Parameterized regression coverage locks both command shapes.
  • A token-less Windows fallback replay authenticated through �z and found all 12 selected v1.1.3 master artifacts; the complete release-tooling suite is 279 passed.

@ranadeepsingh

Copy link
Copy Markdown
Collaborator Author

/azp run

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Suppressed comments (1)

Previously missed (1) — in code that hasn't changed since the last review.

scripts/release/verify_release.py:313

  • The Maven publication gate here verifies only synapseml-core_{scala} (via public_maven()), but the workflow-generated release notes advertise com.microsoft.azure:synapseml_2.12:${VERSION} (see .github/workflows/release-notes.yml:137) and the docs use the synapseml_2.12 coordinate (website/doctest.py:25). This can let verify_release.py report COMPLETE even if the primary install coordinate is missing (or vice versa). Consider aligning the verification to check the same Maven artifact(s) that users are instructed to consume (e.g., verify both synapseml_{scala} and synapseml-core_{scala}, or switch to the canonical one).
            "maven",
            tp.key,
            f"synapseml-core_{tp.scala}",
            tp.oss_maven_version,
            c.public_maven(tp.scala, tp.oss_maven_version),
  • Files reviewed: 14/14 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 22, 2026
## Summary
Gate release completeness on both the user-facing synapseml_<scala> Maven coordinate and the release-guide synapseml-core_<scala> coordinate for every selected Spark target. Add a failing-install-coordinate regression and document the two-coordinate contract.

## Prompting Intent
Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 by aligning artifact verification with generated release notes, installation docs, and actual published releases.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3

## Rationale
The aggregate synapseml artifact is the coordinate users install and the one release notes advertise, while the guide explicitly points maintainers to synapseml-core. Requiring both prevents a GitHub Release from reporting complete when either the public install contract or the guide's Maven evidence is absent.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 24, 2026
## Summary
Gate release completeness on both the user-facing synapseml_<scala> Maven coordinate and the release-guide synapseml-core_<scala> coordinate for every selected Spark target. Add a failing-install-coordinate regression and document the two-coordinate contract.

## Prompting Intent
Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 by aligning artifact verification with generated release notes, installation docs, and actual published releases.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3

## Rationale
The aggregate synapseml artifact is the coordinate users install and the one release notes advertise, while the guide explicitly points maintainers to synapseml-core. Requiring both prevents a GitHub Release from reporting complete when either the public install contract or the guide's Maven evidence is absent.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 24, 2026
## Summary
Make the SBT launcher download fail fast with actionable HTTP errors and transient retries, and invoke the release verifier through the guaranteed Python 3 executable on Ubuntu. Lock both workflow contracts with tests.

## Prompting Intent
Resolve both current-head suppressed Copilot findings on microsoft/SynapseML PR microsoft#2628 without changing the release approval or publication flow.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
A failed launcher download should stop at the network boundary rather than creating a corrupt tool that fails later, and release publication must not depend on an optional python alias. Explicit curl failure semantics, bounded retries, and python3 make failures early and deterministic while preserving all human gates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 24, 2026
## Summary
Insert the release test directory explicitly before importing verify_release and bump_bbcvhd, matching the existing release-matrix test pattern. This keeps collection independent of pytest's default path-prepend behavior.

## Prompting Intent
Resolve both current-head Copilot review threads on microsoft/SynapseML PR microsoft#2628 and prove the release tests collect under alternate pytest import modes.

## Linked Sources
- Release automation PR: microsoft#2628
- Verifier import review: microsoft#2628 (comment)
- BBC-VHD import review: microsoft#2628 (comment)

## Rationale
Relying on pytest's default import mode makes test collection sensitive to runner configuration. Explicitly locating sibling modules is already the repository convention for release_matrix and allows these suites to run consistently from the repository root and under importlib collection.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 24, 2026
## Summary
Normalize whitespace around rebuild-counter values and reject empty target keys directly in parse_iterations. Add positive whitespace and negative empty-target regression cases.

## Prompting Intent
Resolve the current-head suppressed Copilot finding on microsoft/SynapseML PR microsoft#2628 and make release counter errors actionable at the CLI parsing boundary.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
Rebuild counters are operator-entered recovery controls for immutable artifacts. Empty targets should fail as malformed KEY=N input rather than surfacing later as an unknown target, while spacing around a numeric value should not turn an otherwise valid recovery command into an error.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rana Singh (ranadeepsingh) pushed a commit to ranadeepsingh/SynapseML that referenced this pull request Aug 24, 2026
## Summary
Replace GNU sort -V in the release tag-history regression helper with Python 3 semantic-version ordering, reuse the sorted primary-tag stream, and support environments where the Python 3 executable is named either python3 or python.

## Prompting Intent
Resolve the current-head suppressed Copilot portability finding on microsoft/SynapseML PR microsoft#2628 while preserving validation against the repository's complete historical tag list.

## Linked Sources
- Release automation PR: microsoft#2628
- Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3

## Rationale
Contributor-side release evidence should run on macOS/BSD as well as GNU systems. Python 3 is already a release-tooling dependency and provides deterministic numeric tuple ordering without relying on platform-specific sort flags; consuming the full stream also avoids early-pipeline termination behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

  • Files reviewed: 16/16 changed files
  • Comments generated: 2
  • Review effort level: Lite

Comment thread tools/ci/tests/test_pipeline_yaml.py
Comment thread scripts/release/verify_release.py Outdated
SynapseML CI and others added 11 commits August 26, 2026 01:48
Automates the mechanical parts of the SynapseML Fabric release so the
remaining human work is decision-making and approvals.

Fixes to scripts/bump-version.py (it currently FAILS on master):

- PR microsoft#2589 (CDN migration) rewrote "docs/Reference/R Setup.md" to
  per-module archive names (synapseml-core-1.1.3.zip) and added
  VerifyRCodegen.scala with hardcoded version strings. Neither is
  matched by the existing patterns, so the script hard-fails and would
  block the next release. Added a generic "-{V}.zip" line anchor plus
  file anchors for VerifyRCodegen.
- _detect_version() read docusaurus.config.js without an encoding,
  raising UnicodeDecodeError on a cp1252 console.
- analyze() and the EXPECTED_FILES manifest check compared str(rel),
  which yields backslashes on Windows and never matches the "/" paths
  in the anchor tables, producing false "not updated" warnings.
- Non-ASCII status output crashed on a cp1252 console *after* files had
  been rewritten, leaving a half-applied bump behind a non-zero exit.
- Added DENYLIST_PATHS for files whose basename is too common to
  denylist safely.

New tooling in scripts/release/:

- release_matrix.py derives every tag, UPack version, pip version and
  BBC-VHD value from one input version. One release spans 7 tags per
  repo and 4 mutually inconsistent naming conventions; notably the OSS
  UPack package mangles spark dots to dashes (1.1.3-spark4-0) while the
  Internal package preserves them (1.1.3-0-spark4.0).
- verify_release.py checks every tag and artifact against the matrix.
  Worth running even on a green publish pipeline, because several of
  its publish steps use continueOnError: true.
- bump_bbcvhd.py applies a release to a BBC-VHD component, replacing
  the most error-prone hand-edit in the process.

New workflows:

- release-prepare.yml opens the version-bump PR. Two of the last four
  bumps landed as unsigned direct pushes to master with no PR.
- release-notes.yml publishes the GitHub Release on a vX.Y.Z tag.
  v1.1.1 has a tag but no Release, which made v1.1.3's auto-generated
  notes span two releases; the workflow pins the diff base to the
  previous primary tag so notes stay correct regardless.

Expected values in the tests are transcribed from live v1.1.1 and
v1.1.3 data, so a failure means the tooling has drifted from what was
actually shipped.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Refresh the release automation on current master, align it with the Fabric release guide and the live Publish-Official pipeline, and add proof-oriented coverage for release identifiers, artifact verification, GitHub workflows, and BBC-VHD edits.

## Prompting Intent
Refresh microsoft/SynapseML PR microsoft#2628 using the SynapseML PR readiness loop, follow the internal Fabric release guide, and derive automation from actual prior OSS, Internal, Publish-Official, and BBC-VHD releases rather than relying on stale examples.

## Linked Sources
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Release automation PR: microsoft#2628
- Derivative tag automation: microsoft#2540
- Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3
- Publish-Official pipeline: https://msdata.visualstudio.com/A365/_build?definitionId=35879
- Historical BBC-VHD release PR: https://msdata.visualstudio.com/A365/_git/BBC-VHD/pullrequest/1805064

## Rationale
Keep ESRP, review, White-Glove, and train decisions human-gated while automating deterministic mechanics. Tag the exact reviewed merge, dispatch downstream GitHub automation explicitly because GITHUB_TOKEN pushes do not recurse, gate release notes on public artifacts, use the live pipeline parameter contract, fail loudly on incomplete network evidence, and roll back paired BBC-VHD writes rather than leaving partial release state.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Make --skip internal consistently skip SynapseML-Internal tags, UPacks, and wheels while retaining OSS artifact checks, and document every skip scope with regression coverage.

## Prompting Intent
Resolve all current-head automated review findings on microsoft/SynapseML PR microsoft#2628 and preserve an explicit, safe release-verification CLI contract.

## Linked Sources
- Release automation PR: microsoft#2628
- Internal artifact skip review: microsoft#2628 (comment)
- Skip help review: microsoft#2628 (comment)

## Rationale
A release operator who opts out of Internal verification must not still query or fail on Internal packages. Passing artifact scope explicitly keeps OSS checks active, avoids hiding public release gaps, and makes combined skip behavior predictable from both CLI help and maintainer documentation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Build the Azure CLI authentication command as a string only when Windows requires shell execution, while retaining an argument list and shell-free execution on other platforms. Add regression coverage for both command shapes.

## Prompting Intent
Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 and prove the fallback authentication path used by release verification on Windows.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
Windows resolves the Azure CLI through a command shim, so the verifier needs shell execution there; subprocess requires that shell command to be a string. Keeping list-based execution elsewhere preserves safe argument boundaries, while an actual token-less Windows replay proves the fallback can authenticate and inspect the live release.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Gate release completeness on both the user-facing synapseml_<scala> Maven coordinate and the release-guide synapseml-core_<scala> coordinate for every selected Spark target. Add a failing-install-coordinate regression and document the two-coordinate contract.

## Prompting Intent
Resolve the current-head suppressed Copilot review finding on microsoft/SynapseML PR microsoft#2628 by aligning artifact verification with generated release notes, installation docs, and actual published releases.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3

## Rationale
The aggregate synapseml artifact is the coordinate users install and the one release notes advertise, while the guide explicitly points maintainers to synapseml-core. Requiring both prevents a GitHub Release from reporting complete when either the public install contract or the guide's Maven evidence is absent.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Make the SBT launcher download fail fast with actionable HTTP errors and transient retries, and invoke the release verifier through the guaranteed Python 3 executable on Ubuntu. Lock both workflow contracts with tests.

## Prompting Intent
Resolve both current-head suppressed Copilot findings on microsoft/SynapseML PR microsoft#2628 without changing the release approval or publication flow.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
A failed launcher download should stop at the network boundary rather than creating a corrupt tool that fails later, and release publication must not depend on an optional python alias. Explicit curl failure semantics, bounded retries, and python3 make failures early and deterministic while preserving all human gates.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Insert the release test directory explicitly before importing verify_release and bump_bbcvhd, matching the existing release-matrix test pattern. This keeps collection independent of pytest's default path-prepend behavior.

## Prompting Intent
Resolve both current-head Copilot review threads on microsoft/SynapseML PR microsoft#2628 and prove the release tests collect under alternate pytest import modes.

## Linked Sources
- Release automation PR: microsoft#2628
- Verifier import review: microsoft#2628 (comment)
- BBC-VHD import review: microsoft#2628 (comment)

## Rationale
Relying on pytest's default import mode makes test collection sensitive to runner configuration. Explicitly locating sibling modules is already the repository convention for release_matrix and allows these suites to run consistently from the repository root and under importlib collection.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Normalize whitespace around rebuild-counter values and reject empty target keys directly in parse_iterations. Add positive whitespace and negative empty-target regression cases.

## Prompting Intent
Resolve the current-head suppressed Copilot finding on microsoft/SynapseML PR microsoft#2628 and make release counter errors actionable at the CLI parsing boundary.

## Linked Sources
- Release automation PR: microsoft#2628
- Fabric release guide: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
Rebuild counters are operator-entered recovery controls for immutable artifacts. Empty targets should fail as malformed KEY=N input rather than surfacing later as an unknown target, while spacing around a numeric value should not turn an otherwise valid recovery command into an error.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Replace GNU sort -V in the release tag-history regression helper with Python 3 semantic-version ordering, reuse the sorted primary-tag stream, and support environments where the Python 3 executable is named either python3 or python.

## Prompting Intent
Resolve the current-head suppressed Copilot portability finding on microsoft/SynapseML PR microsoft#2628 while preserving validation against the repository's complete historical tag list.

## Linked Sources
- Release automation PR: microsoft#2628
- Live v1.1.3 release: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3

## Rationale
Contributor-side release evidence should run on macOS/BSD as well as GNU systems. Python 3 is already a release-tooling dependency and provides deterministic numeric tuple ordering without relying on platform-specific sort flags; consuming the full stream also avoids early-pipeline termination behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary
Make the release matrix the executable contract for Spark 3.5, 4.0, and 4.1; emit explicit public and Internal Maven queue commands; add full versus Internal-only release scopes; propagate rebuild counters; and fail release verification unless every expected Maven, pip, UPack, and tag artifact is present and commit-consistent.

## Prompting Intent
Refresh PR microsoft#2628 on current master and make SynapseML-to-Fabric releases easy to operate, complete across supported Spark branches, and verifiably published to Maven. Follow historical releases and the SynapseML Fabric Release Guide v2, while producing an interoperable contract for the SynapseML-Internal follow-up.

## Linked Sources
- GitHub pull request: microsoft#2628
- SynapseML Fabric Release Guide v2: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2
- Historical release reference: https://github.com/microsoft/SynapseML/releases/tag/v1.1.3

## Rationale
Use one validated matrix instead of hand-maintained branch instructions so Maven, pip, UPack, tags, and BBC-VHD values cannot drift. Queue Maven publication explicitly because the downstream packaging pipeline does not publish Maven. Keep Internal-only hotfixes from republishing immutable public artifacts, and verify live artifact files plus peeled tag commits because green pipelines alone do not prove a complete release.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

  • Files reviewed: 15/15 changed files
  • Comments generated: 1
  • Review effort level: Lite

Comment thread scripts/release/verify_release.py Outdated
## Summary
Apply the repository-pinned Black 22.3.0 layout to the Fabric certificate test helper so PR validation accepts the rebased release automation changes.

## Prompting Intent
Keep PR microsoft#2628 green after its release hardening update by fixing the exact formatting mismatch reported by the Python Style Check, without changing behavior or formatting unrelated files.

## Linked Sources
- GitHub pull request: microsoft#2628
- Failed Python Style Check: https://github.com/microsoft/SynapseML/actions/runs/32958770630/job/98146240564

## Rationale
Apply only the formatter diff emitted by Black 22.3.0 because the local newer Black version accepted a layout that the repository-pinned CI version rejects. A focused follow-up preserves commit history and avoids unrelated repository-wide formatting churn.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 26, 2026 10:41

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

Suppressed comments (1)

scripts/release/verify_release.py:124

  • _url_exists() performs a full GET for Maven .jar/.pom existence checks. Even without reading the body, this can trigger large downloads (dozens of JARs per run) and make verify_release.py slow/flaky against the CDN. Prefer HEAD and fall back to GET only if the server rejects HEAD (405/501).
def _url_exists(url: str, headers: Dict[str, str]) -> bool:
    req = urllib.request.Request(url, headers=headers)
    try:
        with urllib.request.urlopen(req, timeout=60):
            return True
  • Files reviewed: 15/15 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

## Summary
Probe Maven and PyPI artifact URLs with HEAD first, falling back to GET only when a server reports HEAD as unsupported with HTTP 405 or 501. Add regression coverage for successful HEAD probes, unsupported-method fallback, and missing artifacts in both paths.

## Prompting Intent
Address the current-head review finding on PR microsoft#2628 while preserving the verifier's fail-closed semantics and making complete multi-branch Maven verification faster and less bandwidth-intensive.

## Linked Sources
- GitHub pull request: microsoft#2628
- Review finding: microsoft#2628 (comment)
- SynapseML Fabric Release Guide v2: https://msdata.visualstudio.com/A365/_wiki/wikis/Osmos%20Team%20Wiki/130638/SynapseML-Fabric-Release-Guide-v2

## Rationale
Use HEAD for the common path so large JAR bodies are never opened unnecessarily. Fall back only for the standard unsupported-method responses, rather than masking authentication, server, or network failures, so operational errors remain actionable and missing artifacts still fail release verification.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 26, 2026 11:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review details

  • Files reviewed: 15/15 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/build enhancement github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants