GitHub ActionsでFreeBSDを使う
サーバ
Published: 2024-12-22

この記事は、さくらインターネット Advent Calendar 2024の22日目の記事です。

はじめに

GitHub ActionsでFreeBSDを使いたい場合があります。
というか、さくらインターネットだとFreeBSDを使っているのでどうしても使いたい場合があります。

現在はJenkinsとFreeBSDの環境をSSHしてビルドしたりと結構な力業でやってるのですが、
GitHub ActionsでできるならGitHub Actionsでやりたいですよね。

Cross-Platform GitHub Action を使う

Cross-Platform GitHub Action を使うと、FreeBSDを使うことができます。
これは、GitHub Actionsの上で、Qemuを使って他のOSをVMとして動かすことができるものです。

なかなか力業なアプローチですが、GitHub ActionsでFreeBSDが利用できるのはありがたいです。

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を実行すると、FreeBSD 13.4のuname -aが実行されます。

Actionsの結果 first commit #1

簡単にFreeBSDを使うことができました🎉

FreeBSDのカスタムイメージ

カスタムイメージを作成

freebsd-builder を使うと、FreeBSDのカスタムイメージを使うことができます。

実際の環境ではカスタムしたイメージを指定して使っています。
恥ずかしながら、11.2など古いFreeBSDが動いていたり、golangを入れたイメージが必要だったりするため、
カスタムイメージを用意して利用しています。

今回はFreeBSD 13.4にgolangとcgoを利用するためにgccを入れたイメージを作成してみます。

レポジトリのクローンをしてカスタムイメージを作成します。

$ 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

# Add your additional provisioning here for custom VM images.

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が実行されました。

おわりに

  • GitHub ActionsでFreeBSDを使う方法を紹介しました。
  • Qemuを使うのでメモリをたくさん使う場合は注意が必要ですが、簡単にFreeBSDを使うことができました。
  • Qemuを使うためCIに時間がかかるため、Pull RequestやRelease時などに限定して使うのがよさそうです。