# Сборка tdlib_ping: TDLib из исходников (пакета libtdjson в apt часто нет). # В релиз/артефакт: tar.gz — бинарник + libtdjson.so* (rpath $ORIGIN, можно распаковать в одну папку и запускать). name: Build tdlib_ping (linux/amd64) on: push: branches: - "**" tags: - "*" workflow_dispatch: permissions: contents: write env: GO_VERSION: "1.22" # Тег в 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: runs-on: ubuntu-22.04 timeout-minutes: 60 steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - name: Set up Go uses: actions/setup-go@v5 with: go-version: ${{ env.GO_VERSION }} - name: Install build dependencies run: | sudo apt-get update sudo apt-get install -y cmake g++ make zlib1g-dev libssl-dev gperf jq git - name: Fetch TDLib run: | set -euo pipefail 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 # Исходники: td/telegram/td_json_client.h; сгенерированные заголовки (tdjson_export.h): build/td/telegram/ export CGO_CFLAGS="-I${TDLIB_ROOT} -I${TDLIB_ROOT}/build" 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 # v4+ не поддерживается на Gitea / GHES-совместимых runner'ах; v3 — старый протокол артефактов. - name: Upload workflow artifact uses: actions/upload-artifact@v3 with: name: ${{ env.ASSET_TAR }}-${{ gitea.sha }} path: ${{ env.ASSET_TAR }} retention-days: 90 - name: Create release if needed and upload asset if: ${{ startsWith(gitea.ref, 'refs/tags/') }} env: TOKEN: ${{ github.token }} run: | set -euo pipefail SERVER="${{ gitea.server_url }}" SERVER="${SERVER%/}" REPO_FULL="${{ gitea.repository }}" OWNER="${REPO_FULL%%/*}" REPO="${REPO_FULL#*/}" TAG="${{ gitea.ref_name }}" ASSET_PATH="${{ env.ASSET_TAR }}" ASSET_NAME="${{ env.ASSET_TAR }}" api() { curl -fsS -H "Authorization: token ${TOKEN}" -H "Accept: application/json" "$@" } code="$(api -o /tmp/rel.json -w "%{http_code}" \ "${SERVER}/api/v1/repos/${OWNER}/${REPO}/releases/tags/${TAG}")" if [ "${code}" = "404" ]; then api -X POST "${SERVER}/api/v1/repos/${OWNER}/${REPO}/releases" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"draft\":false}" \ -o /tmp/rel.json elif [ "${code}" != "200" ]; then echo "unexpected HTTP ${code} from release-by-tag" cat /tmp/rel.json || true exit 1 fi release_id="$(jq -r '.id' /tmp/rel.json)" if [ "${release_id}" = "null" ] || [ -z "${release_id}" ]; then echo "missing release id in response:" cat /tmp/rel.json exit 1 fi curl -fsS -X POST \ -H "Authorization: token ${TOKEN}" \ -H "Accept: application/json" \ -F "attachment=@${ASSET_PATH};type=application/gzip" \ "${SERVER}/api/v1/repos/${OWNER}/${REPO}/releases/${release_id}/assets?name=${ASSET_NAME}"