Использование FreeBSD с GitHub Actions
Сервер
Published: 2024-12-22

Эта статья является 22-й статьей в Advent Calendar 2024 от Sakura Internet.

Введение

Иногда возникает необходимость использовать FreeBSD с GitHub Actions.
На самом деле, поскольку я использую FreeBSD на Sakura Internet, мне это действительно необходимо.

В настоящее время я использую Jenkins и выполняю сборки по SSH в среде FreeBSD, что является довольно сложной задачей.
Если есть возможность делать это с помощью GitHub Actions, то я определенно хочу использовать именно его.

Использование Cross-Platform GitHub Action

С помощью Cross-Platform GitHub Action можно использовать FreeBSD.
Это позволяет запускать другие операционные системы как виртуальные машины на GitHub Actions с использованием Qemu.

Хотя это довольно сложный подход, возможность использовать FreeBSD с GitHub Actions очень полезна.

Создание Actions

Сначала создадим репозиторий для использования Cross-Platform GitHub Action.

$ git init actions_freebsd
$ cd actions_freebsd

Затем создайте директорию .github/workflows и в ней файл main.yml.

$ mkdir -p .github/workflows
$ vi .github/workflows/main.yml

В файле main.yml запишите следующее содержимое.

name: FreeBSD

on: push

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: test freebsd 13.4
        uses: cross-platform-actions/action@v0.26.0
        with:
          memory: 512M
          operating_system: freebsd
          version: "13.4"
          shell: sh
          run: |
            uname -a            

Выполните git push и запустите GitHub Actions.

$ git remote add origin git@github.com:masa23/actions_freebsd.git
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git push origin main

Когда запустите GitHub Actions, будет выполнена команда uname -a для FreeBSD 13.4.

Результаты Actions first commit #1

Теперь легко использовать FreeBSD 🎉

Кастомный образ FreeBSD

Создание кастомного образа

С помощью freebsd-builder можно создать кастомный образ FreeBSD.

В реальной среде я использую кастомный образ.
Мне иногда нужно использовать старый FreeBSD, например, 11.2, или образ с установленным golang,
поэтому я подготовил и использую кастомный образ.

На этот раз я собираюсь создать образ, включающий gcc для использования golang и cgo на FreeBSD 13.4.

Клонируйте репозиторий и создайте кастомный образ.

$ git clone https://github.com/cross-platform-actions/freebsd-builder.git
$ cd freebsd-builder
  • Используя custom.sh, создается кастомный образ.

Для сборки с использованием CGO устанавливаются gcc и Go.

$ vi resource/custom.sh
#!/bin/sh

set -exu

# Добавьте здесь дополнительные настройки для кастомных VM образов.

GOLANG_VERSION=1.23.4

pkg install -y gcc
fetch -o - https://go.dev/dl/go${GOLANG_VERSION}.freebsd-amd64.tar.gz | tar xz -f - -C /usr/local/
ln -s /usr/local/go/bin/go /usr/local/bin/go

Настройка окружения для сборки

sudo curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install -y qemu-system-x86 packer
packer plugins install github.com/hashicorp/qemu

Сборка образа

PACKER_LOG=1 sudo -E bash ./build.sh 13.4 x86-64 -var headless=true
# ls -lh output/
total 664M
-rw-r--r-- 1 root root 664M Dec 20 16:29 freebsd-13.4-x86-64.qcow2

Выпуск

$ gh release create v0.0.1 --title "FreeBSD 13.4 add golang" --notes "FreeBSD 13.4" output/freebsd-13.4-x86-64.qcow2

Использование образа для выполнения CI

name: FreeBSD

on: 

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: test for freebsd 13.0
        uses: cross-platform-actions/action@v0.26.0
        with:
          memory: 512M
          operating_system: freebsd
          version: 13.4
          image_url: https://github.com/masa23/freebsd-builder/releases/download/v0.0.1/freebsd-13.4-x86-64.qcow2 # Задайте здесь URL кастомного образа
          shell: sh
          run: |
            export CC=gcc
            go test -v ./...            

Проверка результатов Actions

Результаты Actions golang test cgo #3

CI успешно выполнен с использованием кастомного образа.

Заключение

  • Я рассказал о том, как использовать FreeBSD с GitHub Actions.
  • Поскольку используется Qemu, необходимо быть осторожным, если потребуется много памяти, но процесс использования FreeBSD оказался довольно простым.
  • Учитывая, что использование Qemu может занять много времени для CI, разумно использовать его только при Pull Request и Release.