dotnet/runtime · error · RuntimeError

No baseline JIT found

Error message

No baseline JIT found

What it means

Raised by process_git_hash_arg() in jitrollingbuild.py after iterating through all JIT change hashes (up to 20) and checking Azure Storage for each one via get_jit_urls(), finding that none of them have a matching JIT build available. This is the final fallback error when the entire search for a baseline JIT in the rolling build storage has been exhausted. Note that the RuntimeError is raised OUTSIDE the 'with ChangeDir' block (line 254 vs the block ending earlier), which is a minor structural detail.

Solutions

  1. Check if rolling builds exist for your OS/arch/build_type: run 'python jitrollingbuild.py list' to see what's available.
  2. Specify a known-good -git_hash that has an existing build (find one via 'list --all').
  3. Verify your network can reach Azure Storage (https://clrjit2.blob.core.windows.net/).
  4. Wait for the rolling build pipeline to produce builds for recent JIT changes if they're very recent.
  5. Check if the -host_os, -arch, and -build_type arguments match what's available in storage.

Example fix

# Not a code fix but a diagnostic approach:

# before:
python jitrollingbuild.py download
# -> RuntimeError: No baseline JIT found

# after - find what's available, then specify:
python jitrollingbuild.py list
# pick a hash from the output
python jitrollingbuild.py download -git_hash <hash_from_list>
Defensive patterns

Strategy: validation

Validate before calling

import urllib.request, re

def check_rolling_build_available(git_hash: str, host_os: str, arch: str, build_type: str) -> bool:
    """Check if a JIT rolling build exists in Azure Storage for the given parameters."""
    base_uri = "https://clrjit2.blob.core.windows.net/jitrollingbuild"
    prefix = f"builds/{git_hash}/{host_os}/{arch}/{build_type}"
    list_uri = f"{base_uri}?restype=container&comp=list&prefix={prefix}"
    try:
        contents = urllib.request.urlopen(list_uri).read().decode('utf-8')
        urls = contents.split('<Url>')[1:]
        return len(urls) > 0
    except Exception:
        return False

# Usage before download:
if not check_rolling_build_available(git_hash, host_os, arch, build_type):
    print(f"No rolling build found for {git_hash}/{host_os}/{arch}/{build_type}")
    print("Use 'jitrollingbuild.py list' to see available builds.")

Type guard

null

Try / catch

try:
    process_git_hash_arg(coreclr_args)
except RuntimeError as e:
    if "No baseline JIT found" in str(e):
        logging.error("No matching JIT rolling build exists in Azure Storage.")
        logging.error("Use 'jitrollingbuild.py list' to find available builds.")
        logging.error("Or pass -git_hash <known_hash> to specify a build directly.")
    raise

Prevention

When it happens

Trigger: Triggered when the for-loop over change_list_hashes completes without returning (i.e., every hash was checked via get_jit_urls() and returned 0 or 1 URLs, never more than 1). The condition for early return is len(urls) > 1. If no hash produces more than one URL, the loop exhausts and reaches line 254. The logging.error at line 252 provides a hint, then the RuntimeError is raised.

Common situations: The rolling build pipeline hasn't produced builds for any of the recent JIT changes (build queue delay, pipeline failure). The OS/architecture/build_type combination doesn't have any builds in storage (e.g., looking for arm64 but only x64 builds exist). Azure Storage is inaccessible or the REST API returns empty results. The JIT changes are too old and builds have been garbage-collected from storage.

Related errors


AI-assisted analysis of dotnet/runtime@60108ba66e (2026-08-10). Data as JSON: /api/errors/f09e803cc55f2765. Report an issue: GitHub.

Appendix: source

Thrown at src/coreclr/scripts/jitrollingbuild.py:254

            coreclr_args.git_hash = git_hash

            if return_first_hash:
                # Just use the first one
                break

            urls = get_jit_urls(coreclr_args)
            if len(urls) > 1:
                if hashnum > 1:
                    logging.warning("Warning: the baseline found is not built with the first git hash with JIT code changes; there may be extraneous diffs")
                return

            # We didn't find a baseline; keep looking
            hashnum += 1

        # We ran out of hashes of JIT changes, and didn't find a baseline. Give up.
        logging.error("Error: no baseline JIT found")

    raise RuntimeError("No baseline JIT found")


def list_az_jits(filter_func=lambda unused: True, prefix_string = None):
    """ List the JITs in Azure Storage using REST api

    Args:
        filter_func (lambda: string -> bool): filter to apply to the list. The filter takes a URL and returns True if this URL is acceptable.
        prefix_string: Optional. Specifies a string prefix for the Azure Storage query.

    Returns:
        urls (list): set of URLs in Azure Storage that match the filter.

    Notes:
        This method does not require installing the Azure Storage python package.
    """

    # This URI will return *all* the blobs, for all git_hash/OS/architecture/build_type combinations.
    # pass "prefix=foo/bar/..." to only show a subset. Or, we can filter later using string search.

View on GitHub (pinned to 60108ba66e)