commit 00adbd3da47182588aef1e6d0e83fc8584fd2e62 Author: Nikolay Buslaev Date: Wed Mar 11 19:48:23 2026 +0100 init diff --git a/Create-PAT.ps1 b/Create-PAT.ps1 new file mode 100644 index 0000000..967d8dd --- /dev/null +++ b/Create-PAT.ps1 @@ -0,0 +1,19 @@ +$HostUrl = "https://code.wynenterprise.io" +$UserName = "KodoBot" +$Password = "" +$TokenName = "ci-token" + +$pair = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("${UserName}:${Password}")) + +$Headers = @{ + Authorization = "Basic $pair" + "Content-Type" = "application/json" +} + +$Body = @{ + name = $TokenName + scopes = @( "write:issue", "write:repository", "read:user" ) +} | ConvertTo-Json + +$response = Invoke-RestMethod -Method Post -Uri "$HostUrl/api/v1/users/$UserName/tokens" -Headers $Headers -Body $Body +$response.sha1 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bb52cb5 --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +# Создание технического аккаунта для Code Review + +## 1. Создание локального пользователя в Gitea + +Создайте локального пользователя в Gitea. + +Рекомендуемое имя пользователя: `KodoBot` + +## 2. Сохранение временного пароля + +При создании пользователя задайте временный пароль и сохраните его в защищённом месте. + +## 3. Генерация PAT с минимальными правами + +Сгенерируйте Personal Access Token (PAT) с минимально необходимыми правами, используя PowerShell-скрипт. + +(Create-PAT.ps1) + +Сохраните возвращённое значение PAT в защищённом месте. + +## 4. Смена пароля созданного пользователя + +После успешного создания PAT смените пароль у созданного пользователя для безопасности. + +## 5. Настройка секретов и переменных организации + +На уровне организации определите секреты и переменные, необходимые для функционирования Code Reviewer. + +### Secrets + +- `CC_GITEATOKEN` — PAT пользователя `reviewer` +- `CC_API_KEY` — ключ авторизации для LLM OpenAI API (`sk-***`) + +### Variables + +- `CC_BASE_URL` — URL LiteLLM Proxy. Значение по умолчанию: `http://llm.developertools.com` +- `CC_MODEL` — модель, используемая по умолчанию: `/int/revewer/default` + +и пропишите их на уровне организации с помощью скрита (Set-GiteaOrgActionItem.ps1) +для использования скрипта нужно определить переменную окружения $Env:AdminGiteaManagePAT +Пример запуска + +Pat=$Env:AdminGiteaManage +.\Set-GiteaOrgActionItem.ps1 -Org *wyn-core* -VarName *"CC_BASE_URL"* -Value *"https://llm.developertools.pro/"* +.\Set-GiteaOrgActionItem.ps1 -Org *wyn-core* -VarName *"CC_MODEL"* -Value *"/int/reviewer/default"* +.\Set-GiteaOrgActionItem.ps1 -Org *wyn-core* -VarName *"CC_GITEATOKEN"* -Password *"f79....c1c"* +.\Set-GiteaOrgActionItem.ps1 -Org *wyn-core* -VarName *"CC_API_KEY"* -Password *"sk-F..6-k..g"* diff --git a/Set-GiteaOrgActionItem.ps1 b/Set-GiteaOrgActionItem.ps1 new file mode 100644 index 0000000..62b8336 --- /dev/null +++ b/Set-GiteaOrgActionItem.ps1 @@ -0,0 +1,38 @@ +param( + [ValidateNotNullOrEmpty()] [string]$BaseUrl = "https://code.wynenterprise.io/", + [ValidateNotNullOrEmpty()] [string]$Token = $Env:AdminGiteaManagePAT, + [ValidateNotNullOrEmpty()] [string]$Org = "devops", + + [Parameter(Mandatory=$true)] [string]$VarName, + [string]$Value, + [string]$Password +) + +if ([string]::IsNullOrWhiteSpace($Value) -and [string]::IsNullOrWhiteSpace($Password)) { + throw "Specify either -Value or -Password" +} + +if (-not [string]::IsNullOrWhiteSpace($Value) -and -not [string]::IsNullOrWhiteSpace($Password)) { + throw "Specify only one of -Value or -Password" +} + +$BaseUrl = $BaseUrl.TrimEnd('/') + +$Headers = @{ + Authorization = "token $Token" + Accept = "application/json" + "Content-Type" = "application/json" +} + +if (-not [string]::IsNullOrWhiteSpace($Password)) { $Uri = "$BaseUrl/api/v1/orgs/$Org/actions/secrets"; $Body = (@{data = $Password} | ConvertTo-Json -Compress); $Method="Put"} +else { $Uri = "$BaseUrl/api/v1/orgs/$Org/actions/variables"; $Body = (@{name = $VarName; value = $Value} | ConvertTo-Json -Compress); $Method="Post"} + +$vars = Invoke-RestMethod -Method Get -Uri $Uri -Headers $Headers -ErrorAction Stop +$FoundVar = $vars | Where-Object { $_.name -eq $VarName } + +if (-not [bool]$FoundVar) { + Invoke-RestMethod -Method $Method -Uri "$Uri/$VarName" -Headers $Headers -Body $Body +} else { + Invoke-RestMethod -Method Put -Uri "$Uri/$VarName" -Headers $Headers -Body $Body +} +