Search code examples
apipowershellappveyor

API: Trying to set name of an appveyor project


I am trying to create an appveyor project using powershell and set my own name.

function Invoke-AppveyorCreateProject {
    param (
        [System.String] $appveyorProjectName,
        [System.String] $repositoryName
    )

    # step 1, create project
    $project = @{
        repositoryProvider="gitHub"
        repositoryName="esskar/$repositoryName"
        isPrivate=$true
    }
    $json = $project | ConvertTo-Json
    $project = Invoke-RestMethod -Method Post -Uri "$AppveyorApiUrl/projects" -Headers $AppveyorRestHeaders -Body $json -ContentType "application/json"

    # step 2, update project
    $project.name = $appveyorProjectName
    $json = $project | ConvertTo-Json
    $project = Invoke-RestMethod -Method Put -Uri "$AppveyorApiUrl/projects" -Headers $AppveyorRestHeaders -Body $json -ContentType "application/json"
}

# Globals
$AppveyorApiUrl = 'https://ci.appveyor.com/api'
$AppveyorApiToken = $env:AppveyorApiToken
$AppveyorRestHeaders = @{
  "Authorization" = "Bearer $AppveyorApiToken"
  "Content-type" = "application/json"
}
$AppveyorAccountName = $env:AppveyorAccountName

Invoke-AppveyorCreateProject "foo.bar" "repo1"

Step 1 works, the project is created, but when I try to change the name, i get an exception

Invoke-RestMethod : {"message":"Object reference not set to an instance of an object."}
At appveyortest.ps1:20 char:16
+ ...  $project = Invoke-RestMethod -Method Put -Uri "$AppveyorApiUrl/proje ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebExc
   eption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

when i try to set the name during creation in step 1, then name is not used, and project has the same name as without setting the name.


Solution

  • Use the following code for the Step 2:

    $settings = Invoke-RestMethod -Uri "$AppveyorApiUrl/projects/$($project.accountName)/$($project.slug)/settings" -Headers $AppveyorRestHeaders  -Method Get
    $settings.settings.name = $appveyorProjectName
    Invoke-RestMethod -Uri "$AppveyorApiUrl/projects" -Headers $AppveyorRestHeaders -Body ($settings.settings | ConvertTo-Json -Depth 10) -Method Put