Skip to content

Conversation

@bebound
Copy link
Contributor

@bebound bebound commented Apr 25, 2025

Related command

Description

Backport #31208

History Notes

[Packaging] Drop Ubuntu 20.04 support

@azure-client-tools-bot-prd
Copy link

Hi @bebound,
Usually we only allow pull requests to be submitted to the dev branch, please double check your pull request target branch dev-lts-2.66.

@azure-client-tools-bot-prd
Copy link

azure-client-tools-bot-prd bot commented Apr 25, 2025

❌AzureCLI-FullTest
🔄acr
️✔️2020-09-01-hybrid
️✔️3.9
🔄latest
️✔️3.12
🔄3.9
🔄acs
️✔️2020-09-01-hybrid
️✔️3.9
🔄latest
🔄3.12
🔄3.9
🔄advisor
🔄latest
️✔️3.12
🔄3.9
️✔️ams
️✔️latest
️✔️3.12
️✔️3.9
🔄apim
🔄latest
🔄3.12
🔄3.9
🔄appconfig
🔄latest
🔄3.12
🔄3.9
🔄appservice
🔄latest
🔄3.12
🔄3.9
🔄aro
🔄latest
🔄3.12
🔄3.9
🔄backup
🔄latest
🔄3.12
🔄3.9
🔄batch
🔄latest
️✔️3.12
🔄3.9
️✔️batchai
️✔️latest
️✔️3.12
️✔️3.9
🔄billing
🔄latest
🔄3.12
🔄3.9
🔄botservice
🔄latest
🔄3.12
🔄3.9
️✔️cdn
️✔️latest
️✔️3.12
️✔️3.9
🔄cloud
🔄latest
🔄3.12
🔄3.9
🔄cognitiveservices
🔄latest
🔄3.12
🔄3.9
️✔️compute_recommender
️✔️latest
️✔️3.12
️✔️3.9
️✔️config
️✔️latest
️✔️3.12
️✔️3.9
🔄configure
🔄latest
️✔️3.12
🔄3.9
🔄consumption
🔄latest
🔄3.12
🔄3.9
🔄container
🔄latest
🔄3.12
🔄3.9
🔄containerapp
🔄latest
🔄3.12
🔄3.9
❌core
❌2018-03-01-hybrid
❌3.9
Type Test Case Error Message Line
Failed test_detect_credential_for_string self = <azure.cli.core.tests.test_credential_helper.TestCredentialHelper testMethod=test_detect_credential_for_string>

    def test_detect_credential_for_string(self):
        with mock.patch('azure.cli.core.credential_helper.get_secret_masker', side_effect=self.get_test_secret_masker):
            creation_time = '2024-03-07T02:50:56.464790+00:00'
>           containing_credential, 
 = distinguish_credential(creation_time)

src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:37: 
                                        
src/azure-cli-core/azure/cli/core/credential_helper.py:83: in distinguish_credential
    detections = is_containing_credential(content)
src/azure-cli-core/azure/cli/core/credential_helper.py:44: in is_containing_credential
    return get_secret_masker().detect_secrets(content)
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/secret_masker.py:99: in detect_secrets
    detections.extend(regex_pattern.get_detections(input, self.generate_sha256_hashes))
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/regex_pattern.py:126: in get_detections
    for m in re.finditer(self.pattern, input, self.regex_flags):
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:248: in finditer
    return compile(pattern, flags).finditer(string)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:304: in compile
    p = sre_compile.compile(pattern, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_compile.py:788: in compile
    p = sre_parse.parse(p, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:955: in parse
    p = parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:444: in parse_sub
    itemsappend(parse(source, state, verbose, nested + 1,
 
 
 
 
 
 
                                 _ 

source = <sre_parse.Tokenizer object at 0x7fc201c42eb0>
state = <sre_parse.State object at 0x7fc201c42f10>, verbose = 0, nested = 1
first = True

    def _parse(source, state, verbose, nested, first=False):
        # parse a simple pattern
        subpattern = SubPattern(state)
    
        # precompute constants into local variables
        subpatternappend = subpattern.append
        sourceget = source.get
        sourcematch = source.match
        _len = len
        _ord = ord
    
        while True:
    
            this = source.next
            if this is None:
                break # end of pattern
            if this in "
)":
                break # end of subpattern
            sourceget()
    
            if verbose:
                # skip whitespace and comments
                if this in WHITESPACE:
                    continue
                if this == "#":
                    while True:
                        this = sourceget()
                        if this is None or this == "\n":
                            break
                    continue
    
            if this[0] == "\":
                code = _escape(source, this, state)
                subpatternappend(code)
    
            elif this not in SPECIAL_CHARS:
                subpatternappend((LITERAL, _ord(this)))
    
            elif this == "[":
                here = source.tell() - 1
                # character set
                set = []
                setappend = set.append
    ##          if sourcematch(":"):
    ##              pass # handle character classes
                if source.next == '[':
                    import warnings
                    warnings.warn(
                        'Possible nested set at position %d' % source.tell(),
                        FutureWarning, stacklevel=nested + 6
                    )
                negate = sourcematch("^")
                # check remaining characters
                while True:
                    this = sourceget()
                    if this is None:
                        raise source.error("unterminated character set",
                                           source.tell() - here)
                    if this == "]" and set:
                        break
                    elif this[0] == "\":
                        code1 = _class_escape(source, this)
                    else:
                        if set and this in '-&~
Failed test_redact_credential_for_json The error message is too long, please check the pipeline log for details. src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:57
Failed test_redact_credential_for_string The error message is too long, please check the pipeline log for details. src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:43
❌2019-03-01-hybrid
❌3.9
Type Test Case Error Message Line
Failed test_detect_credential_for_string self = <azure.cli.core.tests.test_credential_helper.TestCredentialHelper testMethod=test_detect_credential_for_string>

    def test_detect_credential_for_string(self):
        with mock.patch('azure.cli.core.credential_helper.get_secret_masker', side_effect=self.get_test_secret_masker):
            creation_time = '2024-03-07T02:50:56.464790+00:00'
>           containing_credential, 
 = distinguish_credential(creation_time)

src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:37: 
                                        
src/azure-cli-core/azure/cli/core/credential_helper.py:83: in distinguish_credential
    detections = is_containing_credential(content)
src/azure-cli-core/azure/cli/core/credential_helper.py:44: in is_containing_credential
    return get_secret_masker().detect_secrets(content)
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/secret_masker.py:99: in detect_secrets
    detections.extend(regex_pattern.get_detections(input, self.generate_sha256_hashes))
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/regex_pattern.py:126: in get_detections
    for m in re.finditer(self.pattern, input, self.regex_flags):
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:248: in finditer
    return compile(pattern, flags).finditer(string)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:304: in compile
    p = sre_compile.compile(pattern, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_compile.py:788: in compile
    p = sre_parse.parse(p, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:955: in parse
    p = parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:444: in parse_sub
    itemsappend(parse(source, state, verbose, nested + 1,
 
 
 
 
 
 
                                 _ 

source = <sre_parse.Tokenizer object at 0x7f4887140df0>
state = <sre_parse.State object at 0x7f4887140e50>, verbose = 0, nested = 1
first = True

    def _parse(source, state, verbose, nested, first=False):
        # parse a simple pattern
        subpattern = SubPattern(state)
    
        # precompute constants into local variables
        subpatternappend = subpattern.append
        sourceget = source.get
        sourcematch = source.match
        _len = len
        _ord = ord
    
        while True:
    
            this = source.next
            if this is None:
                break # end of pattern
            if this in "
)":
                break # end of subpattern
            sourceget()
    
            if verbose:
                # skip whitespace and comments
                if this in WHITESPACE:
                    continue
                if this == "#":
                    while True:
                        this = sourceget()
                        if this is None or this == "\n":
                            break
                    continue
    
            if this[0] == "\":
                code = _escape(source, this, state)
                subpatternappend(code)
    
            elif this not in SPECIAL_CHARS:
                subpatternappend((LITERAL, _ord(this)))
    
            elif this == "[":
                here = source.tell() - 1
                # character set
                set = []
                setappend = set.append
    ##          if sourcematch(":"):
    ##              pass # handle character classes
                if source.next == '[':
                    import warnings
                    warnings.warn(
                        'Possible nested set at position %d' % source.tell(),
                        FutureWarning, stacklevel=nested + 6
                    )
                negate = sourcematch("^")
                # check remaining characters
                while True:
                    this = sourceget()
                    if this is None:
                        raise source.error("unterminated character set",
                                           source.tell() - here)
                    if this == "]" and set:
                        break
                    elif this[0] == "\":
                        code1 = _class_escape(source, this)
                    else:
                        if set and this in '-&~
Failed test_redact_credential_for_json The error message is too long, please check the pipeline log for details. src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:57
Failed test_redact_credential_for_string The error message is too long, please check the pipeline log for details. src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:43
❌2020-09-01-hybrid
❌3.9
Type Test Case Error Message Line
Failed test_detect_credential_for_string self = <azure.cli.core.tests.test_credential_helper.TestCredentialHelper testMethod=test_detect_credential_for_string>

    def test_detect_credential_for_string(self):
        with mock.patch('azure.cli.core.credential_helper.get_secret_masker', side_effect=self.get_test_secret_masker):
            creation_time = '2024-03-07T02:50:56.464790+00:00'
>           containing_credential, 
 = distinguish_credential(creation_time)

src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:37: 
                                        
src/azure-cli-core/azure/cli/core/credential_helper.py:83: in distinguish_credential
    detections = is_containing_credential(content)
src/azure-cli-core/azure/cli/core/credential_helper.py:44: in is_containing_credential
    return get_secret_masker().detect_secrets(content)
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/secret_masker.py:99: in detect_secrets
    detections.extend(regex_pattern.get_detections(input, self.generate_sha256_hashes))
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/regex_pattern.py:126: in get_detections
    for m in re.finditer(self.pattern, input, self.regex_flags):
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:248: in finditer
    return compile(pattern, flags).finditer(string)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:304: in compile
    p = sre_compile.compile(pattern, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_compile.py:788: in compile
    p = sre_parse.parse(p, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:955: in parse
    p = parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:444: in parse_sub
    itemsappend(parse(source, state, verbose, nested + 1,
 
 
 
 
 
 
                                 _ 

source = <sre_parse.Tokenizer object at 0x7fa848946280>
state = <sre_parse.State object at 0x7fa8489462e0>, verbose = 0, nested = 1
first = True

    def _parse(source, state, verbose, nested, first=False):
        # parse a simple pattern
        subpattern = SubPattern(state)
    
        # precompute constants into local variables
        subpatternappend = subpattern.append
        sourceget = source.get
        sourcematch = source.match
        _len = len
        _ord = ord
    
        while True:
    
            this = source.next
            if this is None:
                break # end of pattern
            if this in "
)":
                break # end of subpattern
            sourceget()
    
            if verbose:
                # skip whitespace and comments
                if this in WHITESPACE:
                    continue
                if this == "#":
                    while True:
                        this = sourceget()
                        if this is None or this == "\n":
                            break
                    continue
    
            if this[0] == "\":
                code = _escape(source, this, state)
                subpatternappend(code)
    
            elif this not in SPECIAL_CHARS:
                subpatternappend((LITERAL, _ord(this)))
    
            elif this == "[":
                here = source.tell() - 1
                # character set
                set = []
                setappend = set.append
    ##          if sourcematch(":"):
    ##              pass # handle character classes
                if source.next == '[':
                    import warnings
                    warnings.warn(
                        'Possible nested set at position %d' % source.tell(),
                        FutureWarning, stacklevel=nested + 6
                    )
                negate = sourcematch("^")
                # check remaining characters
                while True:
                    this = sourceget()
                    if this is None:
                        raise source.error("unterminated character set",
                                           source.tell() - here)
                    if this == "]" and set:
                        break
                    elif this[0] == "\":
                        code1 = _class_escape(source, this)
                    else:
                        if set and this in '-&~
Failed test_redact_credential_for_json The error message is too long, please check the pipeline log for details. src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:57
Failed test_redact_credential_for_string The error message is too long, please check the pipeline log for details. src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:43
❌latest
❌3.12
Type Test Case Error Message Line
Failed test_detect_credential_for_string self = <azure.cli.core.tests.test_credential_helper.TestCredentialHelper testMethod=test_detect_credential_for_string>

    def test_detect_credential_for_string(self):
        with mock.patch('azure.cli.core.credential_helper.get_secret_masker', side_effect=self.get_test_secret_masker):
            creation_time = '2024-03-07T02:50:56.464790+00:00'
>           containing_credential, 
 = distinguish_credential(creation_time)

src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:37: 
                                        
src/azure-cli-core/azure/cli/core/credential_helper.py:83: in distinguish_credential
    detections = is_containing_credential(content)
src/azure-cli-core/azure/cli/core/credential_helper.py:44: in is_containing_credential
    return get_secret_masker().detect_secrets(content)
env/lib/python3.12/site-packages/microsoft_security_utilities_secret_masker/secret_masker.py:99: in detect_secrets
    detections.extend(regex_pattern.get_detections(input, self.generate_sha256_hashes))
env/lib/python3.12/site-packages/microsoft_security_utilities_secret_masker/regex_pattern.py:126: in get_detections
    for m in re.finditer(self.pattern, input, self.regex_flags):
/opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/init.py:224: in finditer
    return compile(pattern, flags).finditer(string)
/opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/init.py:307: in compile
    p = compiler.compile(pattern, flags)
/opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/compiler.py:750: in compile
    p = parser.parse(p, flags)
/opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/parser.py:979: in parse
    p = parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
/opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/parser.py:460: in parse_sub
    itemsappend(parse(source, state, verbose, nested + 1,
 
 
 
 
 
 
 
 
 
 
 
                             

source = <re._parser.Tokenizer object at 0x7fa471b39580>
state = <re._parser.State object at 0x7fa471b39520>, verbose = 0, nested = 1
first = True

    def _parse(source, state, verbose, nested, first=False):
        # parse a simple pattern
        subpattern = SubPattern(state)
    
        # precompute constants into local variables
        subpatternappend = subpattern.append
        sourceget = source.get
        sourcematch = source.match
        _len = len
        _ord = ord
    
        while True:
    
            this = source.next
            if this is None:
                break # end of pattern
            if this in "
)":
                break # end of subpattern
            sourceget()
    
            if verbose:
                # skip whitespace and comments
                if this in WHITESPACE:
                    continue
                if this == "#":
                    while True:
                        this = sourceget()
                        if this is None or this == "\n":
                            break
                    continue
    
            if this[0] == "\":
                code = _escape(source, this, state)
                subpatternappend(code)
    
            elif this not in SPECIAL_CHARS:
                subpatternappend((LITERAL, _ord(this)))
    
            elif this == "[":
                here = source.tell() - 1
                # character set
                set = []
                setappend = set.append
    ##          if sourcematch(":"):
    ##              pass # handle character classes
                if source.next == '[':
                    import warnings
                    warnings.warn(
                        'Possible nested set at position %d' % source.tell(),
                        FutureWarning, stacklevel=nested + 6
                    )
                negate = sourcematch("^")
                # check remaining characters
                while True:
                    this = sourceget()
                    if this is None:
                        raise source.error("unterminated character set",
                                           source.tell() - here)
                    if this == "]" and set:
                        break
                    elif this[0] == "\":
                        code1 = _class_escape(source, this)
                    else:
                        if set and this in '-&~
Failed test_redact_credential_for_json The error message is too long, please check the pipeline log for details. azure/cli/core/tests/test_credential_helper.py:57
Failed test_redact_credential_for_string The error message is too long, please check the pipeline log for details. azure/cli/core/tests/test_credential_helper.py:43
❌3.9
Type Test Case Error Message Line
Failed test_detect_credential_for_string self = <azure.cli.core.tests.test_credential_helper.TestCredentialHelper testMethod=test_detect_credential_for_string>

    def test_detect_credential_for_string(self):
        with mock.patch('azure.cli.core.credential_helper.get_secret_masker', side_effect=self.get_test_secret_masker):
            creation_time = '2024-03-07T02:50:56.464790+00:00'
>           containing_credential, 
 = distinguish_credential(creation_time)

src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:37: 
                                        
src/azure-cli-core/azure/cli/core/credential_helper.py:83: in distinguish_credential
    detections = is_containing_credential(content)
src/azure-cli-core/azure/cli/core/credential_helper.py:44: in is_containing_credential
    return get_secret_masker().detect_secrets(content)
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/secret_masker.py:99: in detect_secrets
    detections.extend(regex_pattern.get_detections(input, self.generate_sha256_hashes))
env/lib/python3.9/site-packages/microsoft_security_utilities_secret_masker/regex_pattern.py:126: in get_detections
    for m in re.finditer(self.pattern, input, self.regex_flags):
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:248: in finditer
    return compile(pattern, flags).finditer(string)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/re.py:304: in compile
    p = sre_compile.compile(pattern, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_compile.py:788: in compile
    p = sre_parse.parse(p, flags)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:955: in parse
    p = parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
/opt/hostedtoolcache/Python/3.9.21/x64/lib/python3.9/sre_parse.py:444: in parse_sub
    itemsappend(parse(source, state, verbose, nested + 1,
 
 
 
 
 
 
                                 _ 

source = <sre_parse.Tokenizer object at 0x7f7e7c5a86d0>
state = <sre_parse.State object at 0x7f7e7c5a8730>, verbose = 0, nested = 1
first = True

    def _parse(source, state, verbose, nested, first=False):
        # parse a simple pattern
        subpattern = SubPattern(state)
    
        # precompute constants into local variables
        subpatternappend = subpattern.append
        sourceget = source.get
        sourcematch = source.match
        _len = len
        _ord = ord
    
        while True:
    
            this = source.next
            if this is None:
                break # end of pattern
            if this in "
)":
                break # end of subpattern
            sourceget()
    
            if verbose:
                # skip whitespace and comments
                if this in WHITESPACE:
                    continue
                if this == "#":
                    while True:
                        this = sourceget()
                        if this is None or this == "\n":
                            break
                    continue
    
            if this[0] == "\":
                code = _escape(source, this, state)
                subpatternappend(code)
    
            elif this not in SPECIAL_CHARS:
                subpatternappend((LITERAL, _ord(this)))
    
            elif this == "[":
                here = source.tell() - 1
                # character set
                set = []
                setappend = set.append
    ##          if sourcematch(":"):
    ##              pass # handle character classes
                if source.next == '[':
                    import warnings
                    warnings.warn(
                        'Possible nested set at position %d' % source.tell(),
                        FutureWarning, stacklevel=nested + 6
                    )
                negate = sourcematch("^")
                # check remaining characters
                while True:
                    this = sourceget()
                    if this is None:
                        raise source.error("unterminated character set",
                                           source.tell() - here)
                    if this == "]" and set:
                        break
                    elif this[0] == "\":
                        code1 = _class_escape(source, this)
                    else:
                        if set and this in '-&~
Failed test_redact_credential_for_json The error message is too long, please check the pipeline log for details. azure/cli/core/tests/test_credential_helper.py:57
Failed test_redact_credential_for_string The error message is too long, please check the pipeline log for details. azure/cli/core/tests/test_credential_helper.py:43
🔄cosmosdb
🔄latest
🔄3.12
🔄3.9
🔄databoxedge
️✔️2019-03-01-hybrid
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.9
🔄latest
️✔️3.12
🔄3.9
🔄dla
🔄latest
️✔️3.12
🔄3.9
️✔️dls
️✔️latest
️✔️3.12
️✔️3.9
🔄dms
🔄latest
🔄3.12
🔄3.9
🔄eventgrid
🔄latest
🔄3.12
🔄3.9
🔄eventhubs
🔄latest
🔄3.12
🔄3.9
️✔️feedback
️✔️latest
️✔️3.12
️✔️3.9
🔄find
🔄latest
🔄3.12
🔄3.9
🔄hdinsight
🔄latest
🔄3.12
🔄3.9
️✔️identity
️✔️latest
️✔️3.12
️✔️3.9
️✔️iot
️✔️2019-03-01-hybrid
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
🔄keyvault
️✔️2018-03-01-hybrid
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.9
🔄latest
🔄3.12
🔄3.9
️✔️kusto
️✔️latest
️✔️3.12
️✔️3.9
️✔️lab
️✔️latest
️✔️3.12
️✔️3.9
🔄managedservices
🔄latest
🔄3.12
🔄3.9
🔄maps
🔄latest
🔄3.12
🔄3.9
🔄marketplaceordering
🔄latest
️✔️3.12
🔄3.9
🔄monitor
🔄latest
️✔️3.12
🔄3.9
🔄mysql
🔄latest
️✔️3.12
🔄3.9
🔄netappfiles
🔄latest
🔄3.12
🔄3.9
🔄network
️✔️2018-03-01-hybrid
️✔️3.9
🔄latest
️✔️3.12
🔄3.9
🔄policyinsights
🔄latest
️✔️3.12
🔄3.9
🔄privatedns
🔄latest
🔄3.12
🔄3.9
🔄profile
🔄latest
🔄3.12
🔄3.9
🔄rdbms
🔄latest
🔄3.12
🔄3.9
🔄redis
🔄latest
️✔️3.12
🔄3.9
🔄relay
🔄latest
🔄3.12
🔄3.9
🔄resource
️✔️2018-03-01-hybrid
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.9
🔄latest
️✔️3.12
🔄3.9
️✔️role
️✔️latest
️✔️3.12
️✔️3.9
🔄search
🔄latest
🔄3.12
🔄3.9
🔄security
🔄latest
🔄3.12
🔄3.9
🔄servicebus
🔄latest
️✔️3.12
🔄3.9
️✔️serviceconnector
️✔️latest
️✔️3.12
️✔️3.9
🔄servicefabric
🔄latest
🔄3.12
🔄3.9
️✔️signalr
️✔️latest
️✔️3.12
️✔️3.9
️✔️sql
️✔️latest
️✔️3.12
️✔️3.9
️✔️sqlvm
️✔️latest
️✔️3.12
️✔️3.9
🔄storage
️✔️2018-03-01-hybrid
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.9
🔄latest
🔄3.12
🔄3.9
️✔️synapse
️✔️latest
️✔️3.12
️✔️3.9
🔄telemetry
️✔️2018-03-01-hybrid
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.9
🔄latest
🔄3.12
🔄3.9
️✔️util
️✔️latest
️✔️3.12
️✔️3.9
🔄vm
️✔️2018-03-01-hybrid
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.9
🔄latest
🔄3.12
🔄3.9

@azure-client-tools-bot-prd
Copy link

azure-client-tools-bot-prd bot commented Apr 25, 2025

️✔️AzureCLI-BreakingChangeTest
️✔️Non Breaking Changes

@bebound bebound added the LTS label Apr 25, 2025
@yonzhan yonzhan requested a review from jiasli April 25, 2025 09:46
@yonzhan
Copy link
Collaborator

yonzhan commented Apr 25, 2025

LTS

@bebound bebound marked this pull request as ready for review May 6, 2025 06:51
@jiasli
Copy link
Member

jiasli commented May 6, 2025

I agree 20.04 package should be dropped from LTS.

ADO has fully removed Ubuntu 20.04 on April 30th, 2025. Continuing to release packages for 20.04 has several disadvantages:

  1. The release pipeline needs to be split for the latest version and LTS version, as they contain different built artifacts. This requires huge dev effort and future maintenance cost.
  2. Building package on End of Standard Support system put the package at risk.

@bebound bebound merged commit b63ab72 into Azure:dev-lts-2.66 Jun 4, 2025
37 of 50 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants