Эта статья является 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.