Update labeled PR CI checks (#12344)

This commit is contained in:
Shamil Mubarakshin
2025-07-15 10:33:54 +02:00
committed by GitHub
parent c97170d762
commit 372fde29d0
3 changed files with 238 additions and 22 deletions

97
helpers/GitHubApi.psm1 Normal file
View File

@@ -0,0 +1,97 @@
class GithubApi
{
[string] $Repository
[object] hidden $AuthHeader
GithubApi(
[string] $Repository,
[string] $AccessToken
) {
$this.Repository = $Repository
$this.AuthHeader = $this.BuildAuth($AccessToken)
}
[object] hidden BuildAuth([string]$AccessToken) {
if ([string]::IsNullOrEmpty($AccessToken)) {
return $null
}
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("'':${AccessToken}"))
return @{
Authorization = "Basic ${base64AuthInfo}"
}
}
[string] hidden BuildBaseUrl([string]$Repository, [string]$ApiPrefix) {
return "https://$ApiPrefix.github.com/repos/$Repository"
}
[object] GetWorkflowRuns([string]$WorkflowId) {
$url = "actions/workflows/$WorkflowId/runs"
$response = $this.InvokeRestMethod($url, 'GET', $null, $null)
return $response
}
[object] GetWorkflowRun([string]$WorkflowRunId) {
$url = "actions/runs/$WorkflowRunId"
$response = $this.InvokeRestMethod($url, 'GET', $null, $null)
return $response
}
[object] DispatchWorkflow([string]$EventType, [object]$EventPayload) {
$url = "dispatches"
$body = @{
"event_type" = $EventType
"client_payload" = $EventPayload
} | ConvertTo-Json
$response = $this.InvokeRestMethod($url, 'POST', $null, $body)
return $response
}
[object] CancelWorkflowRun([string]$workflowRunId) {
$url = "actions/runs/$workflowRunId/cancel"
$response = $this.InvokeRestMethod($url, 'POST', $null, $null)
return $response
}
[string] hidden BuildUrl([string]$url, [string]$RequestParams, [string]$ApiPrefix) {
$baseUrl = $this.BuildBaseUrl($this.Repository, $ApiPrefix)
if ([string]::IsNullOrEmpty($RequestParams)) {
return "$($baseUrl)/$($url)"
} else {
return "$($baseUrl)/$($url)?$($requestParams)"
}
}
[object] hidden InvokeRestMethod(
[string] $url,
[string] $Method,
[string] $RequestParams,
[string] $body
) {
$requestUrl = $this.BuildUrl($url, $RequestParams, "api")
$params = @{
Method = $Method
ContentType = "application/json"
Uri = $requestUrl
Headers = @{}
}
if ($this.AuthHeader) {
$params.Headers += $this.AuthHeader
}
if (![string]::IsNullOrEmpty($body)) {
$params.Body = $body
}
$response = Invoke-RestMethod @params
return $response
}
}
function Get-GithubApi {
param (
[string] $Repository,
[string] $AccessToken
)
return [GithubApi]::New($Repository, $AccessToken)
}

View File

@@ -0,0 +1,47 @@
Param (
[Parameter(Mandatory)]
[string] $WorkflowRunId,
[Parameter(Mandatory)]
[string] $Repository,
[Parameter(Mandatory)]
[string] $AccessToken,
[int] $RetryIntervalSeconds = 300,
[int] $MaxRetryCount = 0
)
Import-Module (Join-Path $PSScriptRoot "GitHubApi.psm1")
function Wait-ForWorkflowCompletion($WorkflowRunId, $RetryIntervalSeconds) {
do {
Start-Sleep -Seconds $RetryIntervalSeconds
$workflowRun = $gitHubApi.GetWorkflowRun($WorkflowRunId)
} until ($workflowRun.status -eq "completed")
return $workflowRun
}
$gitHubApi = Get-GithubApi -Repository $Repository -AccessToken $AccessToken
$attempt = 1
do {
$finishedWorkflowRun = Wait-ForWorkflowCompletion -WorkflowRunId $WorkflowRunId -RetryIntervalSeconds $RetryIntervalSeconds
Write-Host "Workflow run finished with result: $($finishedWorkflowRun.conclusion)"
if ($finishedWorkflowRun.conclusion -in ("success", "cancelled", "timed_out")) {
break
} elseif ($finishedWorkflowRun.conclusion -eq "failure") {
if ($attempt -le $MaxRetryCount) {
Write-Host "Workflow run will be restarted. Attempt $attempt of $MaxRetryCount"
$gitHubApi.ReRunFailedJobs($WorkflowRunId)
$attempt += 1
} else {
break
}
}
} while ($true)
Write-Host "Last result: $($finishedWorkflowRun.conclusion)."
"CI_WORKFLOW_RUN_RESULT=$($finishedWorkflowRun.conclusion)" | Out-File -Append -FilePath $env:GITHUB_ENV
if ($finishedWorkflowRun.conclusion -in ("failure", "cancelled", "timed_out")) {
exit 1
}