fix: pass pre-bound TcpListener to run_server to fix Windows CI test race (#8542)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ruben Fiszel
2026-03-26 12:42:02 +00:00
committed by GitHub
parent f6208af673
commit d7f4b950ce
3 changed files with 12 additions and 10 deletions

View File

@@ -1099,6 +1099,9 @@ Windmill Community Edition {GIT_VERSION}
} }
let addr = SocketAddr::from((server_bind_address, port)); let addr = SocketAddr::from((server_bind_address, port));
let listener = tokio::net::TcpListener::bind(addr)
.await
.context("binding main windmill server")?;
let (base_internal_tx, base_internal_rx) = tokio::sync::oneshot::channel::<String>(); let (base_internal_tx, base_internal_rx) = tokio::sync::oneshot::channel::<String>();
@@ -1232,7 +1235,7 @@ Windmill Community Edition {GIT_VERSION}
db.clone(), db.clone(),
index_reader, index_reader,
log_index_reader, log_index_reader,
addr, listener,
server_killpill_rx, server_killpill_rx,
base_internal_tx, base_internal_tx,
server_mode, server_mode,

View File

@@ -45,8 +45,8 @@ use windmill_common::global_settings::EMAIL_DOMAIN_SETTING;
use windmill_common::worker::HUB_CACHE_DIR; use windmill_common::worker::HUB_CACHE_DIR;
use std::fs::DirBuilder; use std::fs::DirBuilder;
use std::sync::Arc;
use std::time::Duration; use std::time::Duration;
use std::{net::SocketAddr, sync::Arc};
use tokio::sync::RwLock; use tokio::sync::RwLock;
use tower::ServiceBuilder; use tower::ServiceBuilder;
use tower_cookies::CookieManagerLayer; use tower_cookies::CookieManagerLayer;
@@ -326,7 +326,7 @@ pub async fn run_server(
db: DB, db: DB,
job_index_reader: Option<IndexReader>, job_index_reader: Option<IndexReader>,
log_index_reader: Option<ServiceLogIndexReader>, log_index_reader: Option<ServiceLogIndexReader>,
addr: SocketAddr, listener: tokio::net::TcpListener,
mut killpill_rx: tokio::sync::broadcast::Receiver<()>, mut killpill_rx: tokio::sync::broadcast::Receiver<()>,
port_tx: tokio::sync::oneshot::Sender<String>, port_tx: tokio::sync::oneshot::Sender<String>,
server_mode: bool, server_mode: bool,
@@ -412,6 +412,9 @@ pub async fn run_server(
auth_cache: auth_cache.clone(), auth_cache: auth_cache.clone(),
base_internal_url: _base_internal_url.clone(), base_internal_url: _base_internal_url.clone(),
}); });
let addr = listener
.local_addr()
.unwrap_or_else(|_| std::net::SocketAddr::from(([127, 0, 0, 1], 0)));
if let Err(err) = smtp_server.start_listener_thread(addr).await { if let Err(err) = smtp_server.start_listener_thread(addr).await {
tracing::error!("Error starting SMTP server: {err:#}"); tracing::error!("Error starting SMTP server: {err:#}");
} }
@@ -452,9 +455,6 @@ pub async fn run_server(
health::start_health_check_loop(db.clone(), killpill_rx.resubscribe()); health::start_health_check_loop(db.clone(), killpill_rx.resubscribe());
} }
let listener = tokio::net::TcpListener::bind(addr)
.await
.context("binding main windmill server")?;
let port = listener.local_addr().map(|x| x.port()).unwrap_or(8000); let port = listener.local_addr().map(|x| x.port()).unwrap_or(8000);
let ip = listener let ip = listener
.local_addr() .local_addr()

View File

@@ -97,14 +97,13 @@ impl ApiServer {
async fn start_inner(db: Pool<Postgres>, agent_mode: bool) -> anyhow::Result<Self> { async fn start_inner(db: Pool<Postgres>, agent_mode: bool) -> anyhow::Result<Self> {
let (tx, rx) = tokio::sync::broadcast::channel::<()>(1); let (tx, rx) = tokio::sync::broadcast::channel::<()>(1);
let sock = tokio::net::TcpListener::bind("127.0.0.1:0") let listener = tokio::net::TcpListener::bind("127.0.0.1:0")
.await .await
.map_err(|e| anyhow::anyhow!("failed to bind TCP listener: {}", e))?; .map_err(|e| anyhow::anyhow!("failed to bind TCP listener: {}", e))?;
let addr = sock let addr = listener
.local_addr() .local_addr()
.map_err(|e| anyhow::anyhow!("failed to get local address: {}", e))?; .map_err(|e| anyhow::anyhow!("failed to get local address: {}", e))?;
drop(sock);
let (port_tx, _port_rx) = tokio::sync::oneshot::channel::<String>(); let (port_tx, _port_rx) = tokio::sync::oneshot::channel::<String>();
let name = next_worker_name(); let name = next_worker_name();
tracing::info!("starting api server for name={name}"); tracing::info!("starting api server for name={name}");
@@ -112,7 +111,7 @@ impl ApiServer {
db.clone(), db.clone(),
None, None,
None, None,
addr, listener,
rx, rx,
port_tx, port_tx,
agent_mode, agent_mode,