ci(release): собирать контракты из cdt .deb прямо в job, без вложенного docker
Шаг компиляции контрактов в 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) <noreply@anthropic.com>
This commit is contained in:
@@ -34,16 +34,7 @@ permissions:
|
|||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
jobs:
|
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:
|
release:
|
||||||
needs: typecheck
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
tag_name: ${{ steps.resolve.outputs.tag_name }}
|
tag_name: ${{ steps.resolve.outputs.tag_name }}
|
||||||
@@ -127,14 +118,35 @@ jobs:
|
|||||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
# === Этап 1: контракты ===
|
# === Этап 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
|
- name: Install CDT 4.2.0 toolchain (.deb)
|
||||||
run: docker pull dicoop/blockchain_v5.1.1:dev
|
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
|
- name: Compile contracts
|
||||||
working-directory: components/contracts
|
working-directory: components/contracts
|
||||||
run: |
|
run: |
|
||||||
./build-all.sh "$BUILD_MODE"
|
./build_contracts_cdt.sh "$BUILD_MODE"
|
||||||
echo "--- build/contracts ---"
|
echo "--- build/contracts ---"
|
||||||
ls -la build/contracts/
|
ls -la build/contracts/
|
||||||
|
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ name: Typecheck
|
|||||||
#
|
#
|
||||||
# Триггеры:
|
# Триггеры:
|
||||||
# - pull_request на dev — гейт перед мерджем в основную ветку;
|
# - pull_request на dev — гейт перед мерджем в основную ветку;
|
||||||
# - workflow_call — переиспользуется из release.yaml как `needs:` у release-job,
|
# - workflow_call — оставлен для переиспользования, но release.yaml его
|
||||||
# чтобы битый тэг не уехал в DockerHub.
|
# больше НЕ вызывает (гейт из релиза убран как избыточный — типы
|
||||||
|
# проверяются на PR в dev до того, как код доедет до тэга).
|
||||||
#
|
#
|
||||||
# Push в dev/testnet/main НЕ триггерит — намеренно (PR-гейт достаточен,
|
# Push в dev/testnet/main НЕ триггерит — намеренно (PR-гейт на dev достаточен).
|
||||||
# а тэги покрывает workflow_call из release.yaml).
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|||||||
@@ -1,15 +1,13 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
# Локальная сборка всех контрактов: оборачивает build_contracts_cdt.sh в
|
||||||
|
# CDT-образ. Сам cmake/make живёт в build_contracts_cdt.sh — он же
|
||||||
|
# используется в CI (там CDT ставится из .deb, без docker), поэтому
|
||||||
|
# флаги сборки в одном месте и не разъезжаются.
|
||||||
|
|
||||||
mode="${1:-prod}"
|
mode="${1:-prod}"
|
||||||
|
|
||||||
if [ "$mode" = "test" ]; then
|
|
||||||
is_testnet="ON"
|
|
||||||
else
|
|
||||||
is_testnet="OFF"
|
|
||||||
fi
|
|
||||||
|
|
||||||
docker run --rm --name cdt \
|
docker run --rm --name cdt \
|
||||||
--volume "$(pwd):/project" \
|
--volume "$(pwd):/project" \
|
||||||
-w /project \
|
-w /project \
|
||||||
dicoop/blockchain:latest \
|
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"
|
||||||
|
|||||||
Executable
+28
@@ -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/<ver> (см. .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
|
||||||
Reference in New Issue
Block a user