ci: интеграция — поднять ноду в DinD корректно (docker cp + сеть jobа по IP) #2

Merged
claude merged 2 commits from ci/dind-network-fix into dev 2026-05-26 15:01:55 +00:00
+20 -5
View File
@@ -101,11 +101,23 @@ jobs:
# /mnt существует). protocol_features узел пишет туда же, в свежесозданный
# контейнер — никакого мусора между прогонами.
docker create --name blockchain \
-p 8888:8888 -p 8080:8080 -p 9876:9876 \
dicoop/blockchain:v5.1.0-dev \
/bin/bash -c 'mkdir -p /mnt/data && exec /usr/local/bin/nodeos -d /mnt/data -p eosio --config-dir /mnt/cfg --genesis-json /mnt/cfg/genesis.json --disable-replay-opts'
docker cp "${GITHUB_WORKSPACE}/packages/parser2/test/integration/node-config" blockchain:/mnt/cfg
# Сеть в DinD: порт-маппинг -p публикует на ХОСТЕ, а шаги job'а крутятся
# внутри job-контейнера — его localhost хостовых портов не видит (поэтому
# localhost:8888 был недостижим). redis-сервис доступен по localhost лишь
# потому, что его сеть настраивает сам Gitea. Свою ноду подключаем в ту же
# сеть, что и job-контейнер, и адресуем по её IP на этой сети (надёжнее
# DNS — работает и на bridge); IP пробрасываем в env последующих шагов.
SELF=$(cat /etc/hostname)
NET=$(docker inspect "$SELF" --format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}{{"\n"}}{{end}}' | grep -v '^bridge$' | head -1)
[ -z "$NET" ] && NET=bridge
docker network connect "$NET" blockchain
docker start blockchain
NODE_HOST=$(docker inspect blockchain --format "{{(index .NetworkSettings.Networks \"$NET\").IPAddress}}")
echo "Нода в сети '$NET' с IP $NODE_HOST"
echo "NODE_HOST=$NODE_HOST" >> "$GITHUB_ENV"
sleep 3
- name: Wait for Chain API
run: |
@@ -113,7 +125,7 @@ jobs:
# раннере nodeos поднимается медленно (наблюдали >6 мин до get_info), а
# curl без --max-time подвисал на ещё-не-отвечающем порту и съедал бюджет.
for i in $(seq 1 120); do
if curl -sf --max-time 2 http://localhost:8888/v1/chain/get_info > /dev/null 2>&1; then
if curl -sf --max-time 2 "http://${NODE_HOST}:8888/v1/chain/get_info" > /dev/null 2>&1; then
echo "Chain API ready after $i attempts"
exit 0
fi
@@ -125,9 +137,12 @@ jobs:
exit 1
- run: pnpm --filter @coopenomics/parser2 test:integration
env:
REDIS_URL: redis://localhost:6379
CHAIN_URL: http://localhost:8888
SHIP_URL: ws://localhost:8080
# В Gitea/act job крутится в контейнере, а services: — контейнеры-соседи
# в той же сети, доступные ПО ИМЕНИ СЕРВИСА (redis), а не через localhost
# (localhost сработал бы на GitHub-хостед раннере, но не в DinD).
REDIS_URL: redis://redis:6379
CHAIN_URL: http://${{ env.NODE_HOST }}:8888
SHIP_URL: ws://${{ env.NODE_HOST }}:8080
- name: Show blockchain logs on failure
if: failure()
run: docker logs blockchain | tail -200