KEMBAR78
Add emulator process kill timeout with ADB restart and comprehensive timeout protection by Copilot · Pull Request #30941 · dotnet/maui · GitHub
Skip to content

Conversation

Copilot
Copy link
Contributor

@Copilot Copilot AI commented Jul 30, 2025

The Android emulator process kill operation in the build automation script can hang indefinitely, causing CI/CD pipelines and local builds to get stuck. When emulatorProcess.Kill() fails to complete, there's no recovery mechanism, leading to build timeouts and requiring manual intervention.

A specific issue also occurs during emulator boot where authorization problems manifest around 90 seconds with errors like:

adb: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.

Additionally, various ADB commands in the PrepareDevice function can hang indefinitely, causing the entire device preparation process to fail without recovery.

Solution

This PR implements comprehensive timeout mechanisms and error handling for both emulator cleanup operations and device preparation with automatic ADB server restart as a recovery strategy, including targeted intervention for boot-time authorization issues.

Changes Made

Added emulator kill timeout protection:

  • Introduced EmulatorKillTimeoutSeconds = 1 * 60 constant following existing timeout patterns
  • Wrapped emulatorProcess.Kill() operation itself with timeout using Task.Run() to prevent indefinite hanging
  • Added separate timeout for WaitForExit() to ensure process actually terminates
  • Uses proper process termination pattern to avoid background hanging operations
  • Maintains synchronous behavior to avoid complications with Cake teardown logic

Implemented ADB recovery for emulator cleanup:

  • On timeout, automatically attempts to restart the ADB server using existing AdbKillServer() and AdbStartServer() methods
  • Includes proper delays (2 seconds) consistent with other ADB operations in the codebase
  • Graceful error handling for both timeout and restart failures

Added targeted ADB server restart during emulator boot wait:

  • At exactly 90 seconds during emulator boot wait, restart the ADB server to recover from authorization issues
  • Addresses specific scenarios where "adb: device unauthorized" and "This adb server's $ADB_VENDOR_KEYS is not set" occur
  • Continues with existing recovery logic at 60-second intervals for ADB keys
  • Provides clear logging for troubleshooting boot wait issues

Added comprehensive timeout protection for PrepareDevice function:

  • Introduced AdbCommandTimeoutSeconds = 30 constant for ADB command timeouts
  • Created SafeAdbShell() and SafeAdbLogcat() helper functions with timeout protection
  • Updated PrepareDevice to use safe ADB operations with proper error handling
  • Added try-catch blocks around EnsureAdbKeys, logcat setup, and property configuration
  • Operations now continue gracefully on non-critical failures instead of throwing

Enhanced logging throughout:

  • Clear success/failure messages for all timeout and recovery operations
  • Detailed progress tracking during ADB server restarts
  • Specific messaging for boot wait ADB recovery attempts

Benefits

  • Prevents indefinite hangs: Both emulator cleanup and device preparation will no longer get stuck waiting for process termination or ADB commands
  • Automatic recovery: ADB server restart often resolves connectivity issues that cause operations to hang
  • Targeted intervention: Specific recovery at 90 seconds addresses common authorization issues during emulator boot
  • Better observability: Clear logging helps diagnose and track cleanup and preparation operations
  • Minimal impact: Only affects problematic scenarios, all other logic remains unchanged
  • Follows patterns: Uses existing timeout constants, logging methods, and ADB restart functions
  • Proper process handling: Uses correct Kill() + WaitForExit() pattern for reliable process termination

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

This pull request was created as a result of the following prompt from Copilot chat.

Modify the file eng/devices/android.cake so that on the line:

try { emulatorProcess.Kill(); }
catch { }

if emulatorProcess.Kill() takes longer than one minute to complete, it should fail. If it fails, the script should then attempt to restart the ADB server or process.

Requirements:

  • Use a timeout mechanism (e.g., Task or Thread constructs) to enforce the one-minute limit.
  • If the timeout is reached, log an error or warning, and then invoke a function or command to restart ADB (such as AdbKillServer/AdbStartServer or equivalent).
  • Provide clear logging for both timeout and restart actions.
  • Make sure the rest of the CleanUpVirtualDevice logic is unchanged.

Create a PR for this change in dotnet/maui.


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

@Copilot Copilot AI changed the title [WIP] Add timeout and ADB restart for emulatorProcess.Kill() in android.cake Add timeout and ADB restart for Android emulator process kill operation Jul 30, 2025
@Copilot Copilot AI requested a review from PureWeen July 30, 2025 23:47
Copilot finished work on behalf of PureWeen July 30, 2025 23:47
@PureWeen
Copy link
Member

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@PureWeen
Copy link
Member


   at Submission#0.PrepareDevice(Boolean waitForBoot)
   at Submission#0.InstallApk(String testApp, String testAppPackageName, String testResultsDirectory, String skin)
   at Submission#0.ExecutePrepareUITests(String project, String app, String appPackageName, String device, String resultsDir, String binDir, String config, String tfm, String rid, String ver, String toolPath, String instrumentation)
   at Submission#0.<<Initialize>>b__0_25()
   at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass36_0.<Does>b__0(ICakeContext _) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 26
   at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass39_0.<Does>b__0(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 81
   at Cake.Core.CakeTask.Execute(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTask.cs:line 119
   at Cake.Core.DefaultExecutionStrategy.ExecuteAsync(CakeTask task, ICakeContext context) in C:\projects\cake\src\Cake.Core\DefaultExecutionStrategy.cs:line 69
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 318
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 341
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 353
   at Cake.Core.CakeEngine.RunTask(ICakeContext context, IExecutionStrategy strategy, CakeTask task, String target, Stopwatch stopWatch, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 254
   at Cake.Core.CakeEngine.RunTarget(ICakeContext context, IExecutionStrategy strategy, CakeTask[] orderedTasks, String target, Boolean exclusive, Stopwatch stopWatch, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 229
   at Cake.Core.CakeEngine.RunTargetAsync(ICakeContext context, IExecutionStrategy strategy, ExecutionSettings settings) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 199
   at Cake.Cli.BuildScriptHost`1.internalRunTargetAsync() in C:\projects\cake\src\Cake.Cli\Hosts\BuildScriptHost.cs:line 87
   at Cake.Cli.BuildScriptHost`1.RunTargetAsync(String target) in C:\projects\cake\src\Cake.Cli\Hosts\BuildScriptHost.cs:line 74
   at Cake.Core.Scripting.ScriptHost.RunTarget(String target) in C:\projects\cake\src\Cake.Core\Scripting\ScriptHost.cs:line 110
   at Submission#0.<<Initialize>>d__0.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.CodeAnalysis.Scripting.ScriptExecutionState.RunSubmissionsAsync[TResult](ImmutableArray`1 precedingExecutors, Func`2 currentExecutor, StrongBox`1 exceptionHolderOpt, Func`2 catchExceptionOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Scripting.Script`1.RunSubmissionsAsync(ScriptExecutionState executionState, ImmutableArray`1 precedingExecutors, Func`2 currentExecutor, Func`2 catchExceptionOpt, CancellationToken cancellationToken)
   at Cake.Infrastructure.Scripting.RoslynScriptSession.Execute(Script script) in C:\projects\cake\src\Cake\Infrastructure\Scripting\RoslynScriptSession.cs:line 206
   at Cake.Core.Scripting.ScriptRunner.Run(IScriptHost host, FilePath scriptPath) in C:\projects\cake\src\Cake.Core\Scripting\ScriptRunner.cs:line 172
   at Cake.Features.Building.BuildFeature.RunCore(ICakeArguments arguments, BuildFeatureSettings settings) in C:\projects\cake\src\Cake\Features\Building\BuildFeature.cs:line 99
   at Cake.Features.Building.BuildFeature.Run(ICakeArguments arguments, BuildFeatureSettings settings) in C:\projects\cake\src\Cake\Features\Building\BuildFeature.cs:line 49
   at Cake.Commands.DefaultCommand.Execute(CommandContext context, DefaultCommandSettings settings) in C:\projects\cake\src\Cake\Commands\DefaultCommand.cs:line 76

Copy link
Member

@PureWeen PureWeen left a comment

Choose a reason for hiding this comment

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

This is looking good

Can you address this exception as well?


   at Submission#0.PrepareDevice(Boolean waitForBoot)
   at Submission#0.InstallApk(String testApp, String testAppPackageName, String testResultsDirectory, String skin)
   at Submission#0.ExecutePrepareUITests(String project, String app, String appPackageName, String device, String resultsDir, String binDir, String config, String tfm, String rid, String ver, String toolPath, String instrumentation)
   at Submission#0.<<Initialize>>b__0_25()
   at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass36_0.<Does>b__0(ICakeContext _) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 26
   at Cake.Core.CakeTaskBuilderExtensions.<>c__DisplayClass39_0.<Does>b__0(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTaskBuilder.Execution.cs:line 81
   at Cake.Core.CakeTask.Execute(ICakeContext context) in C:\projects\cake\src\Cake.Core\CakeTask.cs:line 119
   at Cake.Core.DefaultExecutionStrategy.ExecuteAsync(CakeTask task, ICakeContext context) in C:\projects\cake\src\Cake.Core\DefaultExecutionStrategy.cs:line 69
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 318
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 341
   at Cake.Core.CakeEngine.ExecuteTaskAsync(ICakeContext context, IExecutionStrategy strategy, Stopwatch stopWatch, CakeTask task, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 353
   at Cake.Core.CakeEngine.RunTask(ICakeContext context, IExecutionStrategy strategy, CakeTask task, String target, Stopwatch stopWatch, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 254
   at Cake.Core.CakeEngine.RunTarget(ICakeContext context, IExecutionStrategy strategy, CakeTask[] orderedTasks, String target, Boolean exclusive, Stopwatch stopWatch, CakeReport report) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 229
   at Cake.Core.CakeEngine.RunTargetAsync(ICakeContext context, IExecutionStrategy strategy, ExecutionSettings settings) in C:\projects\cake\src\Cake.Core\CakeEngine.cs:line 199
   at Cake.Cli.BuildScriptHost`1.internalRunTargetAsync() in C:\projects\cake\src\Cake.Cli\Hosts\BuildScriptHost.cs:line 87
   at Cake.Cli.BuildScriptHost`1.RunTargetAsync(String target) in C:\projects\cake\src\Cake.Cli\Hosts\BuildScriptHost.cs:line 74
   at Cake.Core.Scripting.ScriptHost.RunTarget(String target) in C:\projects\cake\src\Cake.Core\Scripting\ScriptHost.cs:line 110
   at Submission#0.<<Initialize>>d__0.MoveNext()
--- End of stack trace from previous location ---
   at Microsoft.CodeAnalysis.Scripting.ScriptExecutionState.RunSubmissionsAsync[TResult](ImmutableArray`1 precedingExecutors, Func`2 currentExecutor, StrongBox`1 exceptionHolderOpt, Func`2 catchExceptionOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Scripting.Script`1.RunSubmissionsAsync(ScriptExecutionState executionState, ImmutableArray`1 precedingExecutors, Func`2 currentExecutor, Func`2 catchExceptionOpt, CancellationToken cancellationToken)
   at Cake.Infrastructure.Scripting.RoslynScriptSession.Execute(Script script) in C:\projects\cake\src\Cake\Infrastructure\Scripting\RoslynScriptSession.cs:line 206
   at Cake.Core.Scripting.ScriptRunner.Run(IScriptHost host, FilePath scriptPath) in C:\projects\cake\src\Cake.Core\Scripting\ScriptRunner.cs:line 172
   at Cake.Features.Building.BuildFeature.RunCore(ICakeArguments arguments, BuildFeatureSettings settings) in C:\projects\cake\src\Cake\Features\Building\BuildFeature.cs:line 99
   at Cake.Features.Building.BuildFeature.Run(ICakeArguments arguments, BuildFeatureSettings settings) in C:\projects\cake\src\Cake\Features\Building\BuildFeature.cs:line 49
   at Cake.Commands.DefaultCommand.Execute(CommandContext context, DefaultCommandSettings settings) in C:\projects\cake\src\Cake\Commands\DefaultCommand.cs:line 76

@Copilot
Copy link
Contributor Author

Copilot AI commented Jul 31, 2025

This is looking good

Can you address this exception as well?
...

I've added comprehensive timeout protection and error handling to the PrepareDevice function to address the exception you mentioned. The changes include:

  • Added AdbCommandTimeoutSeconds = 30 constant for ADB command timeouts
  • Created SafeAdbShell() and SafeAdbLogcat() helper functions with timeout protection
  • Updated PrepareDevice to use safe ADB operations with proper error handling
  • Added try-catch blocks around EnsureAdbKeys, logcat setup, and property configuration
  • Operations now continue gracefully on non-critical failures instead of throwing

These changes should prevent the PrepareDevice function from hanging indefinitely and provide better resilience in CI/CD environments. Commit: 5cb4cba

@Copilot Copilot AI changed the title Add timeout and ADB restart for Android emulator process kill operation Add timeout protection and error handling for Android emulator operations and device preparation Jul 31, 2025
@Copilot Copilot AI requested a review from PureWeen July 31, 2025 17:48
Copilot finished work on behalf of PureWeen July 31, 2025 17:48
@PureWeen
Copy link
Member

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

Copy link
Member

@PureWeen PureWeen left a comment

Choose a reason for hiding this comment

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

once this is happening

Otherwise check for a confirmation dialog on your device.
Waiting 90/120 seconds for the emulator to boot up.
Resolved tool to path /usr/local/lib/android/sdk/platform-tools/adb
Resolved tool to path /usr/local/lib/android/sdk/platform-tools/adb
Executing: /usr/local/lib/android/sdk/platform-tools/adb shell getprop sys.boot_completed
adb: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.
Waiting 91/120 seconds for the emulator to boot up.

Once it gets to about 91/120 let's have it restart the adb server and then keep trying again from that point

@Copilot
Copy link
Contributor Author

Copilot AI commented Jul 31, 2025

once this is happening

Otherwise check for a confirmation dialog on your device.

...

I've added targeted ADB server restart at exactly 90 seconds during emulator boot wait to address the authorization issues you mentioned. The implementation:

  • Detects when emulator boot reaches 90/120 seconds
  • Restarts the ADB server (kill + start with proper delays)
  • Continues with normal boot wait and existing 60-second recovery logic
  • Provides clear logging for troubleshooting

This should resolve the "adb: device unauthorized" and "$ADB_VENDOR_KEYS is not set" issues that occur around 91/120 seconds. Commit: 6a3975b

@Copilot Copilot AI changed the title Add timeout protection and error handling for Android emulator operations and device preparation Add comprehensive timeout protection and error handling for Android emulator operations with targeted ADB recovery Jul 31, 2025
@Copilot Copilot AI requested a review from PureWeen July 31, 2025 20:26
Copilot finished work on behalf of PureWeen July 31, 2025 20:26
@PureWeen
Copy link
Member

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@PureWeen
Copy link
Member

PureWeen commented Aug 1, 2025

/azp run

@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

@Copilot Copilot AI changed the title Add comprehensive timeout protection and error handling for Android emulator operations with targeted ADB recovery Add comprehensive timeout protection and error handling for Android emulator operations with proper process termination Aug 1, 2025
@Copilot Copilot AI requested a review from PureWeen August 4, 2025 13:29
@PureWeen
Copy link
Member

PureWeen commented Aug 4, 2025

/azp run

@PureWeen PureWeen marked this pull request as ready for review August 4, 2025 18:17
@Copilot Copilot AI review requested due to automatic review settings August 4, 2025 18:17
@PureWeen PureWeen requested a review from a team as a code owner August 4, 2025 18:17
@azure-pipelines
Copy link

Azure Pipelines successfully started running 3 pipeline(s).

Copy link
Contributor

@Copilot Copilot AI left a comment

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 comprehensive timeout protection and recovery mechanisms to Android emulator management in the build automation script. The changes address critical issues where emulator process operations and ADB commands can hang indefinitely, causing CI/CD pipelines to get stuck.

Key changes include:

  • Timeout protection for emulator kill operations with automatic ADB server restart recovery
  • Safe wrapper functions for ADB commands with timeout handling
  • Targeted ADB server restart at 90 seconds during emulator boot to address authorization issues

@rmarinho rmarinho merged commit 6fecaea into main Aug 5, 2025
129 of 130 checks passed
@rmarinho rmarinho deleted the copilot/fix-965111f7-5348-4862-bb26-2450cb7acb23 branch August 5, 2025 09:12
SuthiYuvaraj pushed a commit to SuthiYuvaraj/maui that referenced this pull request Aug 12, 2025
…timeout protection (dotnet#30941)

* Initial plan

* Implement emulator process kill timeout with ADB restart functionality

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Add timeout protection and error handling to PrepareDevice function

- Added AdbCommandTimeoutSeconds constant (30 seconds) following existing timeout patterns
- Created SafeAdbShell helper function with timeout protection for ADB shell commands
- Created SafeAdbLogcat helper function with timeout protection for logcat operations
- Updated PrepareDevice function to use safe ADB operations with proper error handling
- Added try-catch blocks around EnsureAdbKeys, logcat setup, and property configuration
- Operations continue gracefully on non-critical failures (logcat, properties) instead of throwing
- Maintains existing functionality while preventing indefinite hangs in CI/CD environments

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Add ADB server restart at 90 seconds during emulator boot wait to recover from authorization issues

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Fix emulator process kill timeout mechanism to use WaitForExit instead of Task.Run

Co-authored-by: jsuarezruiz <6755973+jsuarezruiz@users.noreply.github.com>

* Fix AndroidEmulatorProcess WaitForExit compilation error by using Task.Run on WaitForExit instead of Kill

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Remove timeout protection from PrepareDevice function as requested

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Revert removal of timeout protection from PrepareDevice function

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Remove non-android.cake formatting changes and wrap emulator Kill() operation with timeout

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: jsuarezruiz <6755973+jsuarezruiz@users.noreply.github.com>
rmarinho pushed a commit that referenced this pull request Aug 13, 2025
…timeout protection (#30941)

* Initial plan

* Implement emulator process kill timeout with ADB restart functionality

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Add timeout protection and error handling to PrepareDevice function

- Added AdbCommandTimeoutSeconds constant (30 seconds) following existing timeout patterns
- Created SafeAdbShell helper function with timeout protection for ADB shell commands
- Created SafeAdbLogcat helper function with timeout protection for logcat operations
- Updated PrepareDevice function to use safe ADB operations with proper error handling
- Added try-catch blocks around EnsureAdbKeys, logcat setup, and property configuration
- Operations continue gracefully on non-critical failures (logcat, properties) instead of throwing
- Maintains existing functionality while preventing indefinite hangs in CI/CD environments

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Add ADB server restart at 90 seconds during emulator boot wait to recover from authorization issues

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Fix emulator process kill timeout mechanism to use WaitForExit instead of Task.Run

Co-authored-by: jsuarezruiz <6755973+jsuarezruiz@users.noreply.github.com>

* Fix AndroidEmulatorProcess WaitForExit compilation error by using Task.Run on WaitForExit instead of Kill

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Remove timeout protection from PrepareDevice function as requested

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Revert removal of timeout protection from PrepareDevice function

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

* Remove non-android.cake formatting changes and wrap emulator Kill() operation with timeout

Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: PureWeen <5375137+PureWeen@users.noreply.github.com>
Co-authored-by: jsuarezruiz <6755973+jsuarezruiz@users.noreply.github.com>
@PureWeen PureWeen added the area-infrastructure CI, Maestro / Coherency, upstream dependencies/versions label Aug 20, 2025
@github-actions github-actions bot locked and limited conversation to collaborators Sep 20, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-infrastructure CI, Maestro / Coherency, upstream dependencies/versions

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants