ci: enhance CI workflow with Windows support, improved LLVM installat… #8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| branches: [main] | |
| workflow_dispatch: | |
| env: | |
| LLVM_VERSION: "20" | |
| LLVM_RELEASE: "20.1.8" | |
| BUILD_DIR: build | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| jobs: | |
| build-and-test: | |
| name: Linux — build & test | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install LLVM ${{ env.LLVM_VERSION }} | |
| run: | | |
| set -eux | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends ca-certificates curl gnupg | |
| curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key \ | |
| | sudo gpg --dearmor -o /etc/apt/keyrings/llvm.gpg | |
| echo "deb [signed-by=/etc/apt/keyrings/llvm.gpg] http://apt.llvm.org/noble/ llvm-toolchain-noble-${LLVM_VERSION} main" \ | |
| | sudo tee /etc/apt/sources.list.d/llvm.list | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends \ | |
| llvm-${LLVM_VERSION}-dev \ | |
| clang-${LLVM_VERSION} \ | |
| llvm-${LLVM_VERSION}-tools \ | |
| ninja-build | |
| - name: Configure | |
| run: | | |
| cmake -B "$BUILD_DIR" -G Ninja \ | |
| -DLLVM_DIR=/usr/lib/llvm-${LLVM_VERSION}/lib/cmake/llvm \ | |
| -DCMAKE_BUILD_TYPE=Release | |
| - name: Build | |
| run: cmake --build "$BUILD_DIR" | |
| - name: Upload plugin (Linux) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: obfuscator-linux | |
| path: ${{ env.BUILD_DIR }}/passes/obfuscator.so | |
| - name: Behavioral tests | |
| run: ./tests/run_tests.sh | |
| - name: IR tests (FileCheck) | |
| run: ./tests/run_ir_tests.sh | |
| windows-plugin: | |
| name: Windows — plugin DLL (MSVC + official LLVM) | |
| runs-on: windows-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Download LLVM ${{ env.LLVM_RELEASE }} (prebuilt) | |
| shell: pwsh | |
| env: | |
| LLVM_TAR_URL: https://github.com/llvm/llvm-project/releases/download/llvmorg-${{ env.LLVM_RELEASE }}/clang+llvm-${{ env.LLVM_RELEASE }}-x86_64-pc-windows-msvc.tar.xz | |
| run: | | |
| Invoke-WebRequest -Uri $env:LLVM_TAR_URL -OutFile llvm.tar.xz | |
| - name: Extract LLVM | |
| shell: pwsh | |
| run: | | |
| tar -xf llvm.tar.xz | |
| $root = Get-ChildItem -Directory | Where-Object { $_.Name -like 'clang+llvm-*' } | Select-Object -First 1 | |
| if (-not $root) { throw "Could not find extracted clang+llvm-* directory" } | |
| $llvmDir = Join-Path $root.FullName "lib\cmake\llvm" | |
| if (-not (Test-Path (Join-Path $llvmDir "LLVMConfig.cmake"))) { | |
| throw "LLVMConfig.cmake not found under $llvmDir" | |
| } | |
| "LLVM_ROOT=$($root.FullName)" | Out-File -FilePath $env:GITHUB_ENV -Append | |
| "LLVM_DIR=$llvmDir" | Out-File -FilePath $env:GITHUB_ENV -Append | |
| - name: Install Ninja | |
| run: choco install ninja -y | |
| - uses: ilammy/msvc-dev-cmd@v1 | |
| with: | |
| arch: x64 | |
| - name: Configure & build | |
| shell: pwsh | |
| run: | | |
| cmake -B $env:BUILD_DIR -G Ninja ` | |
| -DCMAKE_BUILD_TYPE=Release ` | |
| "-DLLVM_DIR=$env:LLVM_DIR" ` | |
| -DCMAKE_C_COMPILER=cl ` | |
| -DCMAKE_CXX_COMPILER=cl | |
| cmake --build $env:BUILD_DIR | |
| - name: List build/passes (debug) | |
| if: always() | |
| shell: pwsh | |
| run: Get-ChildItem -Path "$env:BUILD_DIR/passes" -Recurse -ErrorAction SilentlyContinue | |
| - name: Upload plugin (Windows) | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: obfuscator-windows-msvc | |
| path: build/passes/obfuscator.dll | |
| if-no-files-found: warn | |
| lint: | |
| name: clang-tidy | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install LLVM ${{ env.LLVM_VERSION }} & clang-tidy | |
| run: | | |
| set -eux | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends ca-certificates curl gnupg | |
| curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key \ | |
| | sudo gpg --dearmor -o /etc/apt/keyrings/llvm.gpg | |
| echo "deb [signed-by=/etc/apt/keyrings/llvm.gpg] http://apt.llvm.org/noble/ llvm-toolchain-noble-${LLVM_VERSION} main" \ | |
| | sudo tee /etc/apt/sources.list.d/llvm.list | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends \ | |
| llvm-${LLVM_VERSION}-dev \ | |
| clang-${LLVM_VERSION} \ | |
| clang-tidy-${LLVM_VERSION} \ | |
| ninja-build | |
| - name: Configure (compile_commands.json) | |
| run: | | |
| cmake -B "$BUILD_DIR" -G Ninja \ | |
| -DLLVM_DIR=/usr/lib/llvm-${LLVM_VERSION}/lib/cmake/llvm \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DCMAKE_EXPORT_COMPILE_COMMANDS=ON | |
| - name: Run clang-tidy | |
| run: | | |
| clang-tidy-${LLVM_VERSION} \ | |
| -p "$BUILD_DIR" \ | |
| --warnings-as-errors='*' \ | |
| passes/src/*.cpp | |
| format: | |
| name: clang-format | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install clang-format | |
| run: | | |
| set -eux | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends ca-certificates curl gnupg | |
| curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key \ | |
| | sudo gpg --dearmor -o /etc/apt/keyrings/llvm.gpg | |
| echo "deb [signed-by=/etc/apt/keyrings/llvm.gpg] http://apt.llvm.org/noble/ llvm-toolchain-noble-${LLVM_VERSION} main" \ | |
| | sudo tee /etc/apt/sources.list.d/llvm.list | |
| sudo apt-get update | |
| sudo apt-get install -y --no-install-recommends clang-format-${LLVM_VERSION} | |
| - name: Check formatting | |
| run: | | |
| find passes/src passes/include \( -name '*.cpp' -o -name '*.h' \) \ | |
| | xargs clang-format-${LLVM_VERSION} --dry-run --Werror |