Continuing my search for doing automation in Powershell with as few dependencies as possible I turned to committing code to Github via the API. I found various posts that outlined the basic process but not very good examples of getting it done, certainly none in Powershell. So I extended the Powershell module I had already been working on, UMN-GitHub, to add support. The short version is, just run the function Update-GitHubRepo.
The reference for master is ”refs/heads/master” however I would recommend committing to a test branch at a minimum and doing a pull request after that. Github has plenty of content on best practices around all that and is outside the scope of this post. (use Get-GitHubRepoRef to get a list of refs, choose the one you want)
Lets dig in a bit to what the function actually does.
Run $headers = New-GitHubHeader [token or credential switch] first to get the header you will need.
# Get reference to head of ref and record Sha $reference = Get-GitHubRepoRef -headers $headers -Repo $Repo -Org $Org -server $server -ref $ref $sha = $reference.object.sha # get commit for that ref and store Sha $commit = Get-GitHubCommit -headers $headers -Repo $Repo -Org $Org -server $server -sha $sha $treeSha = $commit.tree.sha # Creat Blob $blob = New-GitHubBlob -headers $headers -Repo $Repo -Org $Org -server $server -filePath $filePath # create new Tree $tree = New-GitHubTree -headers $headers -Repo $Repo -Org $Org -server $server -path $path -blobSha $blob.sha -baseTree $treeSha -mode 100644 -type 'blob' # create new commit $newCommit = New-GitHubCommit -headers $headers -Repo $Repo -Org $Org -server $server -message $message -tree $tree.sha -parents @($sha) # update head to point at new commint Set-GitHubCommit -headers $headers -Repo $Repo -Org $Org -server $server -ref $ref -sha $newCommit.sha
One thing to note, if you open up New-GitHubBlob you’ll notice I converted the file contents to base64. Since the contents need to be sent as text via json data …. there wasn’t a good way to define a boundary and say “this is the file contents” without it blowing up. Its not like you can attach a file. So converting it to base64 solved a lot of problems.
This first version of New-GitHubTree is not very advanced and only takes in one file. Future version may take in multiple version.