Хостинг ваших саморазмещаемых бегунов на GitHub Codespaces


Обзор

Добро пожаловать в очередную часть моей серии «Советы профи по GitHub Codespaces». В прошлой части мы говорили об интеграции GitHub с Azure DevOps и о том, как вы можете использовать некоторые замечательные возможности GitHub, такие как Codespaces, вместе с Azure DevOps.

В сегодняшней статье я расскажу вам о том, как можно использовать кодовое пространство GitHub не только в качестве «среды разработки» для работы с кодом, но и задействовать вычислительную мощь кодового пространства, запустив в кодовом пространстве одновременно Self Hosted GitHub runner.

Мы будем использовать пользовательский образ docker, который будет автоматически предоставлять агент саморазмещающегося runner и регистрировать его одновременно с предоставлением Codespace в качестве части среды разработки.

Мы также рассмотрим жизненный цикл Codespace/Runner. По умолчанию все активные кодовые пространства, которые простаивают, переходят в спящий режим через 30 минут для экономии вычислительных затрат, поэтому мы рассмотрим, как можно настроить и продлить (при необходимости) этот тайм-аут.

На самом деле мы будем использовать очень похожий подход для конфигурации образа докера, основанный на одной из моих предыдущих записей в блоге, «Создание контейнера Self Hosted GitHub runner Linux на базе Docker». Ознакомьтесь с этой статьей, если вам нужна дополнительная информация о том, как работают саморазмещающиеся контейнеры GitHub runner.

Начало работы

Все примеры и образцы кода также доступны в моем демо-репозитории GitHub Codespaces.

Поскольку контейнеры Codespaces/Dev основаны на образах docker, мы создадим собственный образ linux docker, который будет запускать и загружать runner agent при запуске кодового пространства.

Мы создадим следующее дерево структуры папок в корне нашего репозитория GitHub:

В вашем репозитории GitHub создайте подпапку '.devcontainer', в моем случае я назвал папку конфигурации кодового пространства 'codespaceRunner'.

Затем создайте следующий Dockerfile:

# You can pick any Debian/Ubuntu-based image. 😊
FROM mcr.microsoft.com/vscode/devcontainers/base:0-bullseye

# [Optional] Install zsh
ARG INSTALL_ZSH="true"
# [Optional] Upgrade OS packages to their latest versions
ARG UPGRADE_PACKAGES="false"

# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies.
ARG USERNAME=vscode
ARG USER_UID=1000
ARG USER_GID=$USER_UID
COPY library-scripts/*.sh /tmp/library-scripts/
RUN bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" "true" "true"

# cd into the user directory, download and unzip the github actions runner
RUN cd /home/vscode && mkdir actions-runner && cd actions-runner

#input GitHub runner version argument
ARG RUNNER_VERSION="2.292.0"

RUN cd /home/vscode/actions-runner 
    && curl -O -L https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz 
    && tar xzf /home/vscode/actions-runner/actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz 
    && /home/vscode/actions-runner/bin/installdependencies.sh

# copy over the start.sh script
COPY library-scripts/start.sh /home/vscode/actions-runner/start.sh

# Apply ownership of home folder
RUN chown -R vscode ~vscode

# make the script executable
RUN chmod +x /home/vscode/actions-runner/start.sh

# Clean up
RUN rm -rf /var/lib/apt/lists/* /tmp/library-scripts
Войти в полноэкранный режим Выйти из полноэкранного режима

Затем создайте файл 'devcontainer.json'. (См. мою предыдущую статью в блоге о том, как этот файл может быть изменен с помощью дополнительных функций и расширений):

{
    "name": "CodespaceRunner",
    "dockerFile": "Dockerfile",

    // Configure tool-specific properties.
    "customizations": {
        // Configure properties specific to VS Code.
        "vscode": {
            // Add the IDs of extensions you want installed when the container is created.
            "extensions": [
                "ms-vscode.azurecli",
                "ms-vscode.powershell",
                "hashicorp.terraform",
                "esbenp.prettier-vscode",
                "tfsec.tfsec"
            ]
        }
    },

    // Use 'forwardPorts' to make a list of ports inside the container available locally.
    // "forwardPorts": [],

    // Use 'postStartCommand' to run commands each time the container is successfully started..
    "postStartCommand": "/home/vscode/actions-runner/start.sh",

    // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
    "remoteUser": "vscode",
    // Amend GitHub runner version with 'RUNNER_VERSION'. https://github.com/actions/runner/releases.
    "build": {
        "args": {
            "UPGRADE_PACKAGES": "true",
            "RUNNER_VERSION": "2.295.0"
        }
    },
    "features": {
        "terraform": "latest",
        "azure-cli": "latest",
        "git-lfs": "latest",
        "github-cli": "latest",
        "powershell": "latest"
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

ПРИМЕЧАНИЕ: Вы можете изменить версию бегущей строки на GitHub, изменив атрибут build args RUNNER_VERSION.

// Amend GitHub runner version with 'RUNNER_VERSION'. https://github.com/actions/runner/releases.
"build": {
    "args": {
        "UPGRADE_PACKAGES": "true",
        "RUNNER_VERSION": "2.295.0"
    }
Войти в полноэкранный режим Выход из полноэкранного режима

Далее мы создадим папку с несколькими скриптами, которые будут использоваться нашим докер-образом.

Создадим папку 'library-scripts' и поместим в нее следующие два скрипта: ‘start.sh’ и ‘common-debian.sh’.

Давайте рассмотрим каждый из скриптов подробнее.

  1. common-debian.sh: Этот скрипт установит дополнительные инструменты на базе debian в контейнер dev.

  2. start.sh:

#start.sh
#!/bin/bash

GH_OWNER=$GH_OWNER
GH_REPOSITORY=$GH_REPOSITORY
GH_TOKEN=$GH_TOKEN

HOSTNAME=$(hostname)
RUNNER_SUFFIX="runner"
RUNNER_NAME="${HOSTNAME}-${RUNNER_SUFFIX}"
USER_NAME_LABEL=$(git config --get user.name)
REPO_NAME_LABEL="$GH_REPOSITORY"

REG_TOKEN=$(curl -sX POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ${GH_TOKEN}" https://api.github.com/repos/${GH_OWNER}/${GH_REPOSITORY}/actions/runners/registration-token | jq .token --raw-output)

/home/vscode/actions-runner/config.sh --unattended --url https://github.com/${GH_OWNER}/${GH_REPOSITORY} --token ${REG_TOKEN} --name ${RUNNER_NAME}  --labels ${USER_NAME_LABEL},${REPO_NAME_LABEL}
/home/vscode/actions-runner/run.sh
Вход в полноэкранный режим Выход из полноэкранного режима

Второй скрипт запустит контейнер Codespace/Dev и загрузит GitHub runner при запуске Codespace. Обратите внимание, что нам нужно указать скрипту некоторые параметры:

GH_OWNER=$GH_OWNER
GH_REPOSITORY=$GH_REPOSITORY
GH_TOKEN=$GH_TOKEN
Войти в полноэкранный режим Выйти из полноэкранного режима

Эти параметры (переменные окружения) используются для настройки и регистрации саморазмещаемого бегуна github в нужном репозитории.

Нам нужно указать имя учетной записи/организации GitHub через переменную окружения 'GH_OWNER', имя репозитория через GH_REPOSITORY и PAT-токен через GH_TOKEN.

Вы можете хранить конфиденциальную информацию, такую как токены, к которой вы хотите получить доступ в своих кодовых пространствах через переменные окружения. Давайте настроим эти параметры как зашифрованные секреты для кодовых пространств.

  1. Перейдите на страницу репозитория 'Settings' и выберите 'Secrets -> Codespaces', нажмите на 'New repository secret'.

  2. Создайте каждый секрет кодового пространства со значениями для вашей среды.

ПРИМЕЧАНИЕ: Когда саморазмещаемый бегунок будет запущен и зарегистрирован, он также будет помечен ‘именем пользователя’ и ‘именем хранилища’ из следующих строк. (При необходимости эти метки могут быть изменены):

USER_NAME_LABEL=$(git config --get user.name)
REPO_NAME_LABEL="$GH_REPOSITORY"
Войти в полноэкранный режим Выход из полноэкранного режима

Примечание о персональном маркере доступа (PAT)

О том, как создать персональный токен доступа, см. в разделе Создание персонального токена доступа на GitHub PAT. Токены PAT отображаются только один раз и являются конфиденциальными, поэтому обеспечьте их сохранность.

Для регистрации саморазмещаемого бегуна токену PAT требуются следующие минимальные диапазоны прав: "repo", "read:org":

Совет: Я рекомендую использовать только токены PAT с коротким сроком действия и генерировать новые токены каждый раз, когда требуется регистрация новых бегунов-агентов.

Развертывание бегуна Codespace на GitHub

Как видно на скриншоте ниже, в моем репозитории нет настроенных бегунов.

  1. Перейдите в свой репозиторий, нажмите на выпадающий список '<> Code' и выберите вкладку 'Codespaces', выберите опцию 'Advanced' для настройки и создания кодового пространства.

  2. Выберите соответствующий 'Branch', 'Region', 'Machine type' и для 'Dev container configuration' выберите созданную нами конфигурацию 'codespaceRunner' и нажмите на 'Createcodespace'.

Создание и запуск контейнера займет несколько минут, но вы можете просматривать журналы, пока кодовое пространство создается в режиме реального времени.

Чтобы ускорить создание кодового пространства, администраторы хранилища могут включить предварительную сборку кодового пространства для хранилища. Дополнительную информацию см. в разделе «О предварительных сборках GitHub Codespaces».

Когда кодовое пространство создано, вы можете узнать имя хоста базового вычислителя, набрав в терминале: 'hostname'.

Перейдите на страницу настроек вашего репозитория, обратите внимание, что теперь там зарегистрирован и помечен вашим именем пользователя и именем репозитория саморазмещающийся бегун GitHub. Имя бегуна совпадает с именем хоста Codepsace.

Управление жизненным циклом Codespace/Runner

При остановке вашего кодового пространства бегун не будет удален, а только перейдет в состояние 'Offline', и когда вы снова запустите кодовое пространство, бегун будет снова доступен.

Кроме того, как уже упоминалось, по умолчанию все активные кодовые пространства, не остановленные вручную, будут простаивать и переходить в спящий режим через 30 минут для экономии вычислительных затрат. Давайте посмотрим, как можно изменить жизненный цикл кодовых пространств.

  1. В правом верхнем углу любой страницы нажмите на фотографию своего профиля, затем нажмите Настройки и в разделе «Код, планирование и автоматизация» на боковой панели выберите Кодовые пространства.

  2. В разделе «Время простоя по умолчанию» введите нужное вам время и нажмите Сохранить. Время должно составлять от 5 минут до 240 минут (4 часа).

Заключение

Как видите, довольно просто запускать саморазмещающиеся экшен-бегуны внутри вашего пространства кодов и использовать вычислительные мощности самого контейнера dev.

Поступая таким образом, мы можем решить несколько проблем одним решением.

  1. Стоимость — Не тратить впустую затраты и вычислительные мощности, добавляя вычисления отдельно для саморазмещаемых бегунов вместе с Codespaces.
  2. Администрирование — работа обоих сервисов на одном вычислительном комплексе и совместное использование одной и той же конфигурации и инструментария экономит время на администрирование и обслуживание.
  3. Доступность — саморазмещаемые бегуны доступны как часть работающего кодового пространства.

ВАЖНО: Обратите внимание, что использование меток бегунов очень важно при инициировании/запуске действий против бегунов или групп бегунов, размещенных в кодовом пространстве. Поэтому каждый бегун помечается именем пользователя и именем репозитория.

Пример

Самостоятельно размещаемый бегун автоматически получает определенные метки при добавлении в GitHub Actions. Они используются для указания его операционной системы и аппаратной платформы:

Вы можете использовать YAML вашего рабочего процесса для отправки заданий на комбинацию этих меток. В этом примере самостоятельный хостинг, соответствующий всем трем меткам, будет иметь право на выполнение задания:

runs-on: [self-hosted, linux, ARM64]
Вход в полноэкранный режим Выйти из полноэкранного режима

Ярлыки по умолчанию фиксированы, их нельзя изменить или удалить. Рассмотрите возможность использования пользовательских меток, если вам нужно больше контроля над маршрутизацией заданий.

Как видно из этого примера рабочего процесса в моем репозитории, я маршрутизирую задания GitHub Action, в частности, на свой собственный хостинг на Codespace, используя метки имени пользователя и имени репозитория с 'runs-on':

name: Runner on Codespace test

on:
  workflow_dispatch:

jobs:
  testRunner:
    runs-on: [self-hosted, Pwd9000, GitHub-Codespaces-Lab]
    steps:
      - uses: actions/checkout@v3.0.2
      - name: Display Terraform Version
        run: terraform --version
      - name: Display Azure-CLI Version
        run: az --version
Войти в полноэкранный режим Выход из полноэкранного режима

Надеюсь, вам понравился этот пост и вы узнали что-то новое. Вы также можете найти примеры кода, использованные в этой статье, на моей опубликованной странице 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

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