Teamcity 2020.1 – API – 403 error

Если после обновления Teamcity до версии 2020.1 ваши внешние скрипты, приложения получают 403 ошибку, то это связано с обновлением. Jetbrains решили улучшить безопасность.

Временно решить проблему можно добавлением teamcity.csrf.paranoid=false в internal properties. Обратите внимание, что TeamCity рекомендует использовать токены. Отключение “параноидального режима” как постоянное решение неприемлимо.

Переходим на страницу http://YOUR_SERVER/admin/admin.html?item=diagnostics&tab=properties. Нажимаем Edit internal properties и добавляем teamcity.csrf.paranoid=false.

Далее перезапускаем TeamCity Service. Кнопка рестарта через UI доступна на странице http://YOUR_SERVER/admin/admin.html?item=diagnostics

Оставляю ссылку на полный update notes. А далее объяснение почему так произошло. Переводить лень, кто не владеет английским, – учите английский.

Limitation of CORS support for writing operations

TeamCity improves the security of REST API integration mechanisms by introducing CSRF tokens. This change will not affect the behavior of custom integration scripts unless they rely on Cross-Origin Resource Sharing (CORS) in writing operations and the rest.cors.origins internal property is enabled in TeamCity (it is disabled by default).

Previously, CSRF protection was presented in TeamCity with the verification of Origin/Referer headers of HTTP requests. To improve TeamCity CSRF protection, this method has been disabled in favor of a more secure one – CSRF tokens. Since this release, TeamCity stops supporting the CORS mechanism for POST/PUT/DELETE REST API requests. Cross-origin GET requests’ headers are processed as before and still require CORS configuration.

If necessary, you can enforce verification of Origin/Referer headers for writing CORS operations by setting the teamcity.csrf.paranoid=false internal property. Note that this is a transitory and less secure solution: we strongly recommend refactoring your existing requests so they comply with the new security policy and provide a token within a CSRF header or parameter. A CSRF token can be obtained via the GET https://your-server/authenticationTest.html?csrf request and provided via the X-TC-CSRF-Token HTTP header to the write CORS requests.

Screen resolution in selenium tests in teamcity

Many developers and testers try to change screen resolution in teamcity service. Default screen resolution is 800×600, but its so small. As one of solution is to start teamcity agent like a simple application. But this solution is bad. Because you need to use one license on Windows Server and start teamcity agent after Windows server finished to boot.

I found a solution which allows you without hacks.

  1. Open services.msc. Open properties in teamcity agent service and check on checkbox Allow service to unteract with desktop.
  2. Open registry and change this key HKLM\SYSTEM\CurrentControlSet\Control\Windows\NoInteractiveServices to 0.
  3. Change Interactive Service Detection start mode to auto and start it.
    sc config UI0Detect start= auto
    sc start UI0Detect
  4. Connect to server using RDP.
  5. Enter this text command in commandline rundll32 winsta.dll,WinStationSwitchToServicesSession. RDP session will broken but it’s ok.

Thats all. When you will run a new end2end tests you see that screen resolution will increase.

TeamCity и MSSQL DB Project без установки Visual Studio

Возникла необходимость на build сервере с Teamcity собирать DBProject. Если у вас нет желания устанавливать Visual Studio и SSDT Tools для сборки, то ниже будет решение. Данное решение позволит установить все необходимое для сборки на все агенты.

Итак, сначала просто скачайте через nuget последнюю версию тулзов. Сделать это можно даже не локальном компьютере, не обязательно это делать на build сервере.

nuget.exe install Microsoft.data.tools.msbuild -ExcludeVersion

Следущим шагом запакуем скачанный каталог Microsoft.data.tools.msbuild в zip архив и раскидаем по агентам Teamcity. Для этого в панели управления Teamcity переходим в Administration -> Tools и под Zip Archive жмем Install. Выбираем наш архив и дождемся заливки на все нужные агенты.


Теперь подключаемся к серверу по RDP (ну или через консоль) и добавим 2 параметра в переменные System Variables:

  • SQLDBExtensionsRefPath
  • SSDTPath

Оба значения выставить в C:\BuildAgent\tools\Microsoft.Data.Tools.Msbuild\Microsoft.Data.Tools.Msbuild\lib\net46. Естественно, если у вас агенты установлены по другому пути, то нужно выставить правильный путь.

После этого нужно перезапустить агентов, чтобы они подтянули новые значения. Вообщем на этом настройка закончена.

 

 

Запускаем билд с параметром в TeamCity используя API

В данной заметке приведу пример powershell скрипта, которым меняю настройки проекта используя API Teamcity. К сожалению у TeamCity нет нативного “интерфейса” через который это можно было было сделать. Простой пример. Предположим, у вас 2 TeamCity. Скажем, на первый это основной сервер. А на втором вы собираете всякие демо стенды. Также вы хотите что бы количество FXCOP warnings было не ниже чем на основном. Для этого последним шагом можно добавить скрипт, который дернет API и передаст нужное значение. Ниже пример на powershell, который передаст FXCOP warnings на другой сервер:

param(
    [string]$TeamcityUsername = "teamcity_api",
    [string]$TeamcityPassword = "teamcity_pass",
    [string]$TeamcityBuildID = "build_project_id",
    [string]$TeamcityBaseUrl = "https://buildserver",
    [string]$FxcopWarnings = "92"
)
function getAuthHeader($user, $pass) {
    $pair = "$($user):$($pass)"
    $bytes = [System.Text.Encoding]::ASCII.GetBytes($pair)
    $base64 = [System.Convert]::ToBase64String($bytes)
    $basicAuthValue = "Basic $base64"
    return $basicAuthValue
}

[xml]$response = Invoke-WebRequest -UseBasicParsing -Method PUT -Uri $($TeamcityBaseUrl + "/app/rest/buildTypes/id:${TeamcityBuildID}/parameters/env.fxcop.warnings") -Body $("<property name='env.fxcop.warnings' value='$FxcopWarnings'/>") -Headers @{ Authorization = $(getAuthHeader $teamcityUsername $teamcityPassword) } -ContentType "application/xml"

 

Установка второго агента TeamCity на сервер

Иногда более продуктивно установить на один сервер несколько агентов TC. Для этого:

  1. Качаем инсталлятор и запускаем установку. В процессе устновки нужно изменить путь(c:\buildagent2\) и снять галку с поля “установить сервис”. В окне настройки поменять ownPort на другой.
  2. Редактируем файл c:\buildagent2\launcher\conf\wrapper.conf. Скроллим вниз и меняем имя сервиса, описание и тд.
  3. Переходим в каталог c:\buildagent2\launcher и выполняем в консоли команду ..\bin\service.install.bat от администратора.
  4. Запускаем второго агента
  5. Профит