PowerShell'den GitHub Deposu Oluşturma


PowerShell'de GitHub API ile çalışmaya devam ediyorum. Bugün yeni bir GitHub deposu oluşturmak için kullanabileceğiniz bir işlevim var. Elbette bir GitHub hesabına ve başka bir kritik bilgiye ihtiyacınız olacak, ancak bundan sonra yeni depolar oluşturmak oldukça kolaydır. Bu, üzerinde çalıştığım başka bir konu olan yeni projelerin sağlanmasını otomatikleştirmenizi kolaylaştırıyor. Ama şimdilik biraz depo oluşturalım!

İhtiyaç duyacağınız ilk bilgi GitHub kişisel erişim belirtecidir. Kaydedilmiş bir tane yoksa bir tane oluşturmanız gerekir. GitHub profil ayarlarınıza gidin ve “Kişisel erişim belirteçleri” bağlantısına tıklayın. Mevcut tokenların bir listesini görebilirsiniz ancak gerçek değeri göremezsiniz. Ancak PowerShell betiklerinizle kullanmak üzere kolayca yeni bir belirteç oluşturabilirsiniz.

“Yeni Jeton Oluştur” bağlantısını tıklayın ve şifrenizi onaylayın. Bir açıklama girin ve ardından kapsamları seçin. Bunu diğer PowerShell betikleriyle kullanabileceğiniz için tüm repo, öz ve kullanıcı kapsamlarını seçerdim. "Jeton oluştur"a tıklayın ve 40 haneli dizeyi kopyalayıp güvenli bir yere kaydedin. Bu, kimlik doğrulamanız gereken Git belirtecidir. PowerShell profilimde onu $gitToken değişkeninde sakladım. Bu jetonu korumalısınız.

Artık GitHub hesabınızla çalışmaya başlamaya hazırsınız.

İşte üzerinde çalıştığım PowerShell işlevi.

Function New-GitHubRepository {
[cmdletbinding(SupportsShouldProcess)]

Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter the new repository name")]
[ValidateNotNullorEmpty()]
[string]$Name,

[string]$Description,

[switch]$Private,
[switch]$NoWiki,
[switch]$NoIssues,
[switch]$NoDownloads,
[switch]$AutoInitialize,

#license templates found at https://github.com/github/choosealicense.com/tree/gh-pages/_licenses
[ValidateSet("MIT","apache-2.0","gpl-3.0","ms-pl","unlicense")]
[string]$LicenseTemplate,

[Alias("token")]
[ValidateNotNullorEmpty()]
[string]$UserToken = $gitToken,

#write full native response to the pipeline
[switch]$Raw
)

Write-Verbose "[BEGIN  ] Starting: $($MyInvocation.Mycommand)"
#display PSBoundparameters formatted nicely for Verbose output  
[string]$pb = ($PSBoundParameters | Format-Table -AutoSize | Out-String).TrimEnd()
Write-Verbose "[BEGIN  ] PSBoundparameters: `n$($pb.split("`n").Foreach({"$("`t"*2)$_"}) | Out-String) `n" 

#create the header
$head = @{
Authorization = 'Basic ' + $UserToken
}

#create a hashtable from properties
$hash = @{
 name = $Name
 description = $Description
 private = $Private -as [boolean]
 has_wiki = (-Not $NoWiki)
 has_issues = (-Not $NoIssues)
 has_downloads = (-Not $NoDownloads)
 auto_init = $AutoInitialize -as [boolean]
}

if ($LicenseTemplate) {
    $hash.add("license_template",$LicenseTemplate)
}

$body = $hash | ConvertTo-Json

Write-Verbose "[PROCESS] Sending json"
Write-Verbose $body

#define parameter hashtable for Invoke-RestMethod
$paramHash = @{
Uri = "https://api.github.com/user/repos" 
Method = "Post"
body = $body 
ContentType = "application/json"
Headers = $head
UseBasicParsing = $True
DisableKeepAlive = $True
}

#should process
if ($PSCmdlet.ShouldProcess("$name [$description]")) {
   $r = Invoke-RestMethod @paramHash

    if ($r.id -AND $Raw) {
        Write-Verbose "[PROCESS] Raw result"
        $r

    } elseif ($r.id) {
        write-Verbose "[PROCESS] Formatted results"

        $r | Select-Object @{Name = "Name";Expression = {$_.name}},
        @{Name = "Description";Expression = {$_.description}},
        @{Name = "Private";Expression = {$_.private}},
        @{Name = "Issues";Expression = {$_.has_issues}},
        @{Name = "Wiki";Expression = {$_.has_wiki}},
        @{Name = "URL";Expression = {$_.html_url}},
        @{Name = "Clone";Expression = {$_.clone_url}}
    } else {
        
        Write-Warning "Something went wrong with this process"
    }

    if ($r.clone_url) {
      $msg = @"

To push an existing local repository to Github run these commands:
-> git remote add origin $($r.clone_url)"
-> git push -u origin master

"@
    Write-Host $msg -ForegroundColor Green

    }
}

Write-Verbose "[END    ] Ending: $($MyInvocation.Mycommand)"

}

Birkaç noktaya değineyim.

Gerçekten gerekli olan tek parametreler Ad ve GitHub belirtecidir. İkincisinin varsayılan değerini profilimdeki değişkene ayarladım, bu nedenle parametre Zorunlu olarak işaretlenmiyor. Ayrıca bir depo Açıklaması da belirleyebilirsiniz.

Yeni bir depo oluşturduğunuzda varsayılan olarak herkese açıktır. Ancak ücretli bir hesabınız varsa, bunu Özel yapmayı seçebilirsiniz. Tüm depolarda ayrıca bir wiki, sorunlar ve indirme seçeneği bulunur, ancak bunların hiçbiri olmadan ilgili parametrelerle bir depo oluşturabilirsiniz.

Yerel olarak bir projeye başladıktan sonra repo oluşturma eğilimindeyim, bu nedenle lisans ve README.md gibi şeyleri kendi başıma hallediyorum. Benim fonksiyonumla yeni bir repo oluşturduğunuzda, bir lisans (yapacağınızı düşündüğüm daha yaygın seçimler için bir doğrulama seti ekledim) ve Otomatik Başlatma parametresi eklemeyi seçebilirsiniz. Bu, varsayılan bir README.md dosyası oluşturacaktır.

Tüm bunların içindeki sihir, json olarak biçimlendirilmiş bir yönergeler bütünü oluşturmaktır.

#create a hashtable from properties
$hash = @{
 name = $Name
 description = $Description
 private = $Private -as [boolean]
 has_wiki = (-Not $NoWiki)
 has_issues = (-Not $NoIssues)
 has_downloads = (-Not $NoDownloads)
 auto_init = $AutoInitialize -as [boolean]
}

if ($LicenseTemplate) {
    $hash.add("license_template",$LicenseTemplate)
}

$body = $hash | ConvertTo-Json

Bu beden, Invoke-Restmethod'a değineceğim parametrelerin bir parçası haline geliyor.

$paramHash = @{
Uri = "https://api.github.com/user/repos" 
Method = "Post"
body = $body 
ContentType = "application/json"
Headers = $head
UseBasicParsing = $True
DisableKeepAlive = $True
}

Başlık, kullanıcı belirtecinizden oluşturulur.

$head = @{
Authorization = 'Basic ' + $UserToken
}

GitHub'ın sonucu bir json belgesidir ancak Invoke-RestMethod bunu otomatik olarak bir nesneye dönüştürür. Varsayılan olarak bu verilerden özel bir çıktı nesnesi oluşturuyorum.

$r | Select-Object @{Name = "Name";Expression = {$_.name}},
        @{Name = "Description";Expression = {$_.description}},
        @{Name = "Private";Expression = {$_.private}},
        @{Name = "Issues";Expression = {$_.has_issues}},
        @{Name = "Wiki";Expression = {$_.has_wiki}},
        @{Name = "URL";Expression = {$_.html_url}},
        @{Name = "Clone";Expression = {$_.clone_url}}

Veya her şeyi görmek için -Raw'u kullanabilirsiniz.

İşlevin son kısmı, boş bir depo oluşturduğunuzda GitHub'da alacağınız bir şeydir ve bu, yerel bir havuzun nasıl yapılandırılacağına dair bir ipucudur.

if ($r.clone_url) {
      $msg = @"

To push an existing local repository to Github run these commands:
-> git remote add origin $($r.clone_url)"
-> git push -u origin master

"@
    Write-Host $msg -ForegroundColor Green

    }

Sözdizimini asla hatırlayamıyorum bu yüzden bu benim için hoş bir dokunuş.

İşlevim Write-Verbose'u kullanıyor ve -Whatif'i destekliyor.

Şimdi gerçekten ve -Verbose'u bırakacağım.

Tamamlamak! Git komutlarını sonunda yeşil renkte görebilirsiniz. İşte GitHub'daki repo.

İçinde henüz hiçbir şey yok ve kısa süre içinde sileceğim ama işe yarıyor.

Bu işlevin eninde sonunda daha büyük bir araç setinin parçası haline geleceğini umuyoruz. Ama şimdi kullanmaktan çekinmeyin ve sizin için nasıl çalıştığını bana bildirin.

Eğlenin ve harika bir hafta sonu geçirin.

İlgili makaleler