Приватность публичного репо + выкл. проверку обновлений + релиз 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:
@@ -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
|
|
||||||
|
|||||||
@@ -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)" }
|
|
||||||
|
|||||||
@@ -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
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user