scripts/Invoke-RepoSyncGenerateMatrix.ps1 (126 lines of code) (raw):
# Requires Environment Variables for GitHub Actions
# GH_TOKEN
# Must run gh auth login -h "GitHub.com" before running this script
param(
[array]$repoFilter = @(),
[array]$validProviders = @("azure", "azurerm", "azapi"),
[array]$reposToSkip = @(
"bicep-registry-modules",
"terraform-azure-modules",
"ALZ-PowerShell-Module",
"Azure-Verified-Modules",
"terraform-azurerm-avm-template",
"Azure-Verified-Modules-Grept",
"avmtester",
"tflint-ruleset-avm",
"avm-gh-app",
"avm-container-images-cicd-agents-and-runners",
"Azure-Verified-Modules-Workflows"
)
)
Write-Host "Generating matrix for AVM repositories"
$env:ARM_USE_AZUREAD = "true"
$repos = @()
Write-Host "Getting repositories from app installation"
# Get the list of installed repositories for the GitHub App
$itemsPerPage = 100
$page = 1
$incompleteResults = $true
$installedRepositories = @()
while($incompleteResults) {
$response = ConvertFrom-Json $(gh api "/installation/repositories?per_page=$itemsPerPage&page=$page")
$installedRepositories += $response.repositories
$incompleteResults = $page * $itemsPerPage -lt $response.total_count
$page++
}
$warnings = @()
foreach ($installedRepository in $installedRepositories | Sort-Object -Property name) {
if($reposToSkip -contains $installedRepository.name) {
Write-Host "Skipping $($installedRepository.name) as it is in the skip list..."
continue
}
if($installedRepository.archived) {
$warning = @{
repoId = $installedRepository.name
message = "Skipping $($installedRepository.name) as it is archived..."
}
Write-Warning $warning.message
$warnings += $warning
continue
}
if(!$installedRepository.name.StartsWith("terraform-")) {
$warning = @{
repoId = $installedRepository.name
message = "Skipping $($installedRepository.name) as it does not start with 'terraform-'..."
}
Write-Warning $warning.message
$warnings += $warning
continue
}
$skipRepository = $true
$moduleName = ""
foreach($validProvider in $validProviders) {
$validPrefix = "terraform-$validProvider-"
if($installedRepository.name.StartsWith($validPrefix)) {
$moduleName = $installedRepository.name.Replace($validPrefix, "")
$skipRepository = $false
}
}
if($skipRepository) {
$warning = @{
repoId = $installedRepository.name
message = "Skipping $($installedRepository.name) as it does not start with a valid provider prefix..."
}
Write-Warning $warning.message
$warnings += $warning
continue
}
if(!$moduleName.StartsWith("avm-")) {
$warning = @{
repoId = $installedRepository.name
message = "Skipping $($installedRepository.name) as it does not start with 'avm-'..."
}
Write-Warning $warning.message
$warnings += $warning
continue
}
$moduleType = $moduleName.Split("-")[1]
if($moduleType -eq "res") {
$moduleType = "resource"
} elseif($moduleType -eq "ptn") {
$moduleType = "pattern"
} elseif($moduleType -eq "utl") {
$moduleType = "utility"
} else {
$warning = @{
repoId = $installedRepository.name
message = "Skipping $($installedRepository.name) as it does not have a valid module type segment..."
}
Write-Warning $warning.message
$warnings += $warning
continue
}
$protectedRepos = Import-Csv "./protected_repos/ProtectedRepos.csv"
$repos += @{
repoId = $moduleName
repoUrl = $installedRepository.html_url
repoType = "avm"
repoSubType = $moduleType
repoOwnerTeam = "@Azure/$($moduleName)-module-owners-tf"
repoContributorTeam = "@Azure/$($moduleName)-module-contributors-tf"
repoIsProtected = $protectedRepos.ModuleName -contains $moduleName
}
}
if($warnings.Count -eq 0) {
Write-Host "No issues found"
} else {
Write-Host "Issues found for"
$warningsJson = ConvertTo-Json $warnings -Depth 100
$warningsJson | Out-File "warning.log.json"
}
Write-Host "Filtering repositories"
if($repoFilter.Length -gt 0) {
$repos = $repos | Where-Object { $repoFilter -contains $_.repoId }
}
Write-Host "Found $($repos.Count) repositories"
return $repos | Sort-Object -Property repoId