packetvisor 1.0.1

Packetvisor is a Raw Packet I/O framework based on the Rust language. It can process packets much faster than Standard Sockets through the Linux Kernel's eXpress Data Path(XDP).
Documentation
name: build and release

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]*'

concurrency:
  group: ${{ github.workflow }}-${{ github.event.after }}
  cancel-in-progress: true

env:
  # https://github.com/llvm/llvm-project/releases/tag/llvmorg-15.0.0
  LLVM_URL_PREFIX: https://github.com/llvm/llvm-project/releases/download/llvmorg-15.0.0
  LLVM_arm64: clang+llvm-15.0.0-aarch64-linux-gnu
  LLVM_amd64: clang+llvm-15.0.0-x86_64-linux-gnu-rhel-8.4

jobs:
  build:
    name: Build static bpftool binary
    runs-on: ubuntu-22.04
    env:
      TARGETARCH: ${{ matrix.arch }}
      FILE_STRING_ARCH_amd64: x86-64
      FILE_STRING_ARCH_arm64: aarch64
    strategy:
      matrix:
        arch: [arm64, amd64]

    steps:
      # amd64 needs the dependencies to build bpftool
      - name: Install dependencies (amd64)
        if: matrix.arch == 'amd64'
        run: |
          sudo apt-get update
          sudo apt-get install -y libelf-dev libcap-dev

      - name: Download and extract compiled LLVM release
        env:
          LLVM: ${{ env[format('LLVM_{0}', matrix.arch)] }}
        run: |
          curl -L -O "${{ env.LLVM_URL_PREFIX}}/${{ env.LLVM }}.tar.xz"
          tar -xvf "${{ env.LLVM }}.tar.xz"

      - name: Checkout bpftool code
        uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0
        with:
          submodules: recursive
          # Create a new directory to avoid wiping out LLVM on bpftool checkout
          path: 'bpftool'

      - name: Build static bpftool natively for amd64
        if: matrix.arch == 'amd64'
        working-directory: 'bpftool'
        env:
          LLVM_PATH: ${{ env[format('LLVM_{0}', matrix.arch)] }}
        run: |
          EXTRA_CFLAGS=--static \
              LLVM_CONFIG="${GITHUB_WORKSPACE}/${{ env.LLVM_PATH }}/bin/llvm-config" \
              LLVM_STRIP="${GITHUB_WORKSPACE}/${{ env.LLVM_PATH }}/bin/llvm-strip" \
              HOSTAR="${GITHUB_WORKSPACE}/${{ env.LLVM_PATH }}/bin/llvm-ar" \
              make -j -C src V=1
          strip src/bpftool

      - name: Set up QEMU
        uses: docker/setup-qemu-action@e81a89b1732b9c48d79cd809d8d81d79c4647a18 # v2.1.0
        if: matrix.arch == 'arm64'
        with:
          platforms: arm64

      # The emulated build leverages Docker and Ubuntu 22.04 container image
      # distribution to have all the needed arm64 packages.
      - name: Build static bpftool for arm64 with emulation
        if: matrix.arch == 'arm64'
        env:
          LLVM_PATH: ${{ env[format('LLVM_{0}', matrix.arch)] }}
        run:  |
          docker run --platform linux/arm64 --rm -v $(pwd):/build ubuntu:22.04 \
          bash -c "apt-get update && \
                   apt-get install -y make pkg-config gcc \
                       libelf-dev libcap-dev libstdc++-11-dev zlib1g-dev && \
                   cd /build/bpftool && \
                   EXTRA_CFLAGS=--static \
                       LLVM_CONFIG='/build/${{ env.LLVM_PATH }}/bin/llvm-config' \
                       LLVM_STRIP='/build/${{ env.LLVM_PATH }}/bin/llvm-strip' \
                       CLANG='/build/${{ env.LLVM_PATH }}/bin/clang' \
                       make -j -C src V=1 && \
                   strip src/bpftool"

      - name: Test bpftool binary
        working-directory: 'bpftool/src'
        env:
          ARCH: ${{ env[format('FILE_STRING_ARCH_{0}', matrix.arch)] }}
        run: |
          file ./bpftool | \
              tee /dev/stderr | \
              grep -q "${{ env.ARCH }}"
          ./bpftool 2>&1 | grep -q Usage
          ./bpftool -p version | \
              tee /dev/stderr | \
              jq --exit-status ".features | .llvm and .skeletons"
          ldd ./bpftool 2>&1 | \
              tee /dev/stderr | \
              grep -q 'not a dynamic executable'

      - name: Upload Artifact
        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
        with:
          name: ${{ format('bpftool_{0}', matrix.arch) }}
          path: bpftool/src/bpftool

  draft-release:
    name: Create a draft release
    runs-on: ubuntu-22.04
    needs: build
    permissions:
      contents: write
    steps:
      - name: Download artifacts from build
        uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2

      - name: Rename binaries and compress
        run: |
          archive_amd64="bpftool-${{ github.ref_name }}-amd64.tar.gz"
          archive_arm64="bpftool-${{ github.ref_name }}-arm64.tar.gz"
          tar -C bpftool_amd64 -I 'gzip -9' -cvf "${archive_amd64}" bpftool
          tar -C bpftool_arm64 -I 'gzip -9' -cvf "${archive_arm64}" bpftool
          sha256sum "${archive_amd64}" > "${archive_amd64}.sha256sum"
          sha256sum "${archive_arm64}" > "${archive_arm64}.sha256sum"

      - name: Checkout bpftool and libbpf code
        uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0
        with:
          submodules: recursive
          path: 'bpftool'

      - name: Package source code including submodules
        run: |
          rm -rf -- bpftool/.git bpftool/libbpf/.git
          tar -I 'gzip -9' -cvf "bpftool-libbpf-${{ github.ref_name }}-sources.tar.gz" bpftool

      - name: Create draft release and add artifacts
        uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v0.1.15
        with:
          draft: true
          files: bpftool*