pipeline { agent none environment { TAIGA_PROJECT_ID = '1' TAIGA_URL = 'https://taiga.grigowashere.ru' } stages { stage('Build Windows Qt') { agent { label 'windows' } steps { deleteDir() checkout scm bat ''' call "C:\\Program Files (x86)\\Microsoft Visual Studio\\2022\\BuildTools\\VC\\Auxiliary\\Build\\vcvars64.bat" cmake -S . -B build\\windows -G Ninja ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_TOOLCHAIN_FILE=C:\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake ^ -DVCPKG_TARGET_TRIPLET=x64-windows cmake --build build\\windows if exist dist\\windows rmdir /s /q dist\\windows mkdir dist\\windows copy build\\windows\\test_app.exe dist\\windows\\test_app.exe for /f "delims=" %%i in ('dir /b /s C:\\vcpkg\\installed\\x64-windows\\tools\\Qt6\\windeployqt.exe') do set WINDEPLOYQT=%%i "%WINDEPLOYQT%" --release --no-translations dist\\windows\\test_app.exe xcopy /Y /I C:\\vcpkg\\installed\\x64-windows\\bin\\*.dll dist\\windows\\ ''' archiveArtifacts artifacts: 'dist/windows/**', fingerprint: true } } stage('Create Gitea Release and Upload ZIP') { agent { label 'windows' } steps { withCredentials([string(credentialsId: 'Gitea_Credentials', variable: 'GITEA_TOKEN')]) { writeFile file: 'gitea-release.ps1', text: ''' $ErrorActionPreference = "Stop" Compress-Archive -Path "dist\\windows\\*" -DestinationPath "dist\\windows-build.zip" -Force $headers = @{ Authorization = "token $env:GITEA_TOKEN" } $body = @{ tag_name = "v$env:BUILD_NUMBER" target_commitish = "main" name = "Release v$env:BUILD_NUMBER" body = "Jenkins build $env:BUILD_NUMBER" draft = $false prerelease = $false } | ConvertTo-Json $release = Invoke-RestMethod ` -Method Post ` -Uri "https://git.grigowashere.ru/api/v1/repos/Grigo/Testing/releases" ` -Headers $headers ` -ContentType "application/json" ` -Body $body $uploadUrl = "https://git.grigowashere.ru/api/v1/repos/Grigo/Testing/releases/$($release.id)/assets?name=windows-build.zip" Invoke-RestMethod ` -Method Post ` -Uri $uploadUrl ` -Headers $headers ` -InFile "dist\\windows-build.zip" ` -ContentType "application/zip" ''' bat ''' powershell -NoProfile -ExecutionPolicy Bypass -File gitea-release.ps1 ''' } } } } post { always { node('windows') { script { def result = currentBuild.currentResult ?: 'UNKNOWN' withCredentials([string(credentialsId: 'TAIGA_TOKEN', variable: 'TAIGA_TOKEN')]) { writeFile file: 'taiga-post.ps1', text: ''' $ErrorActionPreference = "Continue" $commitMsg = git log -1 --pretty=%B $match = [regex]::Match($commitMsg, 'TG-(\\d+)') if (-not $match.Success) { Write-Host "No TG-* reference found" exit 0 } $ref = $match.Groups[1].Value $headers = @{ Authorization = "Bearer $env:TAIGA_TOKEN" "Content-Type" = "application/json" } $targets = @( @{ endpoint = "userstories"; label = "User Story" }, @{ endpoint = "issues"; label = "Issue" }, @{ endpoint = "tasks"; label = "Task" } ) $found = $null foreach ($target in $targets) { try { $url = "$env:TAIGA_URL/api/v1/$($target.endpoint)/by_ref?project=$env:TAIGA_PROJECT_ID&ref=$ref" $data = Invoke-RestMethod -Uri $url -Headers $headers -Method Get if ($data.id) { $found = @{ endpoint = $target.endpoint label = $target.label data = $data } break } } catch { Write-Host "Taiga lookup warning" } } if (-not $found) { Write-Host "Taiga TG-$ref not found" exit 0 } $comment = "Jenkins Windows Qt build #$env:BUILD_NUMBER: $env:BUILD_RESULT`n$env:BUILD_URL" $body = @{ comment = $comment version = $found.data.version } | ConvertTo-Json try { $url = "$env:TAIGA_URL/api/v1/$($found.endpoint)/$($found.data.id)" Invoke-RestMethod -Uri $url -Headers $headers -Method Patch -Body $body Write-Host "Commented Taiga TG-$ref ($($found.label))" } catch { Write-Host "Taiga comment warning" } exit 0 ''' withEnv(["BUILD_RESULT=${result}"]) { bat(returnStatus: true, script: ''' powershell -NoProfile -ExecutionPolicy Bypass -File taiga-post.ps1 exit /b 0 ''') } } } } } } }