Root cause
ElixirLS v0.30.0 is not a pre-built binary. The downloaded zip contains only launch scripts and an installer.exs. On first launch, language_server.sh runs:
echo "" | elixir "$SCRIPTPATH/quiet_install.exs" >/dev/null || exit 1
This triggers Mix.install which:
- Downloads ElixirLS source from GitHub
- Fetches all Hex dependencies (elixir_sense, dialyxir, jason, etc.)
- Compiles everything
This blocking build takes several minutes and runs before the LSP server starts. The initialize request sits in the stdin pipe unread until the build completes.
Why CI times out
Each test creates a new ElixirLS server instance. Even though the server binary is shared, Mix.install runs inside each subprocess. If the Mix.install cache (~/.cache/mix/installs/) is not shared across instances, each test pays the full build cost: 8 async + 8 sync tests × 600s timeout = 160+ minutes.
Possible fixes
- Pre-warm the ElixirLS build in a CI setup step before running tests (run
language_server.sh once and let it build, then kill it)
- Share a single ElixirLS instance across all Elixir tests (test fixture refactor)
- Use an older ElixirLS release (<= v0.22) that shipped pre-built
.ez archives
- Cache
~/.cache/mix/installs/ in CI so subsequent runs are fast
Tests are currently skipped in CI with a reference to this issue.
Root cause
ElixirLS v0.30.0 is not a pre-built binary. The downloaded zip contains only launch scripts and an
installer.exs. On first launch,language_server.shruns:This triggers
Mix.installwhich:This blocking build takes several minutes and runs before the LSP server starts. The
initializerequest sits in the stdin pipe unread until the build completes.Why CI times out
Each test creates a new ElixirLS server instance. Even though the server binary is shared,
Mix.installruns inside each subprocess. If theMix.installcache (~/.cache/mix/installs/) is not shared across instances, each test pays the full build cost: 8 async + 8 sync tests × 600s timeout = 160+ minutes.Possible fixes
language_server.shonce and let it build, then kill it).ezarchives~/.cache/mix/installs/in CI so subsequent runs are fastTests are currently skipped in CI with a reference to this issue.