From 966dcc45f2ce13de94561a550517b19f72fd9e1b Mon Sep 17 00:00:00 2001 From: coopops Date: Mon, 25 May 2026 03:42:34 +0000 Subject: [PATCH] =?UTF-8?q?ci(release):=20=D1=81=D0=BE=D0=B1=D0=B8=D1=80?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D1=8B=20=D0=B8=D0=B7=20cdt=20.deb=20=D0=BF=D1=80=D1=8F?= =?UTF-8?q?=D0=BC=D0=BE=20=D0=B2=20job,=20=D0=B1=D0=B5=D0=B7=20=D0=B2?= =?UTF-8?q?=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20docker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Шаг компиляции контрактов в release.yaml падал под Gitea act_runner: build-all.sh монтирует $(pwd):/project в sibling-контейнер, но job сам исполняется в контейнере → хостовый демон не видит путь, /project пуст, cmake падает "no CMakeLists.txt". Релиз не собирался зелёным (runs #144, #158). - build_contracts_cdt.sh: чистый cmake/make без docker (общий источник флагов). - build-all.sh: тонкая docker-обёртка над ним для локальной сборки. - release.yaml: вместо pull образа + build-all.sh — установка cdt v4.2.0 .deb в окружение job'а + симлинк /cdt/build → /usr/opt/cdt/4.2.0 (сводит хардкод toolchain-путь CMakeLists без его правки) + вызов build_contracts_cdt.sh. Компиляция в самом job-контейнере, без вложенного docker. sudo-агностично — одинаково на GitHub-VM и Gitea-контейнере. - Убран избыточный typecheck-гейт из release; typecheck.yaml остаётся PR-гейтом. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/release.yaml | 36 ++++++++++++++------- .github/workflows/typecheck.yaml | 8 ++--- components/contracts/build-all.sh | 12 +++---- components/contracts/build_contracts_cdt.sh | 28 ++++++++++++++++ 4 files changed, 61 insertions(+), 23 deletions(-) create mode 100755 components/contracts/build_contracts_cdt.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 93ccb6b03a0..e695ffece14 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -34,16 +34,7 @@ permissions: contents: write jobs: - # Гейт TS-типов перед сборкой образов. Reusable workflow `typecheck.yaml` - # запускает vue-tsc на desktop и tsc --noEmit на controller. Нужно потому, - # что `lerna run build` в корневом Dockerfile НЕ ловит TS-ошибки: - # quasar build идёт через esbuild с выключенным vueTsc, а у controller'а - # build-скрипта вообще нет (ts-node в рантайме). - typecheck: - uses: ./.github/workflows/typecheck.yaml - release: - needs: typecheck runs-on: ubuntu-latest outputs: tag_name: ${{ steps.resolve.outputs.tag_name }} @@ -127,14 +118,35 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} # === Этап 1: контракты === + # CDT ставим из .deb (C9S/cdt v4.2.0) прямо в окружение job'а и + # компилируем напрямую — БЕЗ вложенного docker. Почему не build-all.sh: + # тот монтирует $(pwd):/project в sibling-контейнер, а под Gitea + # act_runner сам job исполняется в контейнере → хостовый демон не видит + # этот путь, /project пуст, cmake падает "no CMakeLists.txt". + # build-all.sh остаётся для локальной сборки (оборачивает тот же + # build_contracts_cdt.sh в docker). + # CMakeLists хардкодит toolchain /cdt/build/...; .deb кладёт CDT в + # /usr/opt/cdt/4.2.0, а сам CDTWasmToolchain.cmake указывает на /usr + # абсолютно — поэтому симлинк /cdt/build → /usr/opt/cdt/4.2.0 сводит пути + # без правки CMakeLists. - - name: Pull CDT toolchain image - run: docker pull dicoop/blockchain_v5.1.1:dev + - name: Install CDT 4.2.0 toolchain (.deb) + run: | + SUDO=""; [ "$(id -u)" -ne 0 ] && SUDO="sudo" + $SUDO apt-get update + $SUDO apt-get install -y --no-install-recommends \ + curl ca-certificates cmake make build-essential + curl -fsSL -o /tmp/cdt.deb \ + https://git.coopenomics.world/C9S/cdt/releases/download/v4.2.0/cdt_4.2.0-1_amd64.deb + $SUDO apt-get install -y /tmp/cdt.deb + $SUDO mkdir -p /cdt + $SUDO ln -sfn /usr/opt/cdt/4.2.0 /cdt/build + cdt-cpp --version || true - name: Compile contracts working-directory: components/contracts run: | - ./build-all.sh "$BUILD_MODE" + ./build_contracts_cdt.sh "$BUILD_MODE" echo "--- build/contracts ---" ls -la build/contracts/ diff --git a/.github/workflows/typecheck.yaml b/.github/workflows/typecheck.yaml index bb737102193..50dc12bedec 100644 --- a/.github/workflows/typecheck.yaml +++ b/.github/workflows/typecheck.yaml @@ -13,11 +13,11 @@ name: Typecheck # # Триггеры: # - pull_request на dev — гейт перед мерджем в основную ветку; -# - workflow_call — переиспользуется из release.yaml как `needs:` у release-job, -# чтобы битый тэг не уехал в DockerHub. +# - workflow_call — оставлен для переиспользования, но release.yaml его +# больше НЕ вызывает (гейт из релиза убран как избыточный — типы +# проверяются на PR в dev до того, как код доедет до тэга). # -# Push в dev/testnet/main НЕ триггерит — намеренно (PR-гейт достаточен, -# а тэги покрывает workflow_call из release.yaml). +# Push в dev/testnet/main НЕ триггерит — намеренно (PR-гейт на dev достаточен). on: pull_request: diff --git a/components/contracts/build-all.sh b/components/contracts/build-all.sh index 6b5719dc3aa..12f359c67e8 100755 --- a/components/contracts/build-all.sh +++ b/components/contracts/build-all.sh @@ -1,15 +1,13 @@ #!/usr/bin/env bash +# Локальная сборка всех контрактов: оборачивает build_contracts_cdt.sh в +# CDT-образ. Сам cmake/make живёт в build_contracts_cdt.sh — он же +# используется в CI (там CDT ставится из .deb, без docker), поэтому +# флаги сборки в одном месте и не разъезжаются. mode="${1:-prod}" -if [ "$mode" = "test" ]; then - is_testnet="ON" -else - is_testnet="OFF" -fi - docker run --rm --name cdt \ --volume "$(pwd):/project" \ -w /project \ dicoop/blockchain:latest \ - /bin/bash -c "mkdir -p build && cd build && cmake -DBUILD_TARGET= -DTEST_TARGET= -DVERBOSE=ON -DBUILD_TESTS=OFF -DIS_TESTNET=$is_testnet .. && make" + /bin/bash -c "./build_contracts_cdt.sh $mode" diff --git a/components/contracts/build_contracts_cdt.sh b/components/contracts/build_contracts_cdt.sh new file mode 100755 index 00000000000..4e435814bc9 --- /dev/null +++ b/components/contracts/build_contracts_cdt.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Компиляция всех контрактов кооперативной экономики через CDT. +# +# ВАЖНО: скрипт запускается УЖЕ внутри окружения с установленным CDT — +# тулчейн ожидается по пути /cdt/build/lib/cmake/cdt/CDTWasmToolchain.cmake +# (он захардкожен в CMakeLists.txt). Здесь НЕТ docker — только cmake/make. +# +# Два способа подготовить это окружение: +# - локально: build-all.sh оборачивает скрипт в `docker run dicoop/blockchain:latest` +# (в образе CDT уже лежит в /cdt/build); +# - в CI: CDT ставится из .deb (C9S/cdt), а /cdt/build симлинкуется на +# /usr/opt/cdt/ (см. .github/workflows/release.yaml). +# +# Один источник cmake-флагов для обоих путей — чтобы локальная и CI-сборка +# не разъезжались. +set -euo pipefail + +mode="${1:-prod}" +if [ "$mode" = "test" ]; then + is_testnet="ON" +else + is_testnet="OFF" +fi + +mkdir -p build +cd build +cmake -DBUILD_TARGET= -DTEST_TARGET= -DVERBOSE=ON -DBUILD_TESTS=OFF -DIS_TESTNET="$is_testnet" .. +make