Skip to content

[ARM] az bicep: Install correct bicep for apple M1, M2 and respect bicep.use_binary_from_path in all commands#27194

Open
colbylwilliams wants to merge 4 commits intoAzure:devfrom
colbylwilliams:bicep-local
Open

[ARM] az bicep: Install correct bicep for apple M1, M2 and respect bicep.use_binary_from_path in all commands#27194
colbylwilliams wants to merge 4 commits intoAzure:devfrom
colbylwilliams:bicep-local

Conversation

@colbylwilliams
Copy link
Copy Markdown
Member

@colbylwilliams colbylwilliams commented Aug 18, 2023

Related command

  • az deployment group create (with bicep)
  • az bicep x

Description
The commands above and almost all other az bicep .. commands call ensure_bicep_installation(cmd.cli_ctx) which doesn't respect the bicep.use_binary_from_path and installs a new the bicep executable the .azure/bin regardless if bicep.use_binary_from_path=true.

This is annoying, but the wrong archetecure was being selected for osx arm machines, resulting in az deployment group|sub create and all az bicep xx commands failing with:

[Errno 86] Bad CPU type in executable: '/Users/colbylwilliams/.azure/bin/bicep'

Screenshot 2023-08-17 at 7 02 39 PM

{
"azure-cli": "2.50.0",
"azure-cli-core": "2.50.0",
"azure-cli-telemetry": "1.0.8",
"extensions": {
"devcenter": "2.0.0"
}
}

Testing Guide
See screenshot.

History Notes


This checklist is used to make sure that common guidelines for a pull request are followed.

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

azure-client-tools-bot-prd bot commented Aug 18, 2023

❌AzureCLI-FullTest
️✔️acr
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️acs
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️advisor
️✔️latest
️✔️3.11
️✔️3.9
️✔️ams
️✔️latest
️✔️3.11
️✔️3.9
️✔️apim
️✔️latest
️✔️3.11
️✔️3.9
️✔️appconfig
️✔️latest
️✔️3.11
️✔️3.9
️✔️appservice
️✔️latest
️✔️3.11
️✔️3.9
️✔️aro
️✔️latest
️✔️3.11
️✔️3.9
️✔️backup
️✔️latest
️✔️3.11
️✔️3.9
️✔️batch
️✔️latest
️✔️3.11
️✔️3.9
️✔️batchai
️✔️latest
️✔️3.11
️✔️3.9
️✔️billing
️✔️latest
️✔️3.11
️✔️3.9
️✔️botservice
️✔️latest
️✔️3.11
️✔️3.9
️✔️cdn
️✔️latest
️✔️3.11
️✔️3.9
️✔️cloud
️✔️latest
️✔️3.11
️✔️3.9
️✔️cognitiveservices
️✔️latest
️✔️3.11
️✔️3.9
️✔️config
️✔️latest
️✔️3.11
️✔️3.9
️✔️configure
️✔️latest
️✔️3.11
️✔️3.9
️✔️consumption
️✔️latest
️✔️3.11
️✔️3.9
️✔️container
️✔️latest
️✔️3.11
️✔️3.9
️✔️containerapp
️✔️latest
️✔️3.11
️✔️3.9
️✔️core
️✔️2018-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️cosmosdb
️✔️latest
️✔️3.11
️✔️3.9
️✔️databoxedge
️✔️2019-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️dla
️✔️latest
️✔️3.11
️✔️3.9
️✔️dls
️✔️latest
️✔️3.11
️✔️3.9
️✔️dms
️✔️latest
️✔️3.11
️✔️3.9
️✔️eventgrid
️✔️latest
️✔️3.11
️✔️3.9
️✔️eventhubs
️✔️latest
️✔️3.11
️✔️3.9
️✔️feedback
️✔️latest
️✔️3.11
️✔️3.9
️✔️find
️✔️latest
️✔️3.11
️✔️3.9
️✔️hdinsight
️✔️latest
️✔️3.11
️✔️3.9
️✔️identity
️✔️latest
️✔️3.11
️✔️3.9
️✔️iot
️✔️2019-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️keyvault
️✔️2018-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️kusto
️✔️latest
️✔️3.11
️✔️3.9
️✔️lab
️✔️latest
️✔️3.11
️✔️3.9
️✔️managedservices
️✔️latest
️✔️3.11
️✔️3.9
️✔️maps
️✔️latest
️✔️3.11
️✔️3.9
️✔️marketplaceordering
️✔️latest
️✔️3.11
️✔️3.9
️✔️monitor
️✔️latest
️✔️3.11
️✔️3.9
️✔️mysql
️✔️latest
️✔️3.11
️✔️3.9
️✔️netappfiles
️✔️latest
️✔️3.11
️✔️3.9
️✔️network
️✔️2018-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️policyinsights
️✔️latest
️✔️3.11
️✔️3.9
️✔️privatedns
️✔️latest
️✔️3.11
️✔️3.9
️✔️profile
️✔️latest
️✔️3.11
️✔️3.9
️✔️rdbms
️✔️latest
️✔️3.11
️✔️3.9
️✔️redis
️✔️latest
️✔️3.11
️✔️3.9
️✔️relay
️✔️latest
️✔️3.11
️✔️3.9
❌resource
️✔️2018-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.11
️✔️3.9
❌latest
❌3.11
Type Test Case Error Message Line
Failed test_ensure_bicep_installation_skip_download_if_installed_version_matches_release_tag self = <azure.cli.command_modules.resource.tests.latest.test_resource_bicep.TestBicep testMethod=test_ensure_bicep_installation_skip_download_if_installed_version_matches_release_tag>
dirname_mock = <MagicMock name='dirname' id='140685567978320'>
get_bicep_installed_version_stub = <MagicMock name='get_bicep_installed_version' id='140685576252240'>
isfile_stub = <MagicMock name='isfile' id='140685569450320'>

    @mock.patch("os.path.isfile")
    @mock.patch("azure.cli.command_modules.resource.bicep.get_bicep_installed_version")
    @mock.patch("os.path.dirname")
    def test_ensure_bicep_installation_skip_download_if_installed_version_matches_release_tag(
        self, dirname_mock, get_bicep_installed_version_stub, isfile_stub
    ):
        get_bicep_installed_version_stub.return_value = semver.VersionInfo.parse("0.1.0")
        isfile_stub.return_value = True
    
        ensure_bicep_installation(self.cli_ctx, release_tag="v0.1.0")
    
>       dirname_mock.assert_not_called()

src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:164: 
 
 
 
 
 
                                   

self = <MagicMock name='dirname' id='140685567978320'>

    def assert_not_called(self):
        """assert that the mock was never called.
        """
        if self.call_count != 0:
            msg = ("Expected '%s' to not have been called. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
>           raise AssertionError(msg)
E           AssertionError: Expected 'dirname' to not have been called. Called 1 times.
E           Calls: [call('bicep'), call().bool()].

/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/unittest/mock.py:900: AssertionError
azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:152
Failed test_run_bicep_command_raise_error_if_not_installed_and_not_auto_install self = <azure.cli.command_modules.resource.tests.latest.test_resource_bicep.TestBicep testMethod=test_run_bicep_command_raise_error_if_not_installed_and_not_auto_install>
isfile_stub = <MagicMock name='isfile' id='140685567978320'>

    @mock.patch("os.path.isfile")
    def test_run_bicep_command_raise_error_if_not_installed_and_not_auto_install(self, isfile_stub):
        isfile_stub.return_value = False
    
        with contextlib.suppress(FileNotFoundError):
>           remove_bicep_installation(self.cli_ctx)

src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:33: 
                                        

cli_ctx = <azure.cli.core.mock.DummyCli object at 0x7ff3e94b5ed0>

    def remove_bicep_installation(cli_ctx):
        system = platform.system()
        bicep_executable_path = _get_bicep_executable_path(cli_ctx, system)
    
        if not _is_bicep_installation_path(bicep_executable_path, system):
>           raise ValidationError(
                f'The bicep executable "{bicep_executable_path}" is not managed by Azure CLI. To install Bicep via Azure CLI, set the "bicep.use_binary_from_path" configuration to False and run "az bicep install".'  # pylint: disable=line-too-long
            )
E           azure.cli.core.azclierror.ValidationError: The bicep executable "/usr/local/bin/bicep" is not managed by Azure CLI. To install Bicep via Azure CLI, set the "bicep.use_binary_from_path" configuration to False and run "az bicep install".

src/azure-cli/azure/cli/command_modules/resource/_bicep.py:157: ValidationError
azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:27
Failed test_run_bicep_command_use_bicep_cli_from_path_in_ci self = <azure.cli.command_modules.resource.tests.latest.test_resource_bicep.TestBicep testMethod=test_run_bicep_command_use_bicep_cli_from_path_in_ci>
which_stub = <MagicMock name='which' id='140685567978320'>
run_command_stub = <MagicMock name='run_command' id='140685566882448'>
debug_mock = <MagicMock name='debug' id='140685567937872'>

    @mock.patch.dict(os.environ, {"GITHUB_ACTIONS": "true"}, clear=True)
    @mock.patch("azure.cli.command_modules.resource.bicep.logger.debug")
    @mock.patch("azure.cli.command_modules.resource.bicep.run_command")
    @mock.patch("shutil.which")
    def test_run_bicep_command_use_bicep_cli_from_path_in_ci(self, which_stub, run_command_stub, debug_mock):
        which_stub.return_value = True
        run_command_stub.return_value = "Bicep CLI version 0.13.1 (e3ac80d678)"
        self.cli_ctx.config.set_value("bicep", "use_binary_from_path", "if_found_in_ci")
    
        run_bicep_command(self.cli_ctx, ["--version"], auto_install=False)
    
>       debug_mock.assert_called_with(
            "Using Bicep CLI from PATH. %s",
            "Bicep CLI version 0.13.1 (e3ac80d678)",
        )

src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:92: 
 
 
 
 
                                    
/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/unittest/mock.py:937: in assert_called_with
    if actual != expected:
/opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/unittest/mock.py:2572: in eq
    return (other_args, other_kwargs) == (self_args, self_kwargs)
env/lib/python3.11/site-packages/semver.py:203: in wrapper
    return operator(self, other)
env/lib/python3.11/site-packages/semver.py:573: in eq
    return self.compare(other) == 0
env/lib/python3.11/site-packages/semver.py:493: in compare
    other = cls.parse(other)
                                       _ 

cls = <class 'semver.VersionInfo'>
version = 'Bicep CLI version 0.13.1 (e3ac80d678)'

        @classmethod
        def parse(cls, version):
            """
            Parse version string to a VersionInfo instance.
    
            :param version: version string
            :return: a :class:VersionInfo instance
            :raises: :class:ValueError
            :rtype: :class:VersionInfo
    
            .. versionchanged:: 2.11.0
               Changed method from static to classmethod to
               allow subclasses.
    
            >>> semver.VersionInfo.parse('3.4.5-pre.2+build.4')
            VersionInfo(major=3, minor=4, patch=5, <br>    prerelease='pre.2', build='build.4')
            """
            match = cls._REGEX.match(ensure_str(version))
            if match is None:
>               raise ValueError("%s is not valid SemVer string" % version)
E               ValueError: Bicep CLI version 0.13.1 (e3ac80d678) is not valid SemVer string

env/lib/python3.11/site-packages/semver.py:726: ValueError
azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:80
❌3.9
Type Test Case Error Message Line
Failed test_ensure_bicep_installation_skip_download_if_installed_version_matches_release_tag self = <azure.cli.command_modules.resource.tests.latest.test_resource_bicep.TestBicep testMethod=test_ensure_bicep_installation_skip_download_if_installed_version_matches_release_tag>
dirname_mock = <MagicMock name='dirname' id='139653943684400'>
get_bicep_installed_version_stub = <MagicMock name='get_bicep_installed_version' id='139653944546448'>
isfile_stub = <MagicMock name='isfile' id='139653944334512'>

    @mock.patch("os.path.isfile")
    @mock.patch("azure.cli.command_modules.resource.bicep.get_bicep_installed_version")
    @mock.patch("os.path.dirname")
    def test_ensure_bicep_installation_skip_download_if_installed_version_matches_release_tag(
        self, dirname_mock, get_bicep_installed_version_stub, isfile_stub
    ):
        get_bicep_installed_version_stub.return_value = semver.VersionInfo.parse("0.1.0")
        isfile_stub.return_value = True
    
        ensure_bicep_installation(self.cli_ctx, release_tag="v0.1.0")
    
>       dirname_mock.assert_not_called()

src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:164: 
 
 
 
 
 
                                   

self = <MagicMock name='dirname' id='139653943684400'>

    def assert_not_called(self):
        """assert that the mock was never called.
        """
        if self.call_count != 0:
            msg = ("Expected '%s' to not have been called. Called %s times.%s"
                   % (self._mock_name or 'mock',
                      self.call_count,
                      self._calls_repr()))
>           raise AssertionError(msg)
E           AssertionError: Expected 'dirname' to not have been called. Called 1 times.
E           Calls: [call('bicep'), call().bool()].

/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/unittest/mock.py:868: AssertionError
azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:152
Failed test_run_bicep_command_raise_error_if_not_installed_and_not_auto_install self = <azure.cli.command_modules.resource.tests.latest.test_resource_bicep.TestBicep testMethod=test_run_bicep_command_raise_error_if_not_installed_and_not_auto_install>
isfile_stub = <MagicMock name='isfile' id='139653944496192'>

    @mock.patch("os.path.isfile")
    def test_run_bicep_command_raise_error_if_not_installed_and_not_auto_install(self, isfile_stub):
        isfile_stub.return_value = False
    
        with contextlib.suppress(FileNotFoundError):
>           remove_bicep_installation(self.cli_ctx)

src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:33: 
                                        

cli_ctx = <azure.cli.core.mock.DummyCli object at 0x7f03b7b4a400>

    def remove_bicep_installation(cli_ctx):
        system = platform.system()
        bicep_executable_path = _get_bicep_executable_path(cli_ctx, system)
    
        if not _is_bicep_installation_path(bicep_executable_path, system):
>           raise ValidationError(
                f'The bicep executable "{bicep_executable_path}" is not managed by Azure CLI. To install Bicep via Azure CLI, set the "bicep.use_binary_from_path" configuration to False and run "az bicep install".'  # pylint: disable=line-too-long
            )
E           azure.cli.core.azclierror.ValidationError: The bicep executable "/usr/local/bin/bicep" is not managed by Azure CLI. To install Bicep via Azure CLI, set the "bicep.use_binary_from_path" configuration to False and run "az bicep install".

src/azure-cli/azure/cli/command_modules/resource/_bicep.py:157: ValidationError
azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:27
Failed test_run_bicep_command_use_bicep_cli_from_path_in_ci self = <azure.cli.command_modules.resource.tests.latest.test_resource_bicep.TestBicep testMethod=test_run_bicep_command_use_bicep_cli_from_path_in_ci>
which_stub = <MagicMock name='which' id='139654092239680'>
run_command_stub = <MagicMock name='run_command' id='139654092153568'>
debug_mock = <MagicMock name='debug' id='139653944496192'>

    @mock.patch.dict(os.environ, {"GITHUB_ACTIONS": "true"}, clear=True)
    @mock.patch("azure.cli.command_modules.resource.bicep.logger.debug")
    @mock.patch("azure.cli.command_modules.resource.bicep.run_command")
    @mock.patch("shutil.which")
    def test_run_bicep_command_use_bicep_cli_from_path_in_ci(self, which_stub, run_command_stub, debug_mock):
        which_stub.return_value = True
        run_command_stub.return_value = "Bicep CLI version 0.13.1 (e3ac80d678)"
        self.cli_ctx.config.set_value("bicep", "use_binary_from_path", "if_found_in_ci")
    
        run_bicep_command(self.cli_ctx, ["--version"], auto_install=False)
    
>       debug_mock.assert_called_with(
            "Using Bicep CLI from PATH. %s",
            "Bicep CLI version 0.13.1 (e3ac80d678)",
        )

src/azure-cli/azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:92: 
 
 
 
 
                                    
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/unittest/mock.py:905: in assert_called_with
    if actual != expected:
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/unittest/mock.py:2488: in eq
    return (other_args, other_kwargs) == (self_args, self_kwargs)
env/lib/python3.9/site-packages/semver.py:203: in wrapper
    return operator(self, other)
env/lib/python3.9/site-packages/semver.py:573: in eq
    return self.compare(other) == 0
env/lib/python3.9/site-packages/semver.py:493: in compare
    other = cls.parse(other)
                                       _ 

cls = <class 'semver.VersionInfo'>
version = 'Bicep CLI version 0.13.1 (e3ac80d678)'

        @classmethod
        def parse(cls, version):
            """
            Parse version string to a VersionInfo instance.
    
            :param version: version string
            :return: a :class:VersionInfo instance
            :raises: :class:ValueError
            :rtype: :class:VersionInfo
    
            .. versionchanged:: 2.11.0
               Changed method from static to classmethod to
               allow subclasses.
    
            >>> semver.VersionInfo.parse('3.4.5-pre.2+build.4')
            VersionInfo(major=3, minor=4, patch=5, <br>    prerelease='pre.2', build='build.4')
            """
            match = cls._REGEX.match(ensure_str(version))
            if match is None:
>               raise ValueError("%s is not valid SemVer string" % version)
E               ValueError: Bicep CLI version 0.13.1 (e3ac80d678) is not valid SemVer string

env/lib/python3.9/site-packages/semver.py:726: ValueError
azure/cli/command_modules/resource/tests/latest/test_resource_bicep.py:80
️✔️role
️✔️latest
️✔️3.11
️✔️3.9
️✔️search
️✔️latest
️✔️3.11
️✔️3.9
️✔️security
️✔️latest
️✔️3.11
️✔️3.9
️✔️servicebus
️✔️latest
️✔️3.11
️✔️3.9
️✔️serviceconnector
️✔️latest
️✔️3.11
️✔️3.9
️✔️servicefabric
️✔️latest
️✔️3.11
️✔️3.9
️✔️signalr
️✔️latest
️✔️3.11
️✔️3.9
️✔️sql
️✔️latest
️✔️3.11
️✔️3.9
️✔️sqlvm
️✔️latest
️✔️3.11
️✔️3.9
️✔️storage
️✔️2018-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️synapse
️✔️latest
️✔️3.11
️✔️3.9
️✔️telemetry
️✔️2018-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9
️✔️util
️✔️latest
️✔️3.11
️✔️3.9
️✔️vm
️✔️2018-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.11
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.11
️✔️3.9
️✔️latest
️✔️3.11
️✔️3.9

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

azure-client-tools-bot-prd bot commented Aug 18, 2023

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

@yonzhan
Copy link
Copy Markdown
Collaborator

yonzhan commented Aug 18, 2023

Resource

@microsoft-github-policy-service microsoft-github-policy-service bot added the Auto-Assign Auto assign by bot label Aug 18, 2023
@microsoft-github-policy-service microsoft-github-policy-service bot added the ARM az resource/group/lock/tag/deployment/policy/managementapp/account management-group label Aug 18, 2023
@zhoxing-ms zhoxing-ms changed the title [Resource] Install correct bicep for apple M1, M2 and respect bicep.use_binary_from_path in all commands [ARM] az bicep: Install correct bicep for apple M1, M2 and respect bicep.use_binary_from_path in all commands Aug 29, 2023
@zhoxing-ms
Copy link
Copy Markdown
Contributor

@colbylwilliams Please resolve these CI issues

@zhoxing-ms
Copy link
Copy Markdown
Contributor

@shenglol Could you please help take a look at this PR?

@colbylwilliams
Copy link
Copy Markdown
Member Author

@zhoxing-ms @shenglol can you please help resolve the CI issues. Unfortunately, I'm having trouble finding time to commit to this.

@zhoxing-ms
Copy link
Copy Markdown
Contributor

I am so sorry, because we have been super busy with the top priority project Azure Copilot recently, and the end of September is the Mid-Autumn Festival holiday in China, I am afraid we do not have enough time and bandwidth to review this PR.
If your PR is not very urgent, we would like to postpone it to the next sprint (the release date is 11-15) for review, do you think this time is acceptable?

@colbylwilliams
Copy link
Copy Markdown
Member Author

I am so sorry, because we have been super busy with the top priority project Azure Copilot recently, and the end of September is the Mid-Autumn Festival holiday in China, I am afraid we do not have enough time and bandwidth to review this PR. If your PR is not very urgent, we would like to postpone it to the next sprint (the release date is 11-15) for review, do you think this time is acceptable?

@zhoxing-ms I don't think this is acceptable. Users on Apple computers with M1 or M2, cannot use the built-in bicep functionality of the Azure CLI. Without this fix, az cli attempts to install the wrong architecture bicep binaries, and throws errors.

The (failing) workaround would be to manually install correct (arm64) bicep binaries and tell az cli to use those instead using bicep.use_binary_from_path. This also doesn't work because currently az cli does not respect the bicep.use_binary_from_path value. This PR also fixes this.

These issues prevent all users on Apple M1 and M2 from using azure cli + bicep.

@zhoxing-ms
Copy link
Copy Markdown
Contributor

Add @yanzhudd to help take a look at this PR~

@zhoxing-ms
Copy link
Copy Markdown
Contributor

@colbylwilliams Could you please resolve these conflicts?

@colbylwilliams
Copy link
Copy Markdown
Member Author

colbylwilliams commented Apr 2, 2024

@zhoxing-ms please review and merge. Conflicts have been resolved.

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

Labels

act-identity-squad ARM az resource/group/lock/tag/deployment/policy/managementapp/account management-group Auto-Assign Auto assign by bot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants