From 76e752fc26987cbb459de7654648107a0cfab486 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 11 Apr 2026 16:31:50 +0700 Subject: [PATCH] Update tdlib_ping workflow to build TDLib from source, enhancing compatibility and removing dependency on libtdjson-dev. Revise README to clarify build process and artifact structure, including new tarball format for releases and CI artifacts. --- .gitea/workflows/tdlib_ping.yaml | 73 ++++++++++++++++++++++---------- cmd/tdlib_ping/README.md | 17 +++++--- 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/.gitea/workflows/tdlib_ping.yaml b/.gitea/workflows/tdlib_ping.yaml index 1b8ef4b..56276f9 100644 --- a/.gitea/workflows/tdlib_ping.yaml +++ b/.gitea/workflows/tdlib_ping.yaml @@ -1,5 +1,5 @@ -# Сборка нативного tdlib_ping (CGO + libtdjson) под linux/amd64. -# Триггеры как у docker.yaml. На push ветки — только артефакт job; на push тега — артефакт + вложение в релиз Gitea (релиз создаётся при отсутствии). +# Сборка tdlib_ping: TDLib из исходников (пакета libtdjson в apt часто нет). +# В релиз/артефакт: tar.gz — бинарник + libtdjson.so* (rpath $ORIGIN, можно распаковать в одну папку и запускать). name: Build tdlib_ping (linux/amd64) on: @@ -15,13 +15,15 @@ permissions: env: GO_VERSION: "1.22" - ASSET_NAME: tdlib_ping-linux-amd64 + # Тег в https://github.com/tdlib/td (при необходимости обновите; должен существовать в git). + TDLIB_REF: "v1.8.0" + ASSET_BIN: tdlib_ping-linux-amd64 + ASSET_TAR: tdlib_ping-linux-amd64.tar.gz jobs: build-tdlib-ping: - # Noble (24.04) не содержит libtdjson-dev в apt; на Jammy (22.04) пакет есть (universe). runs-on: ubuntu-22.04 - timeout-minutes: 30 + timeout-minutes: 60 steps: - name: Checkout repository uses: actions/checkout@v4 @@ -33,29 +35,56 @@ jobs: with: go-version: ${{ env.GO_VERSION }} - - name: Install libtdjson + - name: Install build dependencies run: | sudo apt-get update - sudo apt-get install -y software-properties-common - sudo add-apt-repository -y universe - sudo apt-get update - sudo apt-get install -y libtdjson-dev jq + sudo apt-get install -y cmake g++ make zlib1g-dev libssl-dev gperf jq git - - name: Build tdlib_ping - env: - CGO_ENABLED: "1" + - name: Fetch TDLib run: | set -euo pipefail - go build -tags=tdlib -trimpath -ldflags="-s -w" -o "${ASSET_NAME}" ./cmd/tdlib_ping - chmod +x "${ASSET_NAME}" - file "${ASSET_NAME}" - ldd "${ASSET_NAME}" || true + git clone --depth 1 --branch "${TDLIB_REF}" https://github.com/tdlib/td.git td-src + + - name: Build TDLib (tdjson) + run: | + set -euo pipefail + cd td-src + mkdir -p build + cd build + cmake -DCMAKE_BUILD_TYPE=Release .. + cmake --build . -j"$(nproc)" --target tdjson + ls -la libtdjson.so* || (find . -name 'libtdjson.so*' -print; exit 1) + + - name: Build tdlib_ping and pack tarball + run: | + set -euo pipefail + ROOT="${GITHUB_WORKSPACE}" + TDLIB_ROOT="${ROOT}/td-src" + DIST="${ROOT}/dist" + mkdir -p "${DIST}" + shopt -s nullglob + cp -a "${TDLIB_ROOT}/build"/libtdjson.so* "${DIST}/" + if ! ls "${DIST}"/libtdjson.so* >/dev/null 2>&1; then + echo "no libtdjson in ${TDLIB_ROOT}/build" + find "${TDLIB_ROOT}/build" -name 'libtdjson*' -print || true + exit 1 + fi + cd "${ROOT}" + export CGO_ENABLED=1 + export CGO_CFLAGS="-I${TDLIB_ROOT}/td" + export CGO_LDFLAGS="-L${DIST} -Wl,-rpath,\$ORIGIN -ltdjson" + go build -tags=tdlib -trimpath -ldflags="-s -w" -o "${DIST}/${ASSET_BIN}" ./cmd/tdlib_ping + chmod +x "${DIST}/${ASSET_BIN}" + ( cd "${DIST}" && tar -czvf "${ROOT}/${ASSET_TAR}" . ) + ls -la "${ROOT}/${ASSET_TAR}" + tar -tzvf "${ROOT}/${ASSET_TAR}" + ldd "${DIST}/${ASSET_BIN}" || true - name: Upload workflow artifact uses: actions/upload-artifact@v4 with: - name: ${{ env.ASSET_NAME }}-${{ gitea.sha }} - path: ${{ env.ASSET_NAME }} + name: ${{ env.ASSET_TAR }}-${{ gitea.sha }} + path: ${{ env.ASSET_TAR }} retention-days: 90 - name: Create release if needed and upload asset @@ -70,8 +99,8 @@ jobs: OWNER="${REPO_FULL%%/*}" REPO="${REPO_FULL#*/}" TAG="${{ gitea.ref_name }}" - ASSET_PATH="${{ env.ASSET_NAME }}" - ASSET_NAME="${{ env.ASSET_NAME }}" + ASSET_PATH="${{ env.ASSET_TAR }}" + ASSET_NAME="${{ env.ASSET_TAR }}" api() { curl -fsS -H "Authorization: token ${TOKEN}" -H "Accept: application/json" "$@" @@ -101,5 +130,5 @@ jobs: curl -fsS -X POST \ -H "Authorization: token ${TOKEN}" \ -H "Accept: application/json" \ - -F "attachment=@${ASSET_PATH};type=application/octet-stream" \ + -F "attachment=@${ASSET_PATH};type=application/gzip" \ "${SERVER}/api/v1/repos/${OWNER}/${REPO}/releases/${release_id}/assets?name=${ASSET_NAME}" diff --git a/cmd/tdlib_ping/README.md b/cmd/tdlib_ping/README.md index 2d566a0..d052259 100644 --- a/cmd/tdlib_ping/README.md +++ b/cmd/tdlib_ping/README.md @@ -8,21 +8,26 @@ ## Сборка в CI (Gitea) -В репозитории есть workflow **`.gitea/workflows/tdlib_ping.yaml`** (те же триггеры, что и у публикации Docker: push по **любой ветке** и **любому тегу**, плюс `workflow_dispatch`): +В репозитории есть workflow **`.gitea/workflows/tdlib_ping.yaml`** (те же триггеры, что и у публикации Docker: push по **любой ветке** и **любому тегу**, плюс `workflow_dispatch`). **TDLib собирается из исходников** (тег задаётся в workflow, переменная `TDLIB_REF`), пакета `libtdjson-dev` в apt не требуется. -- при push **тега** собирается **`tdlib_ping-linux-amd64`** и прикрепляется к **релизу** с этим тегом (релиз создаётся автоматически, если его ещё нет); -- при push **ветки** или ручном запуске — только **артефакт** прогона в Actions. +В релиз и в артефакты попадает архив **`tdlib_ping-linux-amd64.tar.gz`**: внутри бинарник **`tdlib_ping-linux-amd64`** и **`libtdjson.so*`** с `rpath=$ORIGIN` (всё в одной папке после распаковки). -Скачайте бинарник со страницы релиза или из вкладки Actions → нужный run → Artifacts. На сервере положите в каталог вроде `/usr/local/bin`, выставьте `chmod +x`, задайте `MTPROXY_TDLIB_HELPER`. +```bash +mkdir -p /opt/tdlib-ping && tar -xzf tdlib_ping-linux-amd64.tar.gz -C /opt/tdlib-ping +chmod +x /opt/tdlib-ping/tdlib_ping-linux-amd64 +export MTPROXY_TDLIB_HELPER=/opt/tdlib-ping/tdlib_ping-linux-amd64 +``` + +При push **тега** архив прикрепляется к **релизу** (релиз создаётся при отсутствии); при push **ветки** или `workflow_dispatch` — только артефакт прогона в Actions. ## Сборка Linux (Debian/Ubuntu), установите заголовки и библиотеку, например: -**Важно:** в **Ubuntu 24.04 (Noble)** пакета **`libtdjson-dev` в официальном apt нет** (ошибка `Unable to locate package`). Используйте **22.04 (Jammy)** / **Debian bookworm** или [сборку TDLib из исходников](https://github.com/tdlib/td#building). +**Важно:** в **Ubuntu 24.04 (Noble)** и на части окружений **Jammy** пакета **`libtdjson-dev` в apt может не быть**. Тогда [соберите TDLib из исходников](https://github.com/tdlib/td#building) или возьмите готовый **`tdlib_ping-linux-amd64.tar.gz`** из CI (см. выше). ```bash -sudo apt-get install -y libtdjson-dev # Jammy/Bookworm и др.; имя может отличаться по дистрибутиву +sudo apt-get install -y libtdjson-dev # если пакет есть в вашем дистрибутиве export CGO_ENABLED=1 go build -tags=tdlib -o tdlib_ping ./cmd/tdlib_ping ```