この記事は、さくらインターネット 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時などに限定して使うのがよさそうです。