- Обзор
- Настройка среды
- Подготовьте сценарии PowerShell, используемые при создании образа
- Cleanup-Runners.ps1
- Install-Choco.ps1
- start.ps1
- Подготовка dockerfile для сборки образа (Windows)
- dockerfile
- Сборка образа Docker — Docker Desktop (Windows)
- Запуск образа Docker — Docker Desktop (Windows)
- Сборка образа Docker — Docker Compose (Windows)
- Запуск и масштабирование образа Docker — Docker Compose (Windows)
- Автор
- Marcel.L
Обзор
Весь код, используемый в этом руководстве, можно найти в моем проекте на GitHub: docker-github-runner-windows.
Добро пожаловать в первую часть моего цикла: Самостоятельное размещение контейнеров GitHub Runner на Azure.
В первой части этой серии мы сосредоточимся и рассмотрим, как создать образ контейнера windows с помощью docker, который по сути будет упакованным образом, который мы сможем использовать для развертывания и запуска саморазмещающихся GitHub runner в качестве контейнеров. Мы сосредоточимся на самом образе docker и на том, как мы можем создать наш образ и запустить его на локальном сервере или виртуальной машине под управлением docker for windows, а также масштабировать несколько экземпляров нашего образа с помощью docker-compose.
Вторая часть будет посвящена созданию образа Ubuntu на базе Linux, а в последующих частях мы рассмотрим, как использовать Azure для хранения и запуска контейнеров в облаке с помощью таких технологий, как Azure Container Registry (ACR), Azure Container Instances (ACI) и Azure Container Apps (ACA) для запуска и масштабирования наших саморазмещающихся бегунов GitHub, вместо использования подхода на базе ВМ с запуском docker внутри ВМ.
Настройка среды
Перед созданием и запуском образов docker нам нужно сначала настроить несколько вещей. Для своей среды я буду использовать виртуальную машину Windows 11 под управлением WSL2. Вот дополнительная информация о запуске docker на Windows Server. На нашей виртуальной машине нам понадобятся следующие вещи:
-
Установите редактор кода, например VSCode
-
Установите и включите WSL2 (более подробную информацию см. в разделе: как включить WSL2):
Откройте PowerShell от имени администратора и запустите:
wsl --install
После установки WSL запустите:
Enable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V", "Containers") -All
ПРИМЕЧАНИЕ: Вам потребуется перезагрузить систему после добавления соответствующих функций, указанных выше.
-
Загрузите и установите Docker Desktop для Windows (при этом автоматически будет установлен Docker-Compose)
-
После установки Docker Desktop For Windows необходимо переключиться на контейнеры Windows. Используйте элемент Docker в системном трее Windows:
Подготовьте сценарии PowerShell, используемые при создании образа
Теперь, когда Docker-Desktop, а также Docker-Compose установлены и настроены на использование контейнеров Windows, мы можем приступить к созданию образа docker для самостоятельного запуска на GitHub.
Откройте VSCode, вы можете клонировать репозиторий, найденный на моем проекте GitHub docker-github-runner-windows, который содержит все файлы, или просто выполнить следующие шаги. Мы подготовим несколько сценариев PowerShell, которые понадобятся в процессе создания образа docker.
Создайте папку root
под названием docker-github-runner-windows
, а затем еще одну вложенную папку под названием scripts
. Внутри папки scripts вы можете создать следующие три сценария PowerShell:
Cleanup-Runners.ps1
Поскольку мы будем запускать и масштабировать саморазмещающиеся runners с помощью docker/docker-compose динамически, используя наш образ, этот сценарий будет использоваться для удаления и снятия с регистрации любых старых/отключенных регистраций GitHub runner в нашем репозитории GitHub, когда мы будем увеличивать и уменьшать контейнеры в зависимости от наших потребностей. Этот сценарий PowerShell использует GitHub-CLI. Если вы запускаете этот сценарий локально, убедитесь, что у вас установлен GitHub-CLI.
#This script invokes GitHub-CLI (Pre-installed on container image)
Param (
[Parameter(Mandatory = $false)]
[string]$owner = $env:GH_OWNER,
[Parameter(Mandatory = $false)]
[string]$repo = $env:GH_REPOSITORY,
[Parameter(Mandatory = $false)]
[string]$pat = $env:GH_TOKEN
)
#Use --with-token to pass in a PAT token on standard input. The minimum required scopes for the token are: "repo", "read:org".
#Alternatively, gh will use the authentication token found in environment variables. See gh help environment for more info.
#To use gh in GitHub Actions, add GH_TOKEN: $ to "env". on Docker run: Docker run -e GH_TOKEN='myPatToken'
gh auth login --with-token $pat
#Cleanup#
#Look for any old/stale dockerNode- registrations to clean up
#Windows containers cannot gracefully remove registration via powershell due to issue: https://github.com/moby/moby/issues/25982#
#For this reason we can use this scrip to cleanup old offline instances/registrations
$runnerBaseName = "dockerNode-"
$runnerListJson = gh api -H "Accept: application/vnd.github.v3+json" "/repos/$owner/$repo/actions/runners"
$runnerList = (ConvertFrom-Json -InputObject $runnerListJson).runners
Foreach ($runner in $runnerList) {
try {
If (($runner.name -like "$runnerBaseName*") -and ($runner.status -eq "offline")) {
write-host "Unregsitering old stale runner: $($runner.name)"
gh api --method DELETE -H "Accept: application/vnd.github.v3+json" "/repos/$owner/$repo/actions/runners/$($runner.id)"
}
}
catch {
Write-Error $_.Exception.Message
}
}
#Remove PAT token after cleanup
$pat=$null
$env:GH_TOKEN=$null
Install-Choco.ps1
Этот сценарий будет использоваться для установки Chocolatey (менеджер пакетов Windows) в наш образ docker при сборке образа.
$securityProtocolSettingsOriginal = [System.Net.ServicePointManager]::SecurityProtocol
try {
# Set TLS 1.2 (3072), then TLS 1.1 (768), then TLS 1.0 (192), finally SSL 3.0 (48)
# Use integers because the enumeration values for TLS 1.2 and TLS 1.1 won’t
# exist in .NET 4.0, even though they are addressable if .NET 4.5+ is
# installed (.NET 4.5 is an in-place upgrade).
[System.Net.ServicePointManager]::SecurityProtocol = 3072 -bor 768 -bor 192 -bor 48
}
catch {
Write-Warning "Unable to set PowerShell to use TLS 1.2 and TLS 1.1 check .NET Framework installed. If you see underlying connection closed or trust errors, try the following: (1) upgrade to .NET Framework 4.5 (2) specify internal Chocolatey package location (set $env:chocolateyDownloadUrl prior to install or host the package internally), (3) use the Download + PowerShell method of install. See https://chocolatey.org/install for all install options."
}
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
[System.Net.ServicePointManager]::SecurityProtocol = $securityProtocolSettingsOriginal
start.ps1
Этот сценарий будет использоваться в качестве нашего 'ENTRYPOINT'
сценария и будет использоваться для загрузки нашего контейнера docker, когда мы запускаем контейнер из образа, который мы создаем. Основная цель этого скрипта — зарегистрировать новый экземпляр GitHub runner на репозитории, которую мы передаем в среду docker каждый раз, когда новый контейнер запускается или масштабируется из образа.
#This script invokes GitHub-CLI (Already installed on container image)
#To use this entrypoint script run: Docker run -e GH_TOKEN='myPatToken' -e GH_OWNER='orgName' -e GH_REPOSITORY='repoName' -d imageName
Param (
[Parameter(Mandatory = $false)]
[string]$owner = $env:GH_OWNER,
[Parameter(Mandatory = $false)]
[string]$repo = $env:GH_REPOSITORY,
[Parameter(Mandatory = $false)]
[string]$pat = $env:GH_TOKEN
)
#Use --with-token to pass in a PAT token on standard input. The minimum required scopes for the token are: "repo", "read:org".
#Alternatively, gh will use the authentication token found in environment variables. See gh help environment for more info.
#To use gh in GitHub Actions, add GH_TOKEN: $ to "env". on Docker run: Docker run -e GH_TOKEN='myPatToken'
gh auth login
#Get Runner registration Token
$jsonObj = gh api --method POST -H "Accept: application/vnd.github.v3+json" "/repos/$owner/$repo/actions/runners/registration-token"
$regToken = (ConvertFrom-Json -InputObject $jsonObj).token
$runnerBaseName = "dockerNode-"
$runnerName = $runnerBaseName + (((New-Guid).Guid).replace("-", "")).substring(0, 5)
try {
#Register new runner instance
write-host "Registering GitHub Self Hosted Runner on: $owner/$repo"
./config.cmd --unattended --url "https://github.com/$owner/$repo" --token $regToken --name $runnerName
#Remove PAT token after registering new instance
$pat=$null
$env:GH_TOKEN=$null
#Start runner listener for jobs
./run.cmd
}
catch {
Write-Error $_.Exception.Message
}
finally {
# Trap signal with finally - cleanup (When docker container is stopped remove runner registration from GitHub)
# Does not currently work due to issue: https://github.com/moby/moby/issues/25982#
# Perform manual cleanup of stale runners using Cleanup-Runners.ps1
./config.cmd remove --unattended --token $regToken
}
ПРИМЕЧАНИЕ: Этот сценарий PowerShell использует GitHub-CLI для регистрации новых агентов на указанном нами репозитории GitHub. Таким образом, мы загрузим GitHub-CLI в наш контейнер при сборке образа позже, поэтому он является частью образа контейнера.
Подготовка dockerfile для сборки образа (Windows)
Теперь, когда наши скрипты готовы, мы можем приступить к самому интересному… Сборка образа windows docker. Перейдите в корневую папку и создайте файл с именем: dockerfile
:
dockerfile
Этот dockerfile содержит инструкции по сборке нашего образа контейнера.
##### BASE IMAGE INFO ######
#Using servercore insider edition for compacted size.
#For compatibility on "your" host running docker you may need to use a specific tag.
#E.g. the host OS version must match the container OS version.
#If you want to run a container based on a newer Windows build, make sure you have an equivalent host build.
#Otherwise, you can use Hyper-V isolation to run older containers on new host builds.
#The default entrypoint is for this image is Cmd.exe. To run the image:
#docker run mcr.microsoft.com/windows/servercore/insider:10.0.{build}.{revision}
#tag reference: https://mcr.microsoft.com/en-us/product/windows/servercore/insider/tags
#Win10
#FROM mcr.microsoft.com/windows/servercore/insider:10.0.19035.1
#Win11
FROM mcr.microsoft.com/windows/servercore/insider:10.0.20348.1
#input GitHub runner version argument
ARG RUNNER_VERSION
LABEL Author="Marcel L"
LABEL Email="pwd9000@hotmail.co.uk"
LABEL GitHub="https://github.com/Pwd9000-ML"
LABEL BaseImage="servercore/insider:10.0.20348.1"
LABEL RunnerVersion=${RUNNER_VERSION}
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
#Set working directory
WORKDIR /actions-runner
#Install chocolatey
ADD scripts/Install-Choco.ps1 .
RUN .Install-Choco.ps1 -Wait;
Remove-Item .Install-Choco.ps1 -Force
#Install Git, GitHub-CLI, Azure-CLI and PowerShell Core with Chocolatey (add more tooling if needed at build)
RUN choco install -y
git
gh
powershell-core
azure-cli
#Download GitHub Runner based on RUNNER_VERSION argument (Can use: Docker build --build-arg RUNNER_VERSION=x.y.z)
RUN Invoke-WebRequest -Uri "https://github.com/actions/runner/releases/download/v$env:RUNNER_VERSION/actions-runner-win-x64-$env:RUNNER_VERSION.zip" -OutFile "actions-runner.zip";
Expand-Archive -Path ".\actions-runner.zip" -DestinationPath '.';
Remove-Item ".\actions-runner.zip" -Force
#Add GitHub runner configuration startup script
ADD scripts/start.ps1 .
ADD scripts/Cleanup-Runners.ps1 .
ENTRYPOINT ["pwsh.exe", ".\start.ps1"]
Давайте рассмотрим подробнее и посмотрим, что на самом деле будет делать этот файл сборки docker, шаг за шагом:
#Win11
FROM mcr.microsoft.com/windows/servercore/insider:10.0.20348.1
Инструкция 'FROM'
указывает нашей сборке docker получить и использовать базовый образ ОС windows. Поскольку базовые образы windows могут быть довольно большими, мы используем servercore insider edition, поскольку его размер компактен и оптимизирован.
Для совместимости на «своем» хосте/VM с запущенным docker вам может понадобиться использовать другой тег, mcr.microsoft.com/windows/servercore/insider:10.0.{build}.{revision}
.
Версия ОС хоста должна быть выше, чем версия ОС базового образа. Вы также можете использовать изоляцию Hyper-V для запуска старых контейнеров на новых сборках хоста.
Поскольку docker работает на моем хосте Windows 11 версии сборки: 10.0.22000.0. Я использую версию ОС контейнера: mcr.microsoft.com/windows/servercore/insider:10.0.20348.1.
Просто убедитесь, что версия сборки хоста, на котором запущен docker, выше версии сборки базового образа, которую вы используете в dockerfile при сборке образа. Вы можете использовать следующую ссылку на инсайдерский тег Servercore: https://mcr.microsoft.com/en-us/product/windows/servercore/insider/tags.
ПРИМЕЧАНИЕ: Чтобы проверить версию сборки ОС хоста, можно выполнить следующую команду powershell: [System.Environment]::OSVersion.Version
.
#input GitHub runner version argument
ARG RUNNER_VERSION
LABEL Author="Marcel L"
LABEL Email="pwd9000@hotmail.co.uk"
LABEL GitHub="https://github.com/Pwd9000-ML"
LABEL BaseImage="servercore/insider:10.0.20348.1"
LABEL RunnerVersion=${RUNNER_VERSION}
Далее мы определим входной аргумент, используя 'ARG'
. Это нужно для того, чтобы мы могли указать команде docker build загрузить определенную версию агента GitHub runner в образ при сборке образа. Поскольку мы используем контейнер windows, 'ARG'
создаст системную переменную $env:RUNNER_VERSION, которая будет доступна PowerShell внутри контейнера.
Кроме того, мы можем пометить наш образ некоторыми метаданными с помощью 'LABEL'
, чтобы добавить больше информации об образе. Вы можете изменять эти значения по мере необходимости.
ПРИМЕЧАНИЕ: 'LABEL RunnerVersion=${RUNNER_VERSION}'
, эта метка динамически обновляется из аргумента build, который мы будем передавать в команду docker build позже.
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
#Set working directory
WORKDIR /actions-runner
Затем мы настроим PowerShell как наш стандартный 'SHELL'
для запуска скриптов или команд, а также зададим рабочий каталог actions-runner с именем 'WORKDIR'
. Этот каталог будет содержать наши исполняемые файлы и скрипты бегуна GitHub по пути: C:actions-runner
внутри контейнера windows.
#Install chocolatey
ADD scripts/Install-Choco.ps1 .
RUN .Install-Choco.ps1 -Wait;
Remove-Item .Install-Choco.ps1 -Force
#Install Git, GitHub-CLI, Azure-CLI and PowerShell Core with Chocolatey (add more tooling if needed at build)
RUN choco install -y
git
gh
powershell-core
azure-cli
Инструкция 'ADD'
скопирует наш скрипт Install-Choco.ps1 в рабочий каталог и 'RUN'
скрипт, который установит Chocolatey в образ, а затем очистит/удалит скрипт.
Второй 'RUN'
будет использовать Chocolatey для установки Git, GitHub-CLI, Azure-CLI и PowerShell Core в образ. Вы можете добавить любые дополнительные инструменты, которые вы хотите добавить в образ во время сборки здесь.
ПРИМЕЧАНИЕ: Старайтесь не устанавливать слишком много пакетов во время сборки, чтобы образ был как можно более компактным, компактным и пригодным для повторного использования. Вы всегда можете использовать GitHub Action позже в рабочем процессе при запуске контейнера и использовать Chocolatey, который теперь загружен в образ/контейнер, для установки большего количества программного обеспечения.
Я также покажу, как мы можем добавить дополнительное программное обеспечение и инструменты, например, Terraform, позже при запуске нашего контейнера, используя GitHub Action.
#Download GitHub Runner based on RUNNER_VERSION argument (Can use: Docker build --build-arg RUNNER_VERSION=x.y.z)
RUN Invoke-WebRequest -Uri "https://github.com/actions/runner/releases/download/v$env:RUNNER_VERSION/actions-runner-win-x64-$env:RUNNER_VERSION.zip" -OutFile "actions-runner.zip";
Expand-Archive -Path ".\actions-runner.zip" -DestinationPath '.';
Remove-Item ".\actions-runner.zip" -Force
Следующая команда 'RUN'
запустит серию команд PowerShell для загрузки и извлечения определенной версии двоичных файлов GitHub runner на основе аргумента сборки 'ARG'
, переданного в процесс сборки контейнера, который устанавливает переменную окружения: $env:RUNNER_VERSION, как описано ранее.
#Add GitHub runner configuration startup script
ADD scripts/start.ps1 .
ADD scripts/Cleanup-Runners.ps1 .
ENTRYPOINT ["pwsh.exe", ".\start.ps1"]
Последний раздел 'ADD'
добавит в рабочий каталог файл Cleanup-Runners.ps1, а также скрипт 'ENTRYPOINT'
с именем start.ps1. Сценарий точки входа будет запускаться каждый раз при создании нового контейнера. Он действует как бутстраппер, который на основе определенных переменных окружения, которые мы передаем в команду Docker Run, таких как $env:GH_OWNER, $env:GH_REPOSITORY и $env:GH_TOKEN, зарегистрирует агент runner для самостоятельного размещения контейнера в определенном репозитории в указанной нами организации GitHub.
Обратите внимание, что сценарий 'ENTRYPOINT'
будет запущен с помощью PowerShell Core с "pwsh.exe"
. Помните, мы использовали Chocolatey для установки PowerShell Core как часть создания образа.
Теперь, когда у нас готовы наши сценарии, а также наш dockerfile, мы можем собрать наш образ.
ПРИМЕЧАНИЕ: Мы можем создавать и запускать образы контейнеров windows с помощью docker-desktop или docker-compose, далее я покажу оба метода.
Сборка образа Docker — Docker Desktop (Windows)
В терминале VSCode или в сеансе PowerShell перейдите в корневую папку с файлом docker и выполните следующую команду. Помните, что нам нужно передать аргумент build, чтобы указать docker, какую версию агента GitHub runner использовать при создании образа. Релизы GitHub Runner
#Build container: docker build [OPTIONS] PATH
docker build --build-arg RUNNER_VERSION=2.292.0 --tag docker-github-runner-win .
Процесс сборки может занять некоторое время:
После завершения процесса вы увидите новый образ в Docker Desktop для Windows в разделе images:
Запуск образа Docker — Docker Desktop (Windows)
Чтобы запустить и предоставить новый контейнер GitHub runner windows из только что созданного образа, выполните следующую команду. Мы должны передать некоторые переменные окружения с помощью опции '-e'
, чтобы указать PAT (Personal Access Token), организацию GitHub и репозиторий для регистрации бегуна.
#Run container from image:
docker run -e GH_TOKEN='myPatToken' -e GH_OWNER='orgName' -e GH_REPOSITORY='repoName' -d image-name
О том, как создать токен PAT на GitHub, см. в разделе Создание персонального маркера доступа. PAT-токены отображаются только один раз и являются конфиденциальными, поэтому позаботьтесь об их сохранности.
Для регистрации саморазмещаемого бегуна в токене PAT требуются следующие минимальные диапазоны разрешений: "repo"
, "read:org"
:
Совет: Я рекомендую использовать только токены PAT с коротким сроком действия и генерировать новые токены каждый раз, когда требуется регистрация новых бегунов-агентов.
После выполнения этой команды в настройках репозитория GitHub вы увидите новый саморазмещающийся GitHub runner. (Это наш контейнер docker):
Вы также сможете увидеть запущенный контейнер в Docker Desktop для Windows в разделе Containers:
Давайте протестируем наш новый контейнер docker с саморазмещаемым GitHub runner, создав рабочий процесс GitHub для запуска нескольких GitHub Actions с помощью установки Terraform на запущенный контейнер.
Вы можете использовать этот тестовый рабочий процесс из моего проекта на GitHub: docker-github-runner-windows.
Создайте новый рабочий процесс в репозитории GitHub, где вы развернули саморазмещаемый бегун, и запустите его:
name: Local runner test
on:
workflow_dispatch:
jobs:
testRunner:
runs-on: [self-hosted]
defaults:
run:
shell: pwsh
steps:
- uses: actions/checkout@v2
- name: Setup Terraform
run: choco install terraform -y
- name: Refresh Environment
run: refreshenv
- name: Display Terraform Version
run: terraform --version
- name: Display Azure-CLI Version
run: az --version
Обратите внимание, что рабочий процесс 'runs-on: [self-hosted]'
и что оболочка по умолчанию установлена на PowerShell Core, 'shell: pwsh'
.
Поскольку Chocolatey является частью образа, который мы собрали ранее, мы можем использовать следующий шаг для установки Terraform с помощью Chocolatey:
steps:
- name: Setup Terraform
run: choco install terraform -y
- name: Display Terraform Version
run: terraform --version
Чтобы добавить дополнительные docker runners (контейнеры), просто повторно запустите команду docker, которую мы выполнили ранее (каждый запуск будет создавать дополнительный экземпляр runner/контейнер):
#Run container from image:
docker run -e GH_TOKEN='myPatToken' -e GH_OWNER='orgName' -e GH_REPOSITORY='repoName' -d image-name
Далее мы рассмотрим остановку/удаление запущенных экземпляров docker и очистку регистраций для всех саморазмещаемых бегунов, зарегистрированных в нашем репозитории GitHub.
Чтобы остановить и удалить все запущенные контейнеры, просто выполните команду :
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
Вы заметите, что все запущенные контейнеры под Docker Desktop for Windows больше не существуют, но у нас все еще есть регистрации в нашем репозитории GitHub, которые теперь отображаются как 'Offline'
:
Чтобы снять регистрацию или очистить эти устаревшие регистрации, просто запустите созданный нами ранее сценарий Cleanup-Runners.ps1 в папке ./scripts (Если вы запускаете этот сценарий локально, убедитесь, что у вас установлен GitHub-CLI, поскольку сценарий вызывает GitHub-CLI для удаления устаревших регистраций бегунов 'Offline'
):
.scriptsCleanup-Runners.ps1 -owner "orgName" -repo "repoName" -pat "myPatToken"
ПРИМЕЧАНИЕ: для удобства этот же сценарий очистки также скопирован в каждый контейнер в рабочую директорию 'C:actions-runnerCleanup-Runners.ps1'
.
После запуска сценария очистки вы заметите, что несвежие 'offline'
регистрации в нашем репозитории теперь удалены.
Далее мы рассмотрим, как мы можем собрать образ, а также запустить наш образ в масштабе с помощью docker-compose.
Сборка образа Docker — Docker Compose (Windows)
Как мы видели ранее, собрать наш образ с помощью команд docker довольно просто, но мы также можем использовать docker-compose с конфигурационным файлом, чтобы сделать все немного проще. Для этого снова перейдите в корневую папку, содержащую созданный нами ранее dockerfile, и создайте новый файл 'YAML'
под названием docker-compose.yml:
---
version: '3.8'
services:
runner:
image: pwd9000-github-runner-win:latest
build:
context: .
args:
RUNNER_VERSION: '2.292.0'
environment:
GH_TOKEN: ${GH_TOKEN}
GH_OWNER: ${GH_OWNER}
GH_REPOSITORY: ${GH_REPOSITORY}
В конфигурационном файле docker compose мы можем задать параметры для нашего образа докера, указав такие вещи, как имя образа, версию GitHub runner, а также переменные окружения.
Обратите внимание, что мы должны установить эти переменные окружения на нашем хосте, машине windows 11, чтобы docker compose смог интерпретировать значения, указанные в файле 'YAML'
внутри символов '${}'
. Это можно легко сделать, выполнив следующие команды PowerShell на хосте windows 11:
#set system environment with $env: (or use .env file to pass GH_TOKEN, GH_OWNER, GH_REPOSITORY)
$env:GH_OWNER='Org/Owner'
$env:GH_REPOSITORY='Repository'
$env:GH_TOKEN='myPatToken'
ПРИМЕЧАНИЕ: Вы также можете использовать файл окружения для передачи переменных окружения в процесс сборки docker compose, используя файл docker-compose.yml, как показано ниже:
---
version: '3.8'
services:
runner:
image: pwd9000-github-runner-win:latest
build:
context: .
args:
RUNNER_VERSION: '2.292.0'
env_file:
- ./variables.env
Однако этот метод требует создания еще одного файла в корне нашей рабочей папки под названием ./variables.env и заполнения этого файла переменными окружения, как показано ниже:
GH_OWNER=orgName
GH_REPOSITORY=repoName
GH_TOKEN=myPatToken
ВАЖНО: Не используйте этот метод и не фиксируйте этот файл в контроле исходного кода, если вы используете конфиденциальные значения и храните свой код в удаленном репозитории контроля исходного кода. При необходимости добавьте этот файл окружения в файл '.gitignore'
, чтобы он не попадал в контроль исходного кода.
Какой бы метод вы ни решили использовать, вы можете запустить процесс сборки после создания этого файла docker-compose.yml, выполнив следующую команду PowerShell:
docker-compose build
После завершения процесса вы увидите новый образ в Docker Desktop для Windows в разделе images:
Запуск и масштабирование образа Docker — Docker Compose (Windows)
Что приятно в использовании docker-compose, так это то, что мы можем легко масштабировать количество бегунов, которые мы хотим использовать, просто выполнив следующую команду:
docker-compose up --scale runner=3 -d
Поскольку вся наша конфигурация и детали хранятся в переменных окружения и файле docker-compose 'YAML'
, нам не нужно выполнять длинные команды docker, как мы делали ранее, и мы просто масштабируем количество бегунов, указывая параметр '--scale'
.
ПРИМЕЧАНИЕ: Параметр '--scale runner=3 -d'
основан на параметре docker compose file, 'services:'
, который в нашем случае называется 'runner'
:
services:
runner:
Чтобы уменьшить масштаб до одного бегуна, мы можем просто повторно выполнить команду следующим образом:
docker-compose up --scale runner=1 -d
Чтобы остановить и удалить все запущенные контейнеры, просто выполните команду:
docker-compose stop
docker rm $(docker ps -aq)
Как было описано ранее, вы заметите, что все запущенные контейнеры в Docker Desktop for Windows больше не существуют, но все еще имеют регистрацию в нашем репозитории GitHub, который теперь отображается как 'Offline'
:
Просто повторно запустите сценарий очистки, который мы запустили ранее в папке ./scripts под названием Cleanup-Runners.ps1:
.scriptsCleanup-Runners.ps1 -owner "orgName" -repo "repoName" -pat "myPatToken"
В этой части цикла мы рассказали о том, как можно создавать и запускать саморазмещаемые GitHub runners как контейнеры windows с помощью docker-desktop и docker-compose. В следующей части этой серии блогов мы рассмотрим создание контейнера образа Ubuntu на базе Linux для наших саморазмещаемых GitHub runners.
Надеюсь, вам понравилась эта статья и вы узнали что-то новое. Примеры кода, использованные в этой статье, вы можете найти на моей странице GitHub. ❤️
Автор
Like, share, follow me on: 🐙 GitHub | 🐧 Twitter | 👾 LinkedIn

Marcel.L