Создание Windows-контейнера Self Hosted GitHub runner на базе Docker


Обзор

Весь код, используемый в этом руководстве, можно найти в моем проекте на 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)
Enter fullscreen mode Выйти из полноэкранного режима

Как было описано ранее, вы заметите, что все запущенные контейнеры в 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

Microsoft DevOps MVP | Cloud Solutions & DevOps Architect | Технический спикер, специализирующийся на технологиях Microsoft, IaC и автоматизации в Azure. Найдите меня на GitHub: https://github.com/Pwd9000-ML

Оцените статью
Procodings.ru
Добавить комментарий