ci: поднимать ноду через docker cp вместо bind-mount (DinD)
CI / Lint (push) Successful in 9m26s
CI / Typecheck (push) Successful in 9m28s
CI / Unit tests (push) Successful in 9m33s
CI / Build (push) Has been skipped
CI / Integration tests (push) Failing after 13m2s

Раннер — docker-in-docker (docker.sock хоста в job-контейнере), поэтому
пути bind-mount (-v) резолвятся на ФС хоста: ни mktemp, ни workspace демону
не видны → монтировался пустой каталог, nodeos падал с 'genesis file does
not exist'. Конфиг теперь кладём в контейнер через docker cp (tar по API,
от путей хоста не зависит), config-dir=/mnt/cfg (docker cp не создаёт
родителей, а /mnt/dev/config в образе нет). Проверено локально: chain API
get_info + SHiP 101 Switching Protocols.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
coopops
2026-05-26 12:52:02 +00:00
parent 9f21c61a75
commit d575da529b
+17 -13
View File
@@ -86,22 +86,26 @@ jobs:
- name: Start blockchain node
run: |
# Раннер self-hosted и персистентный: упавший прогон оставляет контейнер
# с фиксированным именем blockchain, и следующий docker run падает с
# exit 125 (Conflict, name already in use). Сносим остаток перед стартом.
# с фиксированным именем blockchain, и следующий старт падает с exit 125
# (Conflict, name already in use). Сносим остаток перед стартом.
docker rm -f blockchain 2>/dev/null || true
# nodeos на старте генерирует protocol_features/*.json В смонтированный
# config-каталог. Если монтировать сам workspace, эти файлы остаются в нём
# (untracked, root-owned — checkout --force их не чистит) и на следующем
# прогоне ломают узел: 'plugin_config_exception: Incorrect plugin
# configuration'. Монтируем pristine-копию во временном каталоге — узел
# пишет сгенерированное туда, workspace остаётся чистым.
CONFIG_DIR=$(mktemp -d)
cp "${GITHUB_WORKSPACE}/packages/parser2/test/integration/node-config/"* "$CONFIG_DIR/"
docker run -d --name blockchain \
# Конфиг кладём в контейнер через docker cp, а НЕ через bind-mount (-v).
# Раннер работает по схеме docker-in-docker (docker.sock хоста проброшен
# в job-контейнер), поэтому пути bind-mount резолвятся на ФС ХОСТА, а не
# внутри job-контейнера: ни mktemp, ни workspace хостовому демону не видны
# → монтируется ПУСТОЙ каталог (nodeos пишет туда protocol_features, но
# genesis.json/config.ini отсутствуют → 'genesis file does not exist').
# docker cp передаёт файлы tar-стримом по API и от путей хоста не зависит.
# /mnt/dev/config в образе нет (его создавал сам mount), а docker cp не
# создаёт родительские каталоги — поэтому config-dir = /mnt/cfg (родитель
# /mnt существует). protocol_features узел пишет туда же, в свежесозданный
# контейнер — никакого мусора между прогонами.
docker create --name blockchain \
-p 8888:8888 -p 8080:8080 -p 9876:9876 \
-v "$CONFIG_DIR:/mnt/dev/config" \
dicoop/blockchain:v5.1.0-dev \
/bin/bash -c '/usr/local/bin/nodeos -d /mnt/dev/data -p eosio --config-dir /mnt/dev/config --genesis-json /mnt/dev/config/genesis.json --disable-replay-opts'
/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
docker start blockchain
sleep 3
- name: Wait for Chain API
run: |