Files
bg3-dnd55e-russian-localiza…/.gitea/workflows/build.yml

208 lines
8.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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