diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c93fd0d30..dc3728707 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -54,7 +54,11 @@ jobs:
         run: dotnet build -c "${{ matrix.configuration }}" -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER
 
       - name: Test
-        run: dotnet test --no-build -c "${{ matrix.configuration }}"
+        uses: TSRBerry/unstable-commands@v1
+        with:
+          commands: dotnet test --no-build -c "${{ matrix.configuration }}"
+          timeout-minutes: 10
+          retry-codes: 139
 
       - name: Publish Ryujinx
         run: dotnet publish -c "${{ matrix.configuration }}" -r "${{ matrix.DOTNET_RUNTIME_IDENTIFIER }}" -o ./publish -p:Version="${{ env.RYUJINX_BASE_VERSION }}" -p:DebugType=embedded -p:SourceRevisionId="${{ steps.git_short_hash.outputs.result }}" -p:ExtraDefineConstants=DISABLE_UPDATER src/Ryujinx --self-contained true
@@ -141,4 +145,4 @@ jobs:
         with:
           name: ava-ryujinx-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
           path: "publish_ava/*.tar.gz"
-        if: github.event_name == 'pull_request'
\ No newline at end of file
+        if: github.event_name == 'pull_request'
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index c34d196f2..94d0a342b 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -40,23 +40,23 @@ jobs:
         run: |
           dotnet format whitespace --verify-no-changes --report ./whitespace-report.json -v d
 
+      # For some unknown reason this step sometimes fails with exit code 139 (segfault?),
+      # so in that case we'll try again (3 tries max).
       - name: Run dotnet format style
-        run: |
-          dotnet format style --severity info --verify-no-changes --report ./style-report.json -v d
+        uses: TSRBerry/unstable-commands@v1
+        with:
+          commands: dotnet format style --severity info --verify-no-changes --report ./style-report.json -v d
+          timeout-minutes: 5
+          retry-codes: 139
 
-      # For some reason this step sometimes fails with exit code 139 (segfault?),
-      # so should that be the case we'll try again (3 tries max).
+      # For some unknown reason this step sometimes fails with exit code 139 (segfault?),
+      # so in that case we'll try again (3 tries max).
       - name: Run dotnet format analyzers
-        run: |
-          attempt=0
-          exit_code=139
-          until [ $attempt -ge 3 ] || [ $exit_code -ne 139 ]; do
-            ((attempt+=1))
-            exit_code=0
-            echo "Attempt: ${attempt}/3"
-            dotnet format analyzers --severity info --verify-no-changes --report ./analyzers-report.json -v d || exit_code=$?
-          done
-          exit $exit_code
+        uses: TSRBerry/unstable-commands@v1
+        with:
+          commands: dotnet format analyzers --severity info --verify-no-changes --report ./analyzers-report.json -v d
+          timeout-minutes: 5
+          retry-codes: 139
 
       - name: Upload report
         if: failure()