From 5066042c036ea3926be718723802729dc911d06b Mon Sep 17 00:00:00 2001 From: Mike Wang Date: Mon, 28 Jul 2025 04:02:49 +0800 Subject: [PATCH] CI: Add GitHub Actions --- .github/workflows/ci.yml | 142 +++++++++++++++++++++++ .github/workflows/release.yml | 50 ++++++++ .github/workflows/scripts/cross-setup.sh | 98 ++++++++++++++++ 3 files changed, 290 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100755 .github/workflows/scripts/cross-setup.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f072b59 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,142 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + workflow_call: + inputs: + version: + description: Version Number + type: string + required: false + +jobs: + Lint: + name: Lint + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Install clang-format + run: | + sudo apt-get update + sudo apt-get install -y clang-format + - name: Run clang-format + run: | + clang-format --dry-run --Werror src/*.c include/*.h + + Build: + name: Build + runs-on: ubuntu-latest + env: + cross_dir: /opt/x-tools + strategy: + matrix: + include: + - name: arm64 + triplet: aarch64-unknown-linux-musl + sha256: 76f0d71893f3864e91ad09feff71a719cdf94cccd4f14cc25d7deed395968b5b + - name: arm32 + triplet: arm-unknown-linux-musleabi + sha256: 1242b2a965480415ce90a710ab7600730a8de114f5bc5452ed7382e64839b5de + - name: arm32hf + triplet: arm-unknown-linux-musleabihf + sha256: 6e6f20cebd75ca5319c5dfb00fdd50a4ceb22af2df9073a75cafbdd3204eebad + - name: arm32v7 + triplet: armv7-unknown-linux-musleabi + sha256: 158d8fd651d8c501d8dea4bb82a152208732cb10a5f72e7e8e4ce9f551e8d165 + - name: arm32v7hf + triplet: armv7-unknown-linux-musleabihf + sha256: 7643420285f038545997d3234bee9c854900fa9060388769442ed20a72aeac23 + - name: i586 + triplet: i586-unknown-linux-musl + sha256: 37d494c1fe60ac07ab8b83871a77a63ab885e5b06cceaa0777537db7767c464f + - name: i686 + triplet: i686-unknown-linux-musl + sha256: 0b1baac45c94b499791b65bbc63d0486aa557c6576142eddce3dee55e2fd022b + - name: loong64 + triplet: loongarch64-unknown-linux-musl + sha256: 2b8cddf9e082f8c8527a459520037ebcedae7262950e429d96184622ae74b8cf + - name: m68k + triplet: m68k-unknown-linux-musl + sha256: 72f6427a1c97c1bd151ebcbd98eab6c39d46090bb89ff2e40c639be012dd2855 + - name: microblazeel + triplet: microblazeel-xilinx-linux-musl + sha256: ce892fe2c799bfd963de06632f5d02ea3e78d8abf2bfd361d673d4ce28fb6f69 + - name: microblaze + triplet: microblaze-xilinx-linux-musl + sha256: 03852d0ba1a5d6cd3efe1ee5b1cb7506fcc2b5b3026966fe1d7d916d621f5b4b + - name: mips64el + triplet: mips64el-unknown-linux-musl + sha256: 01f821f8c476ec6e9618c4272a2e7e6fa3d664491f5ede4296d33af2e423a5ca + - name: mips64 + triplet: mips64-unknown-linux-musl + sha256: 9a99beb2e08584373451321d4580ff9c6fe3e1899daab511d2822d547e1a78be + - name: mips32el + triplet: mipsel-unknown-linux-musl + sha256: 2698fea97c0c8bfdbcfa5db3fead20f779411ab1222e571b966a823a9f27356d + - name: mips32elsf + triplet: mipsel-unknown-linux-muslsf + sha256: 36d8b864b3f6d27558d3f19695a4a39b79a873086edc60bebf733777df2b8359 + - name: mips32 + triplet: mips-unknown-linux-musl + sha256: b74b51d0f61a837f235ec2cecc7b112c1ed53ad8046c88b907a63b4fdf93d4f3 + - name: mips32sf + triplet: mips-unknown-linux-muslsf + sha256: cc87dcaeed29f970bddb4b572c40a4074b9ac3997ba254725e8a89e05485538a + - name: powerpc64 + triplet: powerpc64-unknown-linux-musl + sha256: d3cce7238b4e2bfaf0ae5a47d4390b84616ad8ae848a07809fe293f436444ee8 + - name: powerpc + triplet: powerpc-unknown-linux-musl + sha256: aa50fe4bd9de4e1616400086ec5a29eded5bfbbb9b974b44e990ede3554ffc9e + - name: riscv32 + triplet: riscv32-unknown-linux-musl + sha256: ebac6326d6a0cd77c03a9813e6cf63ce70d3d46381149a82cafb60563d9c4732 + - name: riscv64 + triplet: riscv64-unknown-linux-musl + sha256: 552361f25eaef471d88032eab89e7c1642ddfee466556f1f2e0f6eb68453b7a1 + - name: s390x + triplet: s390x-ibm-linux-musl + sha256: d48e0465117ecdba93db01feffd7133bdc975b5dd859e388a8bf7937a9b68d36 + - name: sh4 + triplet: sh4-multilib-linux-musl + sha256: 6d1cb6c64e71773c4fe68b4a5d774e596ac3d58813b5c1365529b34be08ff309 + - name: x86_64 + triplet: x86_64-unknown-linux-musl + sha256: a896bad67a4dae7cd7baece62d537fda07f8c74e65fee1b450a691b83e151a9c + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Set up toolchain for ${{ matrix.name }} + run: | + CROSS_TOOLCHAIN_URL="https://github.com/cross-tools/musl-cross/releases/download/20250520/${{ matrix.triplet }}.tar.xz" + + sudo mkdir -m 777 -p "${{ env.cross_dir }}" + env \ + CROSS_TRIPLET="${{ matrix.triplet }}" \ + CROSS_TOOLCHAIN_URL="$CROSS_TOOLCHAIN_URL" \ + CROSS_TOOLCHAIN_SHA256="${{ matrix.sha256 }}" \ + CROSS_DIR="${{ env.cross_dir }}" \ + .github/workflows/scripts/cross-setup.sh + - name: Build for ${{ matrix.name }} + run: | + CROSS_PREFIX="${{ env.cross_dir }}/${{ matrix.triplet }}/bin/${{ matrix.triplet }}-" + VERSION="${{ inputs.version }}" + + if [ -n "$VERSION" ]; then + make -j$(nproc) CFLAGS="-Werror" STATIC=1 CROSS_PREFIX="$CROSS_PREFIX" VERSION="$VERSION" + else + make -j$(nproc) CFLAGS="-Werror" STATIC=1 CROSS_PREFIX="$CROSS_PREFIX" + fi + - name: Upload ${{ matrix.name }} + uses: actions/upload-artifact@v4 + with: + name: fakesip-linux-${{ matrix.name }} + path: build/fakesip + if-no-files-found: error diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..aad5a36 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,50 @@ +name: Release +run-name: Release ${{ github.event.inputs.version }} + +on: + workflow_dispatch: + inputs: + version: + description: Version Number + type: string + required: true + +jobs: + Build: + uses: ./.github/workflows/ci.yml + with: + version: ${{ github.event.inputs.version }} + + Release: + permissions: + contents: write + runs-on: ubuntu-latest + needs: Build + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 1 + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + path: ${{ github.workspace }}/artifacts + - name: Reorganize files + run: | + mkdir release + cd artifacts + chmod a+x */fakesip* + for triplet in *; do + tar czvf "../release/$triplet.tar.gz" "$triplet" + done + - name: Make a tag + run: | + git config user.name 'GitHub Actions' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git tag -a '${{ github.event.inputs.version }}' -m '${{ github.event.inputs.version }}' + git push origin '${{ github.event.inputs.version }}' + - name: Make a release + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + gh release create --title 'v${{ github.event.inputs.version }}' --generate-notes --verify-tag '${{ github.event.inputs.version }}' release/*.tar.gz diff --git a/.github/workflows/scripts/cross-setup.sh b/.github/workflows/scripts/cross-setup.sh new file mode 100755 index 0000000..6993863 --- /dev/null +++ b/.github/workflows/scripts/cross-setup.sh @@ -0,0 +1,98 @@ +#!/bin/sh +set -eux + +: "------" +: "CROSS_TRIPLET=$CROSS_TRIPLET" +: "CROSS_TOOLCHAIN_URL=$CROSS_TOOLCHAIN_URL" +: "CROSS_TOOLCHAIN_SHA256=$CROSS_TOOLCHAIN_SHA256" +: "CROSS_DIR=$CROSS_DIR" +: "------" + +CROSS_BASE="$CROSS_DIR/$CROSS_TRIPLET" +CROSS_SRC="$CROSS_BASE/src" +CROSS_USR="$CROSS_BASE/$CROSS_TRIPLET/sysroot/usr" +PATH="$CROSS_BASE/bin:$PATH" +PKG_CONFIG_PATH="$CROSS_DIR/$CROSS_TRIPLET/$CROSS_TRIPLET/sysroot/usr/lib/pkgconfig" +export PATH PKG_CONFIG_PATH + +libmnl_name=libmnl-1.0.5 +libmnl_tar=$libmnl_name.tar.bz2 +libmnl_sha256=274b9b919ef3152bfb3da3a13c950dd60d6e2bcd54230ffeca298d03b40d0525 +libmnl_url="https://www.netfilter.org/projects/libmnl/files/$libmnl_tar" + +libnfnetlink_name=libnfnetlink-1.0.2 +libnfnetlink_tar=$libnfnetlink_name.tar.bz2 +libnfnetlink_sha256=b064c7c3d426efb4786e60a8e6859b82ee2f2c5e49ffeea640cfe4fe33cbc376 +libnfnetlink_url="https://www.netfilter.org/projects/libnfnetlink/files/$libnfnetlink_tar" + +libnetfilter_queue_name=libnetfilter_queue-1.0.5 +libnetfilter_queue_tar=$libnetfilter_queue_name.tar.bz2 +libnetfilter_queue_sha256=f9ff3c11305d6e03d81405957bdc11aea18e0d315c3e3f48da53a24ba251b9f5 +libnetfilter_queue_url="https://www.netfilter.org/projects/libnetfilter_queue/files/$libnetfilter_queue_tar" + + +: "Downloading toolchain..." +cd "$CROSS_DIR" +curl -Lfo "$CROSS_TRIPLET.tar.xz" "$CROSS_TOOLCHAIN_URL" +echo "$CROSS_TOOLCHAIN_SHA256 *$CROSS_TRIPLET.tar.xz" | sha256sum -c +sha256sum "$CROSS_TRIPLET.tar.xz" + + +: "Extracting toolchain..." +cd "$CROSS_DIR" +rm -rf "$CROSS_BASE" +tar xf "$CROSS_TRIPLET.tar.xz" +chmod -R u+w "$CROSS_BASE" +mkdir -p "$CROSS_SRC" + + +: "Downloading dependencies..." +cd "$CROSS_SRC" +curl -Lfo "$libmnl_tar" "$libmnl_url" +echo "$libmnl_sha256 *$libmnl_tar" | sha256sum -c +curl -Lfo "$libnfnetlink_tar" "$libnfnetlink_url" +echo "$libnfnetlink_sha256 *$libnfnetlink_tar" | sha256sum -c +curl -Lfo "$libnetfilter_queue_tar" "$libnetfilter_queue_url" +echo "$libnetfilter_queue_sha256 *$libnetfilter_queue_tar" | sha256sum -c + + +: "Building libmnl..." +cd "$CROSS_SRC" +rm -rf "$libmnl_name" +tar xf "$libmnl_tar" +mkdir "$libmnl_name/builddir" +cd "$libmnl_name/builddir" +../configure \ + --enable-static \ + --host="$CROSS_TRIPLET" \ + --prefix="$CROSS_USR" +make +make install + + +: "Building libnfnetlink..." +cd "$CROSS_SRC" +rm -rf "$libnfnetlink_name" +tar xf "$libnfnetlink_tar" +mkdir "$libnfnetlink_name/builddir" +cd "$libnfnetlink_name/builddir" +../configure \ + --enable-static \ + --host="$CROSS_TRIPLET" \ + --prefix="$CROSS_USR" +make +make install + + +: "Building libnetfilter_queue..." +cd "$CROSS_SRC" +rm -rf "$libnetfilter_queue_name" +tar xf "$libnetfilter_queue_tar" +mkdir "$libnetfilter_queue_name/builddir" +cd "$libnetfilter_queue_name/builddir" +../configure \ + --enable-static \ + --host="$CROSS_TRIPLET" \ + --prefix="$CROSS_USR" +make +make install