start-runner.ps1 4.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. ## Retrieve instance metadata
  2. Write-Host "Retrieving TOKEN from AWS API"
  3. $token=Invoke-RestMethod -Method PUT -Uri "http://169.254.169.254/latest/api/token" -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "180"}
  4. $metadata=Invoke-RestMethod -Uri "http://169.254.169.254/latest/dynamic/instance-identity/document" -Headers @{"X-aws-ec2-metadata-token" = $token}
  5. $Region = $metadata.region
  6. Write-Host "Reteieved REGION from AWS API ($Region)"
  7. $InstanceId = $metadata.instanceId
  8. Write-Host "Reteieved InstanceId from AWS API ($InstanceId)"
  9. $tags=aws ec2 describe-tags --region "$Region" --filters "Name=resource-id,Values=$InstanceId" | ConvertFrom-Json
  10. Write-Host "Retrieved tags from AWS API"
  11. $environment=$tags.Tags.where( {$_.Key -eq 'ghr:environment'}).value
  12. Write-Host "Reteieved ghr:environment tag - ($environment)"
  13. $parameters=$(aws ssm get-parameters-by-path --path "/$environment/runner" --region "$Region" --query "Parameters[*].{Name:Name,Value:Value}") | ConvertFrom-Json
  14. Write-Host "Retrieved parameters from AWS SSM"
  15. $run_as=$parameters.where( {$_.Name -eq "/$environment/runner/run-as"}).value
  16. Write-Host "Retrieved /$environment/runner/run-as parameter - ($run_as)"
  17. $enable_cloudwatch_agent=$parameters.where( {$_.Name -eq "/$environment/runner/enable-cloudwatch"}).value
  18. Write-Host "Retrieved /$environment/runner/enable-cloudwatch parameter - ($enable_cloudwatch_agent)"
  19. $agent_mode=$parameters.where( {$_.Name -eq "/$environment/runner/agent-mode"}).value
  20. Write-Host "Retrieved /$environment/runner/agent-mode parameter - ($agent_mode)"
  21. if ($enable_cloudwatch_agent -eq "true")
  22. {
  23. Write-Host "Enabling CloudWatch Agent"
  24. & 'C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1' -a fetch-config -m ec2 -s -c "ssm:$environment-cloudwatch_agent_config_runner"
  25. }
  26. ## Configure the runner
  27. Write-Host "Get GH Runner config from AWS SSM"
  28. $config = $null
  29. $i = 0
  30. do {
  31. $config = (aws ssm get-parameters --names "$environment-$InstanceId" --with-decryption --region $Region --query "Parameters[*].{Name:Name,Value:Value}" | ConvertFrom-Json)[0].value
  32. Write-Host "Waiting for GH Runner config to become available in AWS SSM ($i/30)"
  33. Start-Sleep 1
  34. $i++
  35. } while (($null -eq $config) -and ($i -lt 30))
  36. Write-Host "Delete GH Runner token from AWS SSM"
  37. aws ssm delete-parameter --name "$environment-$InstanceId" --region $Region
  38. # Create or update user
  39. if (-not($run_as)) {
  40. Write-Host "No user specified, using default ec2-user account"
  41. $run_as="ec2-user"
  42. }
  43. Add-Type -AssemblyName "System.Web"
  44. $password = [System.Web.Security.Membership]::GeneratePassword(24, 4)
  45. $securePassword = ConvertTo-SecureString $password -AsPlainText -Force
  46. $username = $run_as
  47. if (!(Get-LocalUser -Name $username -ErrorAction Ignore)) {
  48. New-LocalUser -Name $username -Password $securePassword
  49. Write-Host "Created new user ($username)"
  50. }
  51. else {
  52. Set-LocalUser -Name $username -Password $securePassword
  53. Write-Host "Changed password for user ($username)"
  54. }
  55. # Add user to groups
  56. foreach ($group in @("Administrators", "docker-users")) {
  57. if ((Get-LocalGroup -Name "$group" -ErrorAction Ignore) -and
  58. !(Get-LocalGroupMember -Group "$group" -Member $username -ErrorAction Ignore)) {
  59. Add-LocalGroupMember -Group "$group" -Member $username
  60. Write-Host "Added $username to $group group"
  61. }
  62. }
  63. # Disable User Access Control (UAC)
  64. # TODO investigate if this is needed or if its overkill - https://github.com/philips-labs/terraform-aws-github-runner/issues/1505
  65. Set-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name ConsentPromptBehaviorAdmin -Value 0 -Force
  66. Write-Host "Disabled User Access Control (UAC)"
  67. $configCmd = ".\config.cmd --unattended --name $InstanceId --work `"_work`" $config"
  68. Write-Host "Configure GH Runner as user $run_as"
  69. Invoke-Expression $configCmd
  70. Write-Host "Starting the runner as user $run_as"
  71. Write-Host "Installing the runner as a service"
  72. $action = New-ScheduledTaskAction -WorkingDirectory "$pwd" -Execute "run.cmd"
  73. $trigger = Get-CimClass "MSFT_TaskRegistrationTrigger" -Namespace "Root/Microsoft/Windows/TaskScheduler"
  74. Register-ScheduledTask -TaskName "runnertask" -Action $action -Trigger $trigger -User $username -Password $password -RunLevel Highest -Force
  75. Write-Host "Starting the runner in persistent mode"
  76. Write-Host "Starting runner after $(((get-date) - (gcim Win32_OperatingSystem).LastBootUpTime).tostring("hh':'mm':'ss''"))"