208 lines
8.7 KiB
YAML
208 lines
8.7 KiB
YAML
name: Build Mod Package
|
||
|
||
on:
|
||
push:
|
||
tags:
|
||
- "v*"
|
||
workflow_dispatch:
|
||
|
||
permissions:
|
||
contents: write
|
||
|
||
jobs:
|
||
build:
|
||
runs-on:
|
||
- win11
|
||
env:
|
||
TG_CHAT_ID: ${{ secrets.TG_CHAT_ID }}
|
||
TG_THREAD_ID: ${{ secrets.TG_THREAD_ID }}
|
||
|
||
defaults:
|
||
run:
|
||
shell: powershell
|
||
|
||
steps:
|
||
- name: Prepare workspace
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$workspace = "${{ gitea.workspace }}"
|
||
$repoUrl = "${{ gitea.server_url }}/${{ gitea.repository }}.git"
|
||
$repoRef = "${{ gitea.ref }}"
|
||
$authPair = "${{ gitea.actor }}:${{ secrets.GITEA_TOKEN }}"
|
||
$authBytes = [System.Text.Encoding]::ASCII.GetBytes($authPair)
|
||
$authBasic = [Convert]::ToBase64String($authBytes)
|
||
|
||
New-Item -ItemType Directory -Path $workspace -Force | Out-Null
|
||
Set-Location $workspace
|
||
|
||
if (-not (Test-Path -LiteralPath ".git")) {
|
||
git init | Out-Null
|
||
git remote add origin $repoUrl
|
||
} else {
|
||
git remote set-url origin $repoUrl
|
||
}
|
||
|
||
git -c "http.extraHeader=Authorization: Basic $authBasic" fetch --depth 1 origin $repoRef
|
||
git -c "http.extraHeader=Authorization: Basic $authBasic" fetch --force --tags origin
|
||
git checkout --force FETCH_HEAD
|
||
|
||
if (-not (Test-Path -LiteralPath "Mods\\DnD 5.5e AIO Russian\\Localization\\Russian\\russian.xml")) {
|
||
throw "Repository sources are not available in the runner workspace."
|
||
}
|
||
|
||
New-Item -ItemType Directory -Path ".tools\\lslib" -Force | Out-Null
|
||
New-Item -ItemType Directory -Path "build" -Force | Out-Null
|
||
|
||
- name: Notify Telegram about build start
|
||
if: startsWith(gitea.ref, 'refs/tags/v')
|
||
continue-on-error: true
|
||
env:
|
||
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$runUrl = "${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}"
|
||
$text = "⏳ <b>Старт сборки релиза</b>`n<b>Репозиторий:</b> <code>${{ gitea.repository }}</code>`n<b>Тег:</b> <code>${{ gitea.ref_name }}</code>`n<a href=`"$runUrl`">Открыть лог сборки</a>"
|
||
.\scripts\send-telegram-notification.ps1 -BotToken $env:BOT_TOKEN -ChatId $env:TG_CHAT_ID -ThreadId $env:TG_THREAD_ID -Text $text -DisableNotification
|
||
|
||
- name: Download latest LSLib release
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$release = Invoke-RestMethod -Uri "https://api.github.com/repos/Norbyte/lslib/releases/latest"
|
||
$asset = $release.assets | Where-Object { $_.name -match '\.zip$' } | Select-Object -First 1
|
||
|
||
if (-not $asset) {
|
||
throw "Could not find a downloadable LSLib zip asset in the latest release."
|
||
}
|
||
|
||
Invoke-WebRequest -UseBasicParsing -Uri $asset.browser_download_url -OutFile ".tools/lslib/lslib.zip"
|
||
Expand-Archive -LiteralPath ".tools/lslib/lslib.zip" -DestinationPath ".tools/lslib" -Force
|
||
|
||
- name: Build .pak
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$divine = Get-ChildItem -Path ".tools/lslib" -Recurse -File |
|
||
Where-Object { $_.Name -ieq "Divine.exe" } |
|
||
Select-Object -First 1
|
||
|
||
if (-not $divine) {
|
||
throw "Divine.exe was not found in the downloaded LSLib release."
|
||
}
|
||
|
||
& ".\\scripts\\build.ps1" -DivinePath $divine.FullName -Workspace "${{ gitea.workspace }}" -VersionTag "${{ gitea.ref_name }}"
|
||
|
||
- name: Show build result
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$workspace = "${{ gitea.workspace }}"
|
||
$refName = "${{ gitea.ref_name }}"
|
||
$archiveBaseName = "DnD 5.5e AIO Russian"
|
||
if ($refName -and $refName -like "v*") {
|
||
$archiveBaseName = "DnD 5.5e AIO Russian $refName"
|
||
}
|
||
$zipPath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/$archiveBaseName.zip"))
|
||
|
||
Get-ChildItem "build/DnD 5.5e AIO Russian.pak", "build/info.json", $zipPath |
|
||
Select-Object FullName, Length, LastWriteTime
|
||
|
||
- name: Publish archive to release
|
||
if: startsWith(gitea.ref, 'refs/tags/v')
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$workspace = "${{ gitea.workspace }}"
|
||
$serverUrl = "${{ gitea.server_url }}"
|
||
$repository = "${{ gitea.repository }}"
|
||
$tagName = "${{ gitea.ref_name }}"
|
||
$zipPath = [System.IO.Path]::GetFullPath((Join-Path $workspace "build/DnD 5.5e AIO Russian $tagName.zip"))
|
||
$assetName = [System.IO.Path]::GetFileName($zipPath)
|
||
$repoParts = $repository.Split("/", 2)
|
||
|
||
if ($repoParts.Length -ne 2) {
|
||
throw "Could not parse repository owner and name from '$repository'."
|
||
}
|
||
|
||
if (-not (Test-Path -LiteralPath $zipPath)) {
|
||
throw "Release archive was not found at '$zipPath'."
|
||
}
|
||
|
||
$isPrerelease = $tagName -match '^v\d+\.\d+\.\d+-'
|
||
$owner = $repoParts[0]
|
||
$repo = $repoParts[1]
|
||
$apiBase = "$serverUrl/api/v1/repos/$owner/$repo"
|
||
$headers = @{
|
||
Authorization = "token ${{ secrets.GITEA_TOKEN }}"
|
||
Accept = "application/json"
|
||
}
|
||
|
||
$release = $null
|
||
try {
|
||
$release = Invoke-RestMethod -Method Get -Uri "$apiBase/releases/tags/$tagName" -Headers $headers
|
||
} catch {
|
||
$statusCode = $null
|
||
if ($_.Exception.Response) {
|
||
$statusCode = [int]$_.Exception.Response.StatusCode
|
||
}
|
||
|
||
if ($statusCode -ne 404) {
|
||
throw
|
||
}
|
||
}
|
||
|
||
if (-not $release) {
|
||
$releaseBody = @{
|
||
tag_name = $tagName
|
||
name = $tagName
|
||
target_commitish = "${{ gitea.sha }}"
|
||
draft = $false
|
||
prerelease = $isPrerelease
|
||
} | ConvertTo-Json
|
||
|
||
$release = Invoke-RestMethod -Method Post -Uri "$apiBase/releases" -Headers $headers -ContentType "application/json" -Body $releaseBody
|
||
} elseif ($release.prerelease -ne $isPrerelease) {
|
||
$releaseBody = @{
|
||
tag_name = $tagName
|
||
target_commitish = "${{ gitea.sha }}"
|
||
draft = $false
|
||
prerelease = $isPrerelease
|
||
} | ConvertTo-Json
|
||
|
||
$release = Invoke-RestMethod -Method Patch -Uri "$apiBase/releases/$($release.id)" -Headers $headers -ContentType "application/json" -Body $releaseBody
|
||
}
|
||
|
||
$existingAsset = $null
|
||
if ($release.assets) {
|
||
$existingAsset = $release.assets | Where-Object { $_.name -eq $assetName } | Select-Object -First 1
|
||
}
|
||
|
||
if ($existingAsset) {
|
||
Invoke-RestMethod -Method Delete -Uri "$apiBase/releases/$($release.id)/assets/$($existingAsset.id)" -Headers $headers
|
||
}
|
||
|
||
$uploadHeaders = @{
|
||
Authorization = "token ${{ secrets.GITEA_TOKEN }}"
|
||
Accept = "application/json"
|
||
}
|
||
|
||
Invoke-WebRequest -UseBasicParsing -Method Post -Uri "$apiBase/releases/$($release.id)/assets?name=$([uri]::EscapeDataString($assetName))" -Headers $uploadHeaders -ContentType "application/octet-stream" -InFile $zipPath
|
||
|
||
- name: Notify Telegram about build success
|
||
if: success() && startsWith(gitea.ref, 'refs/tags/v')
|
||
continue-on-error: true
|
||
env:
|
||
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$releaseUrl = "${{ gitea.server_url }}/${{ gitea.repository }}/releases/tag/${{ gitea.ref_name }}"
|
||
$text = "🏁 <b>Релиз собран успешно</b>`n<b>Тег:</b> <code>${{ gitea.ref_name }}</code>`n<a href=`"$releaseUrl`">Открыть готовый релиз</a>"
|
||
.\scripts\send-telegram-notification.ps1 -BotToken $env:BOT_TOKEN -ChatId $env:TG_CHAT_ID -ThreadId $env:TG_THREAD_ID -Text $text -DisableNotification
|
||
|
||
- name: Notify Telegram about build failure
|
||
if: failure() && startsWith(gitea.ref, 'refs/tags/v')
|
||
continue-on-error: true
|
||
env:
|
||
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
|
||
run: |
|
||
$ErrorActionPreference = "Stop"
|
||
$runUrl = "${{ gitea.server_url }}/${{ gitea.repository }}/actions/runs/${{ gitea.run_id }}"
|
||
$text = "❌ <b>Сборка релиза завершилась ошибкой</b>`n<b>Тег:</b> <code>${{ gitea.ref_name }}</code>`n<a href=`"$runUrl`">Открыть лог сборки</a>"
|
||
.\scripts\send-telegram-notification.ps1 -BotToken $env:BOT_TOKEN -ChatId $env:TG_CHAT_ID -ThreadId $env:TG_THREAD_ID -Text $text
|