Document how to add Windows self-hosted runners (#1608)
* adding windows docs * adding windows docs * Editing the explanations * Update README.md * Update README.md Co-authored-by: Yusuke Kuoka <ykuoka@gmail.com>
This commit is contained in:
		
							parent
							
								
									244e0dd987
								
							
						
					
					
						commit
						e58f82bfce
					
				
							
								
								
									
										113
									
								
								README.md
								
								
								
								
							
							
						
						
									
										113
									
								
								README.md
								
								
								
								
							|  | @ -41,6 +41,7 @@ ToC: | ||||||
|   - [Using IRSA (IAM Roles for Service Accounts) in EKS](#using-irsa-iam-roles-for-service-accounts-in-eks) |   - [Using IRSA (IAM Roles for Service Accounts) in EKS](#using-irsa-iam-roles-for-service-accounts-in-eks) | ||||||
|   - [Software Installed in the Runner Image](#software-installed-in-the-runner-image) |   - [Software Installed in the Runner Image](#software-installed-in-the-runner-image) | ||||||
|   - [Using without cert-manager](#using-without-cert-manager) |   - [Using without cert-manager](#using-without-cert-manager) | ||||||
|  |   - [Windows Runners](#setting-up-windows-runners) | ||||||
|   - [Multitenancy](#multitenancy) |   - [Multitenancy](#multitenancy) | ||||||
| - [Troubleshooting](#troubleshooting) | - [Troubleshooting](#troubleshooting) | ||||||
| - [Contributing](#contributing) | - [Contributing](#contributing) | ||||||
|  | @ -1764,6 +1765,118 @@ $ helm --upgrade install actions-runner-controller/actions-runner-controller \ | ||||||
|   admissionWebHooks.caBundle=${CA_BUNDLE} |   admissionWebHooks.caBundle=${CA_BUNDLE} | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
|  | ### Setting up Windows Runners | ||||||
|  | 
 | ||||||
|  | The main two steps in enabling Windows self-hosted runners are: | ||||||
|  | 
 | ||||||
|  | - Using `nodeSelector`'s property to filter the `cert-manger` and `actions-runner-controller` pods | ||||||
|  | - Deploying a RunnerDeployment using a Windows-based image | ||||||
|  | 
 | ||||||
|  | For the first step, you need to set the `nodeSelector.kubernetes.io/os` property in both the `cert-manager` and the `actions-runner-controller` deployments to `linux` so that the pods for these two deployments are only scheduled in Linux nodes. You can do this as follows: | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | nodeSelector: | ||||||
|  |   kubernetes.io/os: linux | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | `cert-manager` has 4 different application within it the main application, the `webhook`, the `cainjector` and the `startupapicheck`. In the parameters or values file you use for the deployment you need to add the `nodeSelector` property four times, one for each application. | ||||||
|  | 
 | ||||||
|  | For the `actions-runner-controller` you only have to use the `nodeSelector` only for the main deployment, so it only has to be set once. | ||||||
|  | 
 | ||||||
|  | Once this is set up, you will need to deploy two different `RunnerDeployment`'s, one for Windows and one for Linux. | ||||||
|  | The Linux deployment can use either the default image or a custom one, however, there isn't a default Windows image so for Windows deployments you will have to build your own image. | ||||||
|  | 
 | ||||||
|  | Below we share an example of the YAML used to create the deployment for each Operating System and a Dockerfile for the Windows deployment.  | ||||||
|  | 
 | ||||||
|  | <details><summary>Windows</summary> | ||||||
|  | <p> | ||||||
|  | 
 | ||||||
|  | #### RunnerDeployment | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | --- | ||||||
|  | apiVersion: actions.summerwind.dev/v1alpha1 | ||||||
|  | kind: RunnerDeployment | ||||||
|  | metadata: | ||||||
|  |   name: k8s-runners-windows | ||||||
|  |   namespace: actions-runner-system | ||||||
|  | spec: | ||||||
|  |   template: | ||||||
|  |     spec: | ||||||
|  |       image: <repo>/<image>:<windows-tag> | ||||||
|  |       dockerdWithinRunnerContainer: true | ||||||
|  |       nodeSelector: | ||||||
|  |         kubernetes.io/os: windows | ||||||
|  |         kubernetes.io/arch: amd64 | ||||||
|  |       repository: <owner>/<repo> | ||||||
|  |       labels: | ||||||
|  |         - windows | ||||||
|  |         - X64 | ||||||
|  |         - devops-managed | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | #### Dockerfile | ||||||
|  | 
 | ||||||
|  | > Note that you'd need to patch the below Dockerfile if you need a graceful termination. | ||||||
|  | > See https://github.com/actions-runner-controller/actions-runner-controller/pull/1608/files#r917319574 for more information. | ||||||
|  | 
 | ||||||
|  | ```Dockerfile | ||||||
|  | FROM mcr.microsoft.com/windows/servercore:ltsc2019 | ||||||
|  | 
 | ||||||
|  | WORKDIR /actions-runner | ||||||
|  | 
 | ||||||
|  | SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';$ProgressPreference='silentlyContinue';"] | ||||||
|  | 
 | ||||||
|  | RUN Invoke-WebRequest -Uri https://github.com/actions/runner/releases/download/v2.292.0/actions-runner-win-x64-2.292.0.zip -OutFile actions-runner-win-x64-2.292.0.zip | ||||||
|  | 
 | ||||||
|  | RUN if((Get-FileHash -Path actions-runner-win-x64-2.292.0.zip -Algorithm SHA256).Hash.ToUpper() -ne 'f27dae1413263e43f7416d719e0baf338c8d80a366fed849ecf5fffcec1e941f'.ToUpper()){ throw 'Computed checksum did not match' } | ||||||
|  | 
 | ||||||
|  | RUN Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory('actions-runner-win-x64-2.292.0.zip', $PWD) | ||||||
|  | 
 | ||||||
|  | RUN Invoke-WebRequest -Uri 'https://aka.ms/install-powershell.ps1' -OutFile install-powershell.ps1; ./install-powershell.ps1 -AddToPath | ||||||
|  | 
 | ||||||
|  | RUN powershell Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) | ||||||
|  | 
 | ||||||
|  | RUN powershell choco install git.install --params "'/GitAndUnixToolsOnPath'" -y | ||||||
|  | 
 | ||||||
|  | RUN powershell choco feature enable -n allowGlobalConfirmation | ||||||
|  | 
 | ||||||
|  | CMD [ "pwsh", "-c", "./config.cmd --name $env:RUNNER_NAME --url https://github.com/$env:RUNNER_REPO --token $env:RUNNER_TOKEN --labels $env:RUNNER_LABELS --unattended --replace --ephemeral; ./run.cmd"] | ||||||
|  | ``` | ||||||
|  | </p> | ||||||
|  | </details> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | <details><summary>Linux</summary> | ||||||
|  | <p> | ||||||
|  | 
 | ||||||
|  | #### RunnerDeployment | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | --- | ||||||
|  | apiVersion: actions.summerwind.dev/v1alpha1 | ||||||
|  | kind: RunnerDeployment | ||||||
|  | metadata: | ||||||
|  |   name: k8s-runners-linux | ||||||
|  |   namespace: actions-runner-system | ||||||
|  | spec: | ||||||
|  |   template: | ||||||
|  |     spec: | ||||||
|  |       image: <repo>/<image>:<linux-tag> | ||||||
|  |       nodeSelector: | ||||||
|  |         kubernetes.io/os: linux | ||||||
|  |         kubernetes.io/arch: amd64 | ||||||
|  |       repository: <owner>:<repo> | ||||||
|  |       labels: | ||||||
|  |         - linux | ||||||
|  |         - X64 | ||||||
|  |         - devops-managed | ||||||
|  | ``` | ||||||
|  | </p> | ||||||
|  | </details> | ||||||
|  | 
 | ||||||
|  | After both `RunnerDeployment`'s are up and running, you can now proceed to deploy the `HorizontalRunnerAutoscaler` for each deployment. | ||||||
|  | 
 | ||||||
| ### Multitenancy | ### Multitenancy | ||||||
| 
 | 
 | ||||||
| > This feature requires controller version => [v0.26.0](https://github.com/actions-runner-controller/actions-runner-controller/releases/tag/v0.26.0) | > This feature requires controller version => [v0.26.0](https://github.com/actions-runner-controller/actions-runner-controller/releases/tag/v0.26.0) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue