From e06e1cadadb630e973b8ffcb0b7ad332c99093ed Mon Sep 17 00:00:00 2001 From: gusadmin Date: Tue, 14 Jul 2026 17:19:21 +0300 Subject: [PATCH] =?UTF-8?q?CI:=20build-windows.yaml=20(=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D0=B5=D1=80=20windows)=20+=20build-windows.ps1=20CI-read?= =?UTF-8?q?y?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Конфиг сервера из env-secrets (не только из файла), клон rustdesk переопределяем через RUSTDESK_SRC_DIR (на S:, C: раннера тесный). Workflow: сборка на GUSIK-PC + attach установщика к Gitea Release на v*. Co-Authored-By: Claude Opus 4.8 --- .gitea/workflows/build-windows.yaml | 77 +++++++++++++++++++++++++++++ scripts/build-windows.ps1 | 19 ++++--- 2 files changed, 88 insertions(+), 8 deletions(-) create mode 100644 .gitea/workflows/build-windows.yaml diff --git a/.gitea/workflows/build-windows.yaml b/.gitea/workflows/build-windows.yaml new file mode 100644 index 0000000..11d81f5 --- /dev/null +++ b/.gitea/workflows/build-windows.yaml @@ -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)" } diff --git a/scripts/build-windows.ps1 b/scripts/build-windows.ps1 index f7d1626..0d5fafd 100644 --- a/scripts/build-windows.ps1 +++ b/scripts/build-windows.ps1 @@ -14,8 +14,7 @@ param([switch]$Clean, [switch]$SkipBuild) $ErrorActionPreference = 'Stop' $root = Split-Path -Parent $PSScriptRoot -$src = Join-Path $root 'rustdesk' -$dist = Join-Path $root 'dist' +$dist = Join-Path $root 'dist' # $src задаётся ниже (переопределяемо через RUSTDESK_SRC_DIR) # --- пины --- $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' } $VcpkgRoot = if ($env:VCPKG_ROOT) { $env:VCPKG_ROOT } else { 'S:\dev\vcpkg' } $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 --- -$envFile = Join-Path $root 'config\server.env' -if (-not (Test-Path $envFile)) { throw "Нет $envFile — скопируй config\server.env.example и заполни RUSTDESK_SERVER/RUSTDESK_PUB_KEY." } -Get-Content $envFile | Where-Object { $_ -match '^\s*[A-Z].*=' } | ForEach-Object { - $k,$v = $_ -split '=',2; Set-Item -Path "Env:$($k.Trim())" -Value $v.Trim() +# --- конфиг сервера: из env (CI secrets) ИЛИ config/server.env (локально) --- +if (-not ($env:RUSTDESK_SERVER -and $env:RUSTDESK_PUB_KEY)) { + $envFile = Join-Path $root 'config\server.env' + if (-not (Test-Path $envFile)) { throw "Нет ни env RUSTDESK_SERVER/RUSTDESK_PUB_KEY (CI secrets), ни $envFile (локально — скопируй server.env.example)." } + 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) --- $vsw = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"