CI: build-windows.yaml (раннер windows) + build-windows.ps1 CI-ready
Конфиг сервера из env-secrets (не только из файла), клон rustdesk переопределяем через RUSTDESK_SRC_DIR (на S:, C: раннера тесный). Workflow: сборка на GUSIK-PC + attach установщика к Gitea Release на v*. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,77 @@
|
|||||||
|
name: build-windows
|
||||||
|
# Собирает преднастроенный RustDesk-клиент под Windows на раннере `windows` (= GUSIK-PC,
|
||||||
|
# где тулчейн уже поднят: Rust 1.75, Flutter 3.24.5, vcpkg@пин, LLVM 15, rustfmt).
|
||||||
|
# Всю логику несёт scripts/build-windows.ps1 — тот же путь, что и локально.
|
||||||
|
#
|
||||||
|
# Секреты репозитория (Settings -> Actions -> Secrets):
|
||||||
|
# RUSTDESK_SERVER — хост hbbs (напр. rd.enersbyt.ru)
|
||||||
|
# RUSTDESK_PUB_KEY — публичный ключ сервера (base64)
|
||||||
|
# Публикация: на теге v* установщик прикрепляется к Gitea Release; иначе кладётся в S:\rd-ci\out.
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
tags: ['v*']
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY_HOST: gitea.gusik.tech
|
||||||
|
# Клон rustdesk (+ многогиговый target/) — на S:, т.к. C: на раннере тесный.
|
||||||
|
RUSTDESK_SRC_DIR: 'S:\rd-ci\rustdesk'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
windows:
|
||||||
|
runs-on: windows
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# rustup ставился с --no-modify-path — гарантируем cargo/rustup в PATH раннера.
|
||||||
|
- name: Add cargo to PATH
|
||||||
|
shell: pwsh
|
||||||
|
run: Add-Content -Path $env:GITHUB_PATH -Value "$env:USERPROFILE\.cargo\bin"
|
||||||
|
|
||||||
|
- name: Build preconfigured client
|
||||||
|
shell: pwsh
|
||||||
|
env:
|
||||||
|
RUSTDESK_SERVER: ${{ secrets.RUSTDESK_SERVER }}
|
||||||
|
RUSTDESK_PUB_KEY: ${{ secrets.RUSTDESK_PUB_KEY }}
|
||||||
|
run: pwsh -NoProfile -File scripts/build-windows.ps1
|
||||||
|
|
||||||
|
- name: Attach installer to Gitea Release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
shell: pwsh
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
GITEA_API: ${{ env.REGISTRY_HOST }}
|
||||||
|
GITHUB_REPOSITORY: ${{ github.repository }}
|
||||||
|
GITHUB_REF_NAME: ${{ github.ref_name }}
|
||||||
|
run: |
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$base = "https://$($env:GITEA_API)/api/v1/repos/$($env:GITHUB_REPOSITORY)"
|
||||||
|
$tag = $env:GITHUB_REF_NAME
|
||||||
|
$hdr = @{ Authorization = "token $env:GITEA_TOKEN" }
|
||||||
|
$body = @{ tag_name = $tag; name = $tag; draft = $false; prerelease = $false } | ConvertTo-Json -Compress
|
||||||
|
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
|
||||||
|
if (-not $rel.id) { throw "не удалось получить release id для $tag" }
|
||||||
|
$files = Get-ChildItem -Path dist -Filter 'rustdesk-*-install.exe' -File
|
||||||
|
if (-not $files) { throw "нет установщика в dist/" }
|
||||||
|
foreach ($f in $files) {
|
||||||
|
Write-Host "Uploading $($f.Name)..."
|
||||||
|
& 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)" }
|
||||||
|
}
|
||||||
|
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)" }
|
||||||
@@ -14,8 +14,7 @@
|
|||||||
param([switch]$Clean, [switch]$SkipBuild)
|
param([switch]$Clean, [switch]$SkipBuild)
|
||||||
$ErrorActionPreference = 'Stop'
|
$ErrorActionPreference = 'Stop'
|
||||||
$root = Split-Path -Parent $PSScriptRoot
|
$root = Split-Path -Parent $PSScriptRoot
|
||||||
$src = Join-Path $root 'rustdesk'
|
$dist = Join-Path $root 'dist' # $src задаётся ниже (переопределяемо через RUSTDESK_SRC_DIR)
|
||||||
$dist = Join-Path $root 'dist'
|
|
||||||
|
|
||||||
# --- пины ---
|
# --- пины ---
|
||||||
$pins = @{}
|
$pins = @{}
|
||||||
@@ -29,14 +28,18 @@ Write-Host "== RustDesk custom build == tag=$TAG triplet=$TRIPLET" -ForegroundCo
|
|||||||
$FlutterHome = if ($env:FLUTTER_HOME) { $env:FLUTTER_HOME } else { 'S:\dev\flutter' }
|
$FlutterHome = if ($env:FLUTTER_HOME) { $env:FLUTTER_HOME } else { 'S:\dev\flutter' }
|
||||||
$VcpkgRoot = if ($env:VCPKG_ROOT) { $env:VCPKG_ROOT } else { 'S:\dev\vcpkg' }
|
$VcpkgRoot = if ($env:VCPKG_ROOT) { $env:VCPKG_ROOT } else { 'S:\dev\vcpkg' }
|
||||||
$BashExe = 'C:\Program Files\Git\bin\bash.exe'
|
$BashExe = 'C:\Program Files\Git\bin\bash.exe'
|
||||||
|
# Клон rustdesk (с многогиговым target/) — переопределяемо на S: (в CI checkout может лежать на C:).
|
||||||
|
$src = if ($env:RUSTDESK_SRC_DIR) { $env:RUSTDESK_SRC_DIR } else { Join-Path $root 'rustdesk' }
|
||||||
|
|
||||||
# --- config/server.env ---
|
# --- конфиг сервера: из env (CI secrets) ИЛИ config/server.env (локально) ---
|
||||||
$envFile = Join-Path $root 'config\server.env'
|
if (-not ($env:RUSTDESK_SERVER -and $env:RUSTDESK_PUB_KEY)) {
|
||||||
if (-not (Test-Path $envFile)) { throw "Нет $envFile — скопируй config\server.env.example и заполни RUSTDESK_SERVER/RUSTDESK_PUB_KEY." }
|
$envFile = Join-Path $root 'config\server.env'
|
||||||
Get-Content $envFile | Where-Object { $_ -match '^\s*[A-Z].*=' } | ForEach-Object {
|
if (-not (Test-Path $envFile)) { throw "Нет ни env RUSTDESK_SERVER/RUSTDESK_PUB_KEY (CI secrets), ни $envFile (локально — скопируй server.env.example)." }
|
||||||
$k,$v = $_ -split '=',2; Set-Item -Path "Env:$($k.Trim())" -Value $v.Trim()
|
Get-Content $envFile | Where-Object { $_ -match '^\s*[A-Z].*=' } | ForEach-Object {
|
||||||
|
$k,$v = $_ -split '=',2; Set-Item -Path "Env:$($k.Trim())" -Value $v.Trim()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (-not $env:RUSTDESK_SERVER -or -not $env:RUSTDESK_PUB_KEY) { throw "В config\server.env не заданы RUSTDESK_SERVER/RUSTDESK_PUB_KEY." }
|
if (-not $env:RUSTDESK_SERVER -or -not $env:RUSTDESK_PUB_KEY) { throw "Не заданы RUSTDESK_SERVER/RUSTDESK_PUB_KEY." }
|
||||||
|
|
||||||
# --- импорт VS dev-env (MSVC/CMake/Windows SDK в PATH) ---
|
# --- импорт VS dev-env (MSVC/CMake/Windows SDK в PATH) ---
|
||||||
$vsw = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
$vsw = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
|
||||||
|
|||||||
Reference in New Issue
Block a user