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('Upload Artifacts to Gitea') { steps { script { withCredentials([string(credentialsId: 'GITEA_TOKEN', variable: 'GITEA_TOKEN')]) { def releaseUrl = "https://git.grigowashere.ru/api/v1/repos/username/repo/releases" def json = """{ "tag_name": "v${BUILD_NUMBER}", "target_commitish": "main", "name": "Release v${BUILD_NUMBER}", "body": "Release notes for v${BUILD_NUMBER}", "draft": false, "prerelease": false }""" sh """ curl -X POST ${releaseUrl} -H 'Authorization: token ${GITEA_TOKEN}' -d '${json}' if [ \$? -ne 0 ]; then echo 'Error creating release' exit 1 fi """ } } } } stage('Upload Artifacts to Gitea Release') { steps { script { withCredentials([string(credentialsId: 'GITEA_TOKEN', variable: 'GITEA_TOKEN')]) { def releaseUploadUrl = "https://git.grigowashere.ru/api/v1/repos/username/repo/releases/tags/v${BUILD_NUMBER}/assets" sh """ curl -X POST ${releaseUploadUrl} -H 'Authorization: token ${GITEA_TOKEN}' -F 'file=@dist/windows/test_app.exe' if [ \$? -ne 0 ]; then echo 'Error uploading artifact' exit 1 fi """ } } } } } 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 ''') } } } } } } }