diff --git a/transport/images/js/v1.x/.aegir.js b/transport/images/js/v1.x/.aegir.js index 40b7ba237..b907f0e34 100644 --- a/transport/images/js/v1.x/.aegir.js +++ b/transport/images/js/v1.x/.aegir.js @@ -52,7 +52,25 @@ export default { redisClient.on('error', (err) => { console.error('Redis client error:', err) }) - await redisClient.connect() + + // Sometimes Docker DNS is slow and Redis hostname isn't found right away + // so we just try a few times instead of giving up immediately + const maxRetries = 10 + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + await redisClient.connect() + if (attempt > 1) { + console.error(`Redis connected on attempt ${attempt}`) + } + break + } catch (err) { + if (attempt === maxRetries) { + throw new Error(`Failed to connect to Redis after ${maxRetries} attempts: ${err.message}`) + } + console.error(`Redis connection attempt ${attempt}/${maxRetries} failed: ${err.message}`) + await new Promise(resolve => setTimeout(resolve, attempt * 1000)) + } + } const requestListener = async function (req, res) { let requestJSON diff --git a/transport/images/js/v1.x/BrowserDockerfile b/transport/images/js/v1.x/BrowserDockerfile index 75ffcfbef..2e8c6c667 100644 --- a/transport/images/js/v1.x/BrowserDockerfile +++ b/transport/images/js/v1.x/BrowserDockerfile @@ -12,4 +12,12 @@ ENV BROWSER=${BROWSER} # container and not during the test run which slows everything down RUN npx playwright-test --runner mocha --browser $BROWSER --grep do-not-match-anything +# Playwright install can break /etc/resolv.conf by turning it into +# a dead symlink. If that happens, DNS lookups fail with EAI_AGAIN. +# This just checks for that and fixes it. +RUN if [ -L /etc/resolv.conf ]; then \ + rm -f /etc/resolv.conf && \ + echo "nameserver 8.8.8.8" > /etc/resolv.conf; \ + fi + ENTRYPOINT ["sh", "-c", "npm test -- -t browser -- --browser \"$BROWSER\""] diff --git a/transport/images/js/v2.x/.aegir.js b/transport/images/js/v2.x/.aegir.js index 40b7ba237..b907f0e34 100644 --- a/transport/images/js/v2.x/.aegir.js +++ b/transport/images/js/v2.x/.aegir.js @@ -52,7 +52,25 @@ export default { redisClient.on('error', (err) => { console.error('Redis client error:', err) }) - await redisClient.connect() + + // Sometimes Docker DNS is slow and Redis hostname isn't found right away + // so we just try a few times instead of giving up immediately + const maxRetries = 10 + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + await redisClient.connect() + if (attempt > 1) { + console.error(`Redis connected on attempt ${attempt}`) + } + break + } catch (err) { + if (attempt === maxRetries) { + throw new Error(`Failed to connect to Redis after ${maxRetries} attempts: ${err.message}`) + } + console.error(`Redis connection attempt ${attempt}/${maxRetries} failed: ${err.message}`) + await new Promise(resolve => setTimeout(resolve, attempt * 1000)) + } + } const requestListener = async function (req, res) { let requestJSON diff --git a/transport/images/js/v2.x/BrowserDockerfile b/transport/images/js/v2.x/BrowserDockerfile index 75ffcfbef..2e8c6c667 100644 --- a/transport/images/js/v2.x/BrowserDockerfile +++ b/transport/images/js/v2.x/BrowserDockerfile @@ -12,4 +12,12 @@ ENV BROWSER=${BROWSER} # container and not during the test run which slows everything down RUN npx playwright-test --runner mocha --browser $BROWSER --grep do-not-match-anything +# Playwright install can break /etc/resolv.conf by turning it into +# a dead symlink. If that happens, DNS lookups fail with EAI_AGAIN. +# This just checks for that and fixes it. +RUN if [ -L /etc/resolv.conf ]; then \ + rm -f /etc/resolv.conf && \ + echo "nameserver 8.8.8.8" > /etc/resolv.conf; \ + fi + ENTRYPOINT ["sh", "-c", "npm test -- -t browser -- --browser \"$BROWSER\""] diff --git a/transport/images/js/v3.x/.aegir.js b/transport/images/js/v3.x/.aegir.js index 593eca6bc..9fd41c5ac 100644 --- a/transport/images/js/v3.x/.aegir.js +++ b/transport/images/js/v3.x/.aegir.js @@ -49,9 +49,26 @@ export default { console.error('Redis client error:', err) }) + // Sometimes Docker DNS is slow and Redis hostname isn't found right away + // so we just try a few times instead of giving up immediately + const maxRetries = 10 let start = Date.now() console.error('connect redis client') - await redisClient.connect() + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + await redisClient.connect() + if (attempt > 1) { + console.error(`Redis connected on attempt ${attempt}`) + } + break + } catch (err) { + if (attempt === maxRetries) { + throw new Error(`Failed to connect to Redis after ${maxRetries} attempts: ${err.message}`) + } + console.error(`Redis connection attempt ${attempt}/${maxRetries} failed: ${err.message}`) + await new Promise(resolve => setTimeout(resolve, attempt * 1000)) + } + } console.error('connected redis client after', Date.now() - start, 'ms') const requestListener = async function (req, res) { diff --git a/transport/images/js/v3.x/BrowserDockerfile b/transport/images/js/v3.x/BrowserDockerfile index 75ffcfbef..2e8c6c667 100644 --- a/transport/images/js/v3.x/BrowserDockerfile +++ b/transport/images/js/v3.x/BrowserDockerfile @@ -12,4 +12,12 @@ ENV BROWSER=${BROWSER} # container and not during the test run which slows everything down RUN npx playwright-test --runner mocha --browser $BROWSER --grep do-not-match-anything +# Playwright install can break /etc/resolv.conf by turning it into +# a dead symlink. If that happens, DNS lookups fail with EAI_AGAIN. +# This just checks for that and fixes it. +RUN if [ -L /etc/resolv.conf ]; then \ + rm -f /etc/resolv.conf && \ + echo "nameserver 8.8.8.8" > /etc/resolv.conf; \ + fi + ENTRYPOINT ["sh", "-c", "npm test -- -t browser -- --browser \"$BROWSER\""] diff --git a/transport/lib/run-single-test.sh b/transport/lib/run-single-test.sh index 221c8faf9..7f884c3b9 100755 --- a/transport/lib/run-single-test.sh +++ b/transport/lib/run-single-test.sh @@ -104,6 +104,8 @@ services: image: "${LISTENER_IMAGE}" container_name: ${TEST_SLUG}_listener init: true + dns: + - 127.0.0.11 networks: - transport-network environment: @@ -112,6 +114,9 @@ ${LISTENER_ENV} dialer: image: "${DIALER_IMAGE}" container_name: ${TEST_SLUG}_dialer + init: true + dns: + - 127.0.0.11 depends_on: - listener networks: