Приватность публичного репо + выкл. проверку обновлений + релиз latest

- Убраны все машинно/инфра-специфичные данные из README/CODEMAP/скриптов/
  workflows (хосты, IP, домен gitea -> github.server_url).
- preconfigure: enable-check-update=N (выкл. проверку обновлений); подсказка
  «set up your own server» и так гаснет с override-сервером.
- CI публикует exe/apk в Gitea Release `latest` (обновляется каждый прогон,
  стабильная ссылка) + версионный релиз на теге v*.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 19:13:54 +03:00
parent fe646d7281
commit 1b3c3496c5
10 changed files with 73 additions and 79 deletions
+20 -23
View File
@@ -1,10 +1,10 @@
name: build-android name: build-android
# Собирает преднастроенный RustDesk APK (arm64-v8a) на раннере `android` (= VM 118, где тулчейн # Собирает преднастроенный RustDesk APK (arm64-v8a) на раннере `android` (тулчейн поднят
# поднят provision-android.sh). Логику несёт scripts/build-android.sh — тот же путь, что и вручную. # scripts/provision-android.sh). Всю логику несёт scripts/build-android.sh.
# #
# Секреты репозитория: RUSTDESK_SERVER, RUSTDESK_PUB_KEY, (опц.) RUSTDESK_PRESET_PASSWORD. # Секреты репозитория: RUSTDESK_SERVER, RUSTDESK_PUB_KEY, (опц.) RUSTDESK_PRESET_PASSWORD.
# Публикация: на теге v* APK прикрепляется к Gitea Release; иначе кладётся в ~/rd-ci-out. # Публикация: APK кладётся в Gitea Release `latest` (обновляется каждый прогон), на теге v* — ещё и в версионный.
# Подпись: без flutter/android/key.properties APK debug-подписан (для теста); свой keystore -> релизная. # Подпись: без flutter/android/key.properties APK debug-подписан; свой keystore -> релизная подпись.
on: on:
workflow_dispatch: workflow_dispatch:
@@ -14,9 +14,6 @@ on:
permissions: permissions:
contents: write contents: write
env:
REGISTRY_HOST: gitea.gusik.tech
jobs: jobs:
android: android:
runs-on: android runs-on: android
@@ -36,28 +33,28 @@ jobs:
RUSTDESK_PRESET_PASSWORD: ${{ secrets.RUSTDESK_PRESET_PASSWORD }} RUSTDESK_PRESET_PASSWORD: ${{ secrets.RUSTDESK_PRESET_PASSWORD }}
run: bash scripts/build-android.sh run: bash scripts/build-android.sh
- name: Attach APK to Gitea Release - name: Publish APK to Gitea Release
if: startsWith(github.ref, 'refs/tags/v')
env: env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_REF_NAME: ${{ github.ref_name }}
run: | run: |
set -e set -e
base="https://${REGISTRY_HOST}/api/v1/repos/${GITHUB_REPOSITORY}" base="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}"
hdr="Authorization: token ${GITEA_TOKEN}" hdr="Authorization: token ${GITEA_TOKEN}"
case "$GITHUB_REF" in
refs/tags/v*) tag="$GITHUB_REF_NAME"; prerelease=false ;;
*) tag="latest"; prerelease=true ;;
esac
curl -sf -X POST "$base/releases" -H "$hdr" -H 'Content-Type: application/json' \ curl -sf -X POST "$base/releases" -H "$hdr" -H 'Content-Type: application/json' \
-d "{\"tag_name\":\"${GITHUB_REF_NAME}\",\"name\":\"${GITHUB_REF_NAME}\",\"draft\":false,\"prerelease\":false}" || true -d "{\"tag_name\":\"$tag\",\"name\":\"$tag\",\"draft\":false,\"prerelease\":$prerelease,\"target_commitish\":\"master\"}" || true
relid=$(curl -sf "$base/releases/tags/${GITHUB_REF_NAME}" -H "$hdr" | python3 -c 'import sys,json;print(json.load(sys.stdin)["id"])') rel=$(curl -sf "$base/releases/tags/$tag" -H "$hdr")
relid=$(printf '%s' "$rel" | python3 -c 'import sys,json;print(json.load(sys.stdin)["id"])')
[ -n "$relid" ] || { echo "нет release id"; exit 1; } [ -n "$relid" ] || { echo "нет release id"; exit 1; }
for f in dist/*.apk; do for f in dist/*.apk; do
echo "Uploading $(basename "$f")..." name=$(basename "$f")
curl -sf -X POST "$base/releases/$relid/assets?name=$(basename "$f")" -H "$hdr" -F "attachment=@$f" # удалить старый ассет с тем же именем (gitea не перезаписывает)
aid=$(printf '%s' "$rel" | python3 -c "import sys,json;a=[x['id'] for x in json.load(sys.stdin).get('assets',[]) if x['name']=='$name'];print(a[0] if a else '')")
[ -n "$aid" ] && curl -sf -X DELETE "$base/releases/$relid/assets/$aid" -H "$hdr" || true
echo "Uploading $name -> release '$tag'..."
curl -sf -X POST "$base/releases/$relid/assets?name=$name" -H "$hdr" -F "attachment=@$f"
done done
echo "Готово: $tag"
- name: Stash APK (dispatch)
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
run: |
mkdir -p ~/rd-ci-out
cp dist/*.apk ~/rd-ci-out/
ls -la ~/rd-ci-out/*.apk
+17 -33
View File
@@ -1,12 +1,11 @@
name: build-windows name: build-windows
# Собирает преднастроенный RustDesk-клиент под Windows на раннере `windows` (= GUSIK-PC, # Собирает преднастроенный RustDesk-клиент под Windows на раннере `windows` (тулчейн уже поднят —
# где тулчейн уже поднят: Rust 1.75, Flutter 3.24.5, vcpkg@пин, LLVM 15, rustfmt). # см. scripts/provision-windows.ps1). Всю логику несёт scripts/build-windows.ps1.
# Всю логику несёт scripts/build-windows.ps1 — тот же путь, что и локально.
# #
# Секреты репозитория (Settings -> Actions -> Secrets): # Секреты репозитория (Settings -> Actions -> Secrets):
# RUSTDESK_SERVER — хост hbbs (напр. rd.enersbyt.ru) # RUSTDESK_SERVER, RUSTDESK_PUB_KEY, (опц.) RUSTDESK_PRESET_PASSWORD
# RUSTDESK_PUB_KEY — публичный ключ сервера (base64) # Публикация: установщик кладётся в Gitea Release `latest` (обновляется каждый прогон — стабильная
# Публикация: на теге v* установщик прикрепляется к Gitea Release; иначе кладётся в S:\rd-ci\out. # ссылка на актуальный билд), а на теге v* — ещё и в версионный релиз.
on: on:
workflow_dispatch: workflow_dispatch:
@@ -16,11 +15,6 @@ on:
permissions: permissions:
contents: write contents: write
env:
REGISTRY_HOST: gitea.gusik.tech
# Клон rustdesk (+ многогиговый target/) — на S:, т.к. C: на раннере тесный.
RUSTDESK_SRC_DIR: 'S:\rd-ci\rustdesk'
jobs: jobs:
windows: windows:
runs-on: windows runs-on: windows
@@ -28,7 +22,6 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
# rustup ставился с --no-modify-path — гарантируем cargo/rustup в PATH раннера.
- name: Add cargo to PATH - name: Add cargo to PATH
shell: pwsh shell: pwsh
run: Add-Content -Path $env:GITHUB_PATH -Value "$env:USERPROFILE\.cargo\bin" run: Add-Content -Path $env:GITHUB_PATH -Value "$env:USERPROFILE\.cargo\bin"
@@ -38,40 +31,31 @@ jobs:
env: env:
RUSTDESK_SERVER: ${{ secrets.RUSTDESK_SERVER }} RUSTDESK_SERVER: ${{ secrets.RUSTDESK_SERVER }}
RUSTDESK_PUB_KEY: ${{ secrets.RUSTDESK_PUB_KEY }} RUSTDESK_PUB_KEY: ${{ secrets.RUSTDESK_PUB_KEY }}
RUSTDESK_PRESET_PASSWORD: ${{ secrets.RUSTDESK_PRESET_PASSWORD }}
run: pwsh -NoProfile -File scripts/build-windows.ps1 run: pwsh -NoProfile -File scripts/build-windows.ps1
- name: Attach installer to Gitea Release - name: Publish installer to Gitea Release
if: startsWith(github.ref, 'refs/tags/v')
shell: pwsh shell: pwsh
env: env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITEA_API: ${{ env.REGISTRY_HOST }}
GITHUB_REPOSITORY: ${{ github.repository }}
GITHUB_REF_NAME: ${{ github.ref_name }}
run: | run: |
$ErrorActionPreference = 'Stop' $ErrorActionPreference = 'Stop'
$base = "https://$($env:GITEA_API)/api/v1/repos/$($env:GITHUB_REPOSITORY)" $base = "$env:GITHUB_SERVER_URL/api/v1/repos/$env:GITHUB_REPOSITORY"
$tag = $env:GITHUB_REF_NAME $isTag = $env:GITHUB_REF -like 'refs/tags/v*'
$tag = if ($isTag) { $env:GITHUB_REF_NAME } else { 'latest' }
$hdr = @{ Authorization = "token $env:GITEA_TOKEN" } $hdr = @{ Authorization = "token $env:GITEA_TOKEN" }
$body = @{ tag_name = $tag; name = $tag; draft = $false; prerelease = $false } | ConvertTo-Json -Compress $body = @{ tag_name=$tag; name=$tag; draft=$false; prerelease=(-not $isTag); target_commitish='master' } | ConvertTo-Json -Compress
try { Invoke-RestMethod -Method Post -Uri "$base/releases" -Headers $hdr -ContentType 'application/json' -Body $body | Out-Null } catch { } try { Invoke-RestMethod -Method Post -Uri "$base/releases" -Headers $hdr -ContentType 'application/json' -Body $body | Out-Null } catch { }
$rel = Invoke-RestMethod -Uri "$base/releases/tags/$tag" -Headers $hdr $rel = Invoke-RestMethod -Uri "$base/releases/tags/$tag" -Headers $hdr
if (-not $rel.id) { throw "не удалось получить release id для $tag" } if (-not $rel.id) { throw "нет release id для $tag" }
$files = Get-ChildItem -Path dist -Filter 'rustdesk-*-install.exe' -File $files = Get-ChildItem -Path dist -Filter 'rustdesk-*-install.exe' -File
if (-not $files) { throw "нет установщика в dist/" } if (-not $files) { throw "нет установщика в dist/" }
foreach ($f in $files) { foreach ($f in $files) {
Write-Host "Uploading $($f.Name)..." foreach ($a in @($rel.assets | Where-Object { $_.name -eq $f.Name })) {
try { Invoke-RestMethod -Method Delete -Uri "$base/releases/$($rel.id)/assets/$($a.id)" -Headers $hdr | Out-Null } catch { }
}
Write-Host "Uploading $($f.Name) -> release '$tag'..."
& curl.exe -sf -X POST "$base/releases/$($rel.id)/assets?name=$($f.Name)" -H "Authorization: token $env:GITEA_TOKEN" -F "attachment=@$($f.FullName)" & curl.exe -sf -X POST "$base/releases/$($rel.id)/assets?name=$($f.Name)" -H "Authorization: token $env:GITEA_TOKEN" -F "attachment=@$($f.FullName)"
if ($LASTEXITCODE -ne 0) { throw "upload failed: $($f.Name)" } if ($LASTEXITCODE -ne 0) { throw "upload failed: $($f.Name)" }
} }
Write-Host "Прикреплено к релизу $tag." Write-Host "Готово: $tag"
# Для ручного запуска (без тега) — сохранить установщик в стабильное место на раннере (GUSIK-PC).
- name: Stash installer (dispatch)
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
shell: pwsh
run: |
$out = 'S:\rd-ci\out'
New-Item -ItemType Directory -Force $out | Out-Null
Copy-Item dist\rustdesk-*-install.exe $out -Force
Get-ChildItem $out\rustdesk-*-install.exe | ForEach-Object { Write-Host "Установщик: $($_.FullName) ($([math]::Round($_.Length/1MB,1)) MB)" }
+9 -3
View File
@@ -45,9 +45,15 @@ pwsh -File scripts/build-windows.ps1 # provision сам доустанов
## Платформы ## Платформы
- **Windows** — локально на GUSIK-PC + CI-раннер `windows:host`. - **Windows** — локально + CI-раннер с меткой `windows`.
- **Android** — CI на build-VM 118 (NDK r28c, cargo-ndk 3.1.2), раздача APK как в GusVoice - **Android** (arm64-v8a) — CI-раннер с меткой `android` (NDK r28c, cargo-ndk 3.1.2); раздача APK
(gitea release + self-hosted F-Droid). через Gitea Release (+ self-hosted F-Droid опционально).
## Публикация артефактов
CI кладёт свежие `exe`/`apk` в Gitea Release **`latest`** (обновляется каждый прогон — стабильная ссылка
на актуальный билд). На теге `v*` — дополнительно версионный релиз. Триггеры: тег `v*` или ручной запуск
workflow. Значения сервера/ключа/пароля берутся из Actions secrets (в репозитории их нет).
## Лицензия ## Лицензия
+10 -10
View File
@@ -11,10 +11,10 @@
| `scripts/bump-upstream.sh` | `[<tag>|latest]` → тянет пины тулчейна из CI-конфигов целевого тега RustDesk (flutter-build.yml + bridge.yml) и переписывает `upstream.txt` (с диффом). Так бамп версии не разъезжается с Flutter/vcpkg/LLVM/FRB/NDK. | | `scripts/bump-upstream.sh` | `[<tag>|latest]` → тянет пины тулчейна из CI-конфигов целевого тега RustDesk (flutter-build.yml + bridge.yml) и переписывает `upstream.txt` (с диффом). Так бамп версии не разъезжается с Flutter/vcpkg/LLVM/FRB/NDK. |
| `scripts/provision-windows.ps1` | Идемпотентно доводит тулчейн до пинов (Rust+rustfmt, Flutter, LLVM, vcpkg@коммит). Ставит только отсутствующее/несовпадающее. Зовётся из build-windows.ps1 (skip: `RD_SKIP_PROVISION=1`). | | `scripts/provision-windows.ps1` | Идемпотентно доводит тулчейн до пинов (Rust+rustfmt, Flutter, LLVM, vcpkg@коммит). Ставит только отсутствующее/несовпадающее. Зовётся из build-windows.ps1 (skip: `RD_SKIP_PROVISION=1`). |
| `scripts/build-windows.ps1` | Оркестратор Windows-сборки: provision → load env → клон@пин → preconfigure → codegen → vcpkg install → build.py → портативный установщик → `dist/`. | | `scripts/build-windows.ps1` | Оркестратор Windows-сборки: provision → load env → клон@пин → preconfigure → codegen → vcpkg install → build.py → портативный установщик → `dist/`. |
| `scripts/provision-android.sh` | Идемпотентный Android-тулчейн на VM 118 под пины (Flutter/NDK/cargo-ndk/vcpkg/JDK17/apt). Пишет `~/dev/rd-android.env`. | | `scripts/provision-android.sh` | Идемпотентный Android-тулчейн на build-VM под пины (Flutter/NDK/cargo-ndk/vcpkg/JDK17/apt). Пишет `~/dev/rd-android.env`. |
| `scripts/build-android.sh` | Оркестратор Android APK (arm64-v8a): env → клон@пин → preconfigure → build_android_deps → codegen → cargo-ndk → jniLibs → flutter apk → `dist/`. | | `scripts/build-android.sh` | Оркестратор Android APK (arm64-v8a): env → клон@пин → preconfigure → build_android_deps → codegen → cargo-ndk → jniLibs → flutter apk → `dist/`. |
| `config/server.env.example` | Шаблон значений. Реальный `config/server.env` — в `.gitignore`. | | `config/server.env.example` | Шаблон значений. Реальный `config/server.env` — в `.gitignore`. |
| `.gitea/workflows/` | CI: `build-windows.yaml` (раннер `windows`, ✅ зелёный), `build-android.yaml` (раннер `android`/VM 118). | | `.gitea/workflows/` | CI: `build-windows.yaml` (раннер `windows`, ✅ зелёный), `build-android.yaml` (раннер `android`/build-VM). |
| `rustdesk/` | Клон апстрима (gitignored, создаётся сборкой). | | `rustdesk/` | Клон апстрима (gitignored, создаётся сборкой). |
| `dist/` | Готовые артефакты (gitignored). | | `dist/` | Готовые артефакты (gitignored). |
@@ -31,7 +31,7 @@ pub const RS_PUB_KEY: &str = "OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=";
- Альтернатива без сборки (на будущее): переименовать официальный бинарь в - Альтернатива без сборки (на будущее): переименовать официальный бинарь в
`rustdesk-host=<server>,key=<pubkey>.exe` — конфиг читается из имени файла (`EXE_RENDEZVOUS_SERVER`). `rustdesk-host=<server>,key=<pubkey>.exe` — конфиг читается из имени файла (`EXE_RENDEZVOUS_SERVER`).
## Windows toolchain (поднять один раз на GUSIK-PC) ## Windows toolchain (поднять один раз на Windows-хосте)
Версии — из `upstream.txt` (пины из `flutter-build.yml@1.4.9`): Версии — из `upstream.txt` (пины из `flutter-build.yml@1.4.9`):
- **Rust 1.75** — `rustup toolchain install 1.75`; в дереве клона `rustup override set 1.75` - **Rust 1.75** — `rustup toolchain install 1.75`; в дереве клона `rustup override set 1.75`
@@ -63,9 +63,9 @@ RUSTC_BOOTSTRAP=1 нужен, т.к. cargo-expand требует nightly-фич,
`generated_bridge.dart`/`.freezed.dart` нет → flutter build падает `EventToUI_Event/RustdeskImpl isn't a type`. `generated_bridge.dart`/`.freezed.dart` нет → flutter build падает `EventToUI_Event/RustdeskImpl isn't a type`.
Поэтому проверять надо dart-файлы, не только rust. Поэтому проверять надо dart-файлы, не только rust.
### Грабля: portable-pack и python3-заглушка (GUSIK-PC) ### Грабля: portable-pack и python3-заглушка (Windows-хосте)
`build.py --flutter` в конце зовёт `python3 ./generate.py` для сборки портативного установщика. На `build.py --flutter` в конце зовёт `python3 ./generate.py` для сборки портативного установщика. На
GUSIK-PC `python3` = Microsoft Store-заглушка (реальный только `python` = 3.12) → шаг падает Windows-хосте `python3` = Microsoft Store-заглушка (реальный только `python` = 3.12) → шаг падает
(«Python Error occurred when executing generate.py»), хотя **клиент к этому моменту уже собран** в («Python Error occurred when executing generate.py»), хотя **клиент к этому моменту уже собран** в
`flutter/build/windows/x64/runner/Release/`. Поэтому `build-windows.ps1` зовёт `build.py --skip-portable-pack`, `flutter/build/windows/x64/runner/Release/`. Поэтому `build-windows.ps1` зовёт `build.py --skip-portable-pack`,
а установщик пакует отдельным шагом реальным `python generate.py``target/release/rustdesk-portable-packer.exe` а установщик пакует отдельным шагом реальным `python generate.py``target/release/rustdesk-portable-packer.exe`
@@ -75,10 +75,10 @@ GUSIK-PC `python3` = Microsoft Store-заглушка (реальный толь
Стоковый Flutter 3.24.5 x64 engine отработал — `flutter build windows` собрался БЕЗ кастомного Стоковый Flutter 3.24.5 x64 engine отработал — `flutter build windows` собрался БЕЗ кастомного
`windows-x64-release.zip` (тот нужен апстриму только для Win7). Для Win10/11 подмена не требуется. `windows-x64-release.zip` (тот нужен апстриму только для Win7). Для Win10/11 подмена не требуется.
## Android (VM 118, раннер `android`) ## Android (build-VM, раннер `android`)
Тулчейн: `scripts/provision-android.sh` (Flutter 3.24.5, NDK r28c от Google напрямую, cargo-ndk 3.1.2, Тулчейн: `scripts/provision-android.sh` (Flutter 3.24.5, NDK r28c от Google напрямую, cargo-ndk 3.1.2,
Rust+aarch64-target, vcpkg@пин, FRB codegen; apt: clang/cmake/nasm/libssl-dev/openjdk-17). Пишет Rust+aarch64-target, vcpkg@пин, FRB codegen; apt: clang/cmake/nasm/libssl-dev/openjdk-17). Пишет
`~/dev/rd-android.env`. Ставит в `~/dev` (диск VM расширен до 84G, было 64G). `~/dev/rd-android.env`. Ставит в `~/dev` (нужно ~40 ГБ свободного места под vcpkg-android/target).
Сборка: `scripts/build-android.sh` (arm64-v8a): клон@пин → preconfigure → `build_android_deps.sh arm64-v8a` Сборка: `scripts/build-android.sh` (arm64-v8a): клон@пин → preconfigure → `build_android_deps.sh arm64-v8a`
(vcpkg под arm, ffmpeg/aom из исходников — долго) → FRB codegen (`--llvm-path` авто) → `cargo ndk build` (vcpkg под arm, ffmpeg/aom из исходников — долго) → FRB codegen (`--llvm-path` авто) → `cargo ndk build`
→ jniLibs (.so+libc++_shared.so) → `flutter build apk``dist/rustdesk-<tag>-arm64.apk`. → jniLibs (.so+libc++_shared.so) → `flutter build apk``dist/rustdesk-<tag>-arm64.apk`.
@@ -97,14 +97,14 @@ Rust+aarch64-target, vcpkg@пин, FRB codegen; apt: clang/cmake/nasm/libssl-dev
Публикация APK: `.gitea/workflows/build-android.yaml` (раннер `android`) → gitea release на теге. F-Droid — позже. Публикация APK: `.gitea/workflows/build-android.yaml` (раннер `android`) → gitea release на теге. F-Droid — позже.
## Грабли: прокси и vcpkg (GUSIK-PC) ## Грабли: прокси и vcpkg (Windows-хосте)
На машине в env задан `NO_PROXY=...,192.168.5.0/24,...` (CIDR). WinHTTP-загрузчик vcpkg (и На машине в env задан `NO_PROXY=...,10.0.0.0/8,...` (CIDR). WinHTTP-загрузчик vcpkg (и
`bootstrap.ps1`) не парсит CIDR → падает с `WinHttpSetOption/WinHttpOpen error 87/0x57` на первом же `bootstrap.ps1`) не парсит CIDR → падает с `WinHttpSetOption/WinHttpOpen error 87/0x57` на первом же
скачивании (nasm и т.п.). У машины есть прямой интернет (`netsh winhttp` = Direct, HEAD к nasm.us = 200), скачивании (nasm и т.п.). У машины есть прямой интернет (`netsh winhttp` = Direct, HEAD к nasm.us = 200),
поэтому `build-windows.ps1` **очищает HTTP(S)_PROXY/NO_PROXY для процесса** сборки — качается напрямую. поэтому `build-windows.ps1` **очищает HTTP(S)_PROXY/NO_PROXY для процесса** сборки — качается напрямую.
vcpkg.exe тоже качали вручную через IWR (bootstrap не смог) — лежит в `S:\dev\vcpkg\vcpkg.exe` (tool 2025-07-21). vcpkg.exe тоже качали вручную через IWR (bootstrap не смог) — лежит в `S:\dev\vcpkg\vcpkg.exe` (tool 2025-07-21).
## Тулчейн (фактические пути на GUSIK-PC) ## Тулчейн (фактические пути на Windows-хосте)
Flutter: `S:\dev\flutter` · vcpkg: `S:\dev\vcpkg` (VCPKG_ROOT) · **LLVM 15.0.6: `S:\dev\LLVM`** Flutter: `S:\dev\flutter` · vcpkg: `S:\dev\vcpkg` (VCPKG_ROOT) · **LLVM 15.0.6: `S:\dev\LLVM`**
(VS-бандл содержит только clang-format/tidy, БЕЗ libclang.dll — ставили LLVM отдельно, LIBCLANG_PATH=`S:\dev\LLVM\bin`) · (VS-бандл содержит только clang-format/tidy, БЕЗ libclang.dll — ставили LLVM отдельно, LIBCLANG_PATH=`S:\dev\LLVM\bin`) ·
Rust 1.75 (rustup override в клоне) · MSVC 14.44 из vcvars64. Rust 1.75 (rustup override в клоне) · MSVC 14.44 из vcvars64.
+2 -2
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Собирает преднастроенный RustDesk APK (arm64-v8a) под self-hosted сервер. Linux/VM 118. # Собирает преднастроенный RustDesk APK (arm64-v8a) под self-hosted сервер. Debian/Ubuntu build-машина.
# Тулчейн — provision-android.sh (пишет ~/dev/rd-android.env). Логика зеркалит build-windows.ps1. # Тулчейн — provision-android.sh (пишет ~/dev/rd-android.env). Логика зеркалит build-windows.ps1.
# #
# Конфиг сервера: env RUSTDESK_SERVER/RUSTDESK_PUB_KEY (CI secrets) или config/server.env. # Конфиг сервера: env RUSTDESK_SERVER/RUSTDESK_PUB_KEY (CI secrets) или config/server.env.
@@ -77,7 +77,7 @@ mkdir -p "$JNI"
cp ./target/aarch64-linux-android/release/liblibrustdesk.so "$JNI/librustdesk.so" cp ./target/aarch64-linux-android/release/liblibrustdesk.so "$JNI/librustdesk.so"
cp "$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so" "$JNI/" cp "$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so" "$JNI/"
# --- подпись: без key.properties (keystore Глеба) release подписываем DEBUG-ключом --- # --- подпись: без key.properties (своего keystore) release подписываем DEBUG-ключом ---
# (APK ставится для теста; преднастройка от подписи не зависит — она в librustdesk.so). # (APK ставится для теста; преднастройка от подписи не зависит — она в librustdesk.so).
# Дашь свой keystore -> положи flutter/android/key.properties, тогда подпишется им (для раздачи/F-Droid). # Дашь свой keystore -> положи flutter/android/key.properties, тогда подпишется им (для раздачи/F-Droid).
if ! grep -q 'keystorePropertiesFile.exists() ? signingConfigs.release' flutter/android/app/build.gradle; then if ! grep -q 'keystorePropertiesFile.exists() ? signingConfigs.release' flutter/android/app/build.gradle; then
+3 -3
View File
@@ -1,5 +1,5 @@
<# <#
Локальная сборка преднастроенного RustDesk-клиента под Windows (GUSIK-PC). Локальная сборка преднастроенного RustDesk-клиента под Windows.
Клон rustdesk@пин -> preconfigure (вшить сервер+ключ) -> vcpkg install -> python build.py --flutter -> dist/. Клон rustdesk@пин -> preconfigure (вшить сервер+ключ) -> vcpkg install -> python build.py --flutter -> dist/.
Тулчейн (ставится один раз, см. docs/CODEMAP.md): Тулчейн (ставится один раз, см. docs/CODEMAP.md):
@@ -53,7 +53,7 @@ $vcvars = Join-Path $vsPath 'VC\Auxiliary\Build\vcvars64.bat'
Write-Host "Импорт VS dev-env: $vcvars" -ForegroundColor DarkCyan Write-Host "Импорт VS dev-env: $vcvars" -ForegroundColor DarkCyan
cmd /c "`"$vcvars`" >nul && set" | ForEach-Object { if ($_ -match '^([^=]+)=(.*)$') { Set-Item "Env:$($matches[1])" $matches[2] } } cmd /c "`"$vcvars`" >nul && set" | ForEach-Object { if ($_ -match '^([^=]+)=(.*)$') { Set-Item "Env:$($matches[1])" $matches[2] } }
# CIDR в NO_PROXY (напр. 192.168.5.0/24) ломает WinHTTP-загрузчик vcpkg (WinHttpSetOption 87). # CIDR в NO_PROXY (напр. 10.0.0.0/8) ломает WinHTTP-загрузчик vcpkg (WinHttpSetOption 87).
# У машины есть прямой интернет -> убираем прокси-env для процесса сборки (системные настройки не трогаем). # У машины есть прямой интернет -> убираем прокси-env для процесса сборки (системные настройки не трогаем).
foreach ($p in 'HTTP_PROXY','HTTPS_PROXY','NO_PROXY','ALL_PROXY','http_proxy','https_proxy','no_proxy') { Set-Item "Env:$p" $null -EA SilentlyContinue } foreach ($p in 'HTTP_PROXY','HTTPS_PROXY','NO_PROXY','ALL_PROXY','http_proxy','https_proxy','no_proxy') { Set-Item "Env:$p" $null -EA SilentlyContinue }
@@ -135,7 +135,7 @@ if ($LASTEXITCODE) { Pop-Location; throw "vcpkg install упал ($LASTEXITCODE)
Pop-Location Pop-Location
# --- сборка клиента (без портативной упаковки: её build.py делает через `python3`, # --- сборка клиента (без портативной упаковки: её build.py делает через `python3`,
# а на GUSIK-PC python3 = Store-заглушка -> падает; пакуем отдельно реальным python) --- # на этой машине python3 = Store-заглушка -> падает; пакуем отдельно реальным python) ---
Write-Host "python build.py --flutter --skip-portable-pack..." -ForegroundColor Cyan Write-Host "python build.py --flutter --skip-portable-pack..." -ForegroundColor Cyan
Push-Location $src Push-Location $src
python build.py --flutter --skip-portable-pack python build.py --flutter --skip-portable-pack
+1 -1
View File
@@ -76,7 +76,7 @@ VCPKG_TRIPLET=$VCPKG_TRIPLET
FRB_VERSION=$FRB_VERSION FRB_VERSION=$FRB_VERSION
CARGO_EXPAND_VERSION=$CARGO_EXPAND_VERSION CARGO_EXPAND_VERSION=$CARGO_EXPAND_VERSION
# Android (VM 118) # Android
ANDROID_FLUTTER_VERSION=$ANDROID_FLUTTER_VERSION ANDROID_FLUTTER_VERSION=$ANDROID_FLUTTER_VERSION
CARGO_NDK_VERSION=$CARGO_NDK_VERSION CARGO_NDK_VERSION=$CARGO_NDK_VERSION
NDK_VERSION=$NDK_VERSION NDK_VERSION=$NDK_VERSION
+8 -1
View File
@@ -64,7 +64,14 @@ if [ "${RUSTDESK_NO_CUSTOM_CLIENT:-}" != "1" ]; then
"$PY" - "$SRC/src/custom_client.json" "$FIRST_SRV" "$RUSTDESK_PUB_KEY" "${RUSTDESK_API_SERVER:-}" "${RUSTDESK_PRESET_PASSWORD:-}" "$LOCK_PW" <<'PYEOF' "$PY" - "$SRC/src/custom_client.json" "$FIRST_SRV" "$RUSTDESK_PUB_KEY" "${RUSTDESK_API_SERVER:-}" "${RUSTDESK_PRESET_PASSWORD:-}" "$LOCK_PW" <<'PYEOF'
import sys, json, hashlib, base64, secrets import sys, json, hashlib, base64, secrets
out, server, key, api, preset_pw, lock_pw = sys.argv[1:7] out, server, key, api, preset_pw, lock_pw = sys.argv[1:7]
override = {"custom-rendezvous-server": server, "relay-server": server, "key": key} override = {
"custom-rendezvous-server": server,
"relay-server": server,
"key": key,
"enable-check-update": "N", # выключить проверку обновлений
}
# Подсказка «set up your own server» гаснет сама: using_public_server()=пуст ли custom-rendezvous-server,
# а он у нас в override -> непуст -> подсказки нет.
if api: if api:
override["api-server"] = api override["api-server"] = api
cfg = {"override-settings": override} cfg = {"override-settings": override}
+1 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Идемпотентно ставит Android-тулчейн под пины upstream.txt (сборка RustDesk APK). # Идемпотентно ставит Android-тулчейн под пины upstream.txt (сборка RustDesk APK).
# Debian/Ubuntu (VM 118). Android SDK уже в /opt/android-sdk. Ставит в ~/dev. # Debian/Ubuntu build-машина. Ожидает Android SDK в /opt/android-sdk. Ставит в ~/dev.
# Ставит только отсутствующее -> после bump-upstream.sh достаточно перезапустить. # Ставит только отсутствующее -> после bump-upstream.sh достаточно перезапустить.
set -euo pipefail set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)" ROOT="$(cd "$(dirname "$0")/.." && pwd)"
+1 -1
View File
@@ -16,7 +16,7 @@ VCPKG_TRIPLET=x64-windows-static
FRB_VERSION=1.80.1 FRB_VERSION=1.80.1
CARGO_EXPAND_VERSION=1.0.95 CARGO_EXPAND_VERSION=1.0.95
# Android (VM 118) # Android
ANDROID_FLUTTER_VERSION=3.24.5 ANDROID_FLUTTER_VERSION=3.24.5
CARGO_NDK_VERSION=3.1.2 CARGO_NDK_VERSION=3.1.2
NDK_VERSION=r28c NDK_VERSION=r28c