在GitHub Actions中使用FreeBSD
服务器
Published: 2024-12-22

本文是樱花互联网 Advent Calendar 2024的第22篇文章。

引言

有时可能希望在GitHub Actions中使用FreeBSD。
实际上,由于樱花互联网使用FreeBSD,因此确实有希望使用它的需求。

目前我通过SSH到Jenkins和FreeBSD环境进行构建,虽然有些费力,
但如果能在GitHub Actions中完成,当然希望使用GitHub Actions。

使用Cross-Platform GitHub Action

通过使用Cross-Platform GitHub Action,可以使用FreeBSD。
这个工具可以在GitHub Actions上利用Qemu作为虚拟机运行其他操作系统。

这是一种相对费力的方式,但能够在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: 测试 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 "第一次提交"
$ git branch -M main
$ git push origin main

当GitHub Actions执行时,将执行FreeBSD 13.4的uname -a。

Actions的结果 第一次提交 #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创建自定义镜像。

安装gcc和Go以便进行CGO构建。

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

set -exu

# 在这里添加你的自定义虚拟机镜像的附加配置。

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 添加 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: 测试 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 测试 cgo #3

成功使用自定义镜像执行了CI。

结束语

  • 本文介绍了如何在GitHub Actions中使用FreeBSD。
  • 由于使用Qemu,如果消耗大量内存,需要注意,但总的来说,使用FreeBSD变得简单了。
  • 由于使用Qemu,CI可能需要花费较长时间,因此建议在Pull Request或Release时使用。