Merge pull request #27 from apple1417/master #54
This file contains 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: {} | |
pull_request: {} | |
workflow_dispatch: | |
inputs: | |
new-release-tag: | |
description: > | |
New Release Tag. If given, creates a (draft) full release using the given tag, if empty, | |
updates the dev release. | |
type: string | |
required: false | |
env: | |
# Important to pin the clang version, cause we also use it for linting | |
CLANG_VERSION: 17 | |
CLANG_TIDY_JOBS: 4 | |
# LLVM MinGW download | |
LLVM_MINGW_VERSION: llvm-mingw-20231128-msvcrt-ubuntu-20.04-x86_64 | |
LLVM_MINGW_DOWNLOAD: https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-msvcrt-ubuntu-20.04-x86_64.tar.xz | |
# xwin settings | |
XWIN_VERSION: xwin-0.5.0-x86_64-unknown-linux-musl | |
XWIN_DOWNLOAD: https://github.com/Jake-Shadle/xwin/releases/download/0.5.0/xwin-0.5.0-x86_64-unknown-linux-musl.tar.gz | |
# Python settings | |
PYTHON_VERSION: "3.12.3" | |
jobs: | |
cache-clang: | |
runs-on: windows-latest | |
steps: | |
- name: Cache Clang | |
uses: actions/cache@v4 | |
id: cache-clang | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
lookup-only: true | |
- name: Setup Clang | |
if: steps.cache-clang.outputs.cache-hit != 'true' | |
uses: egor-tensin/setup-clang@v1 | |
with: | |
version: ${{ env.CLANG_VERSION }} | |
# ============================================================================== | |
build-windows: | |
runs-on: windows-latest | |
needs: cache-clang | |
strategy: | |
fail-fast: false | |
matrix: | |
preset: | |
- clang-release | |
- msvc-release | |
steps: | |
- name: Restore Clang Cache | |
if: startswith(matrix.preset, 'clang') | |
uses: actions/cache/restore@v4 | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
fail-on-cache-miss: true | |
- name: Add MSVC to PATH | |
if: startswith(matrix.preset, 'msvc') | |
uses: TheMrMilchmann/setup-msvc-dev@v3 | |
with: | |
arch: x64 | |
- name: Setup CMake and Ninja | |
uses: lukka/get-cmake@latest | |
# We only actually need this python version to run the download script, we're not going to link | |
# against it, so don't need to specify arch | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ">=3.11" | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Configure build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: | | |
pip install requests | |
python libs/pyunrealsdk/common_cmake/explicit_python/download.py ` | |
${{ env.PYTHON_VERSION }} ` | |
amd64 ` | |
--no-debug | |
cmake . --preset ${{ matrix.preset }} | |
- name: Build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: cmake --build out/build/${{ matrix.preset }} --target install | |
- name: Prepare Release Zip (dev ci) | |
if: inputs.new-release-tag == '' | |
run: python prepare_release.py ${{ matrix.preset }} --skip-install --no-bl3 --no-wl --unified | |
- name: Prepare Release Zip (draft full) | |
if: inputs.new-release-tag != '' && startswith(matrix.preset, 'msvc') | |
run: | | |
python prepare_release.py ${{ matrix.preset }} --skip-install | |
mv bl3-sdk-${{ matrix.preset }}.zip bl3-sdk.zip | |
mv wl-sdk-${{ matrix.preset }}.zip wl-sdk.zip | |
- name: Upload Artifact | |
if: inputs.new-release-tag == '' || startswith(matrix.preset, 'msvc') | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.preset }} | |
path: "*.zip" | |
build-ubuntu: | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
preset: | |
- clang-cross-release | |
- llvm-mingw-release | |
# Currently, ubuntu-latest is 22.04, whose mingw version is too old, so disabling this build | |
# for now | |
# Not sure of the exact threshold, 13.1.0 works | |
# - mingw-release | |
steps: | |
- name: Setup CMake and Ninja | |
uses: lukka/get-cmake@latest | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ">=3.11" | |
- name: Setup msitools | |
uses: awalsh128/cache-apt-pkgs-action@latest | |
with: | |
packages: msitools | |
version: ${{ runner.os }}-apt | |
# Both Clang and MinGW install quick enough that it's not worth caching | |
# Caching would also lose the +x - so we'd have to tar before caching/untar after, making it | |
# even slower | |
- name: Setup Clang | |
if: startswith(matrix.preset, 'clang') | |
run: | | |
wget https://apt.llvm.org/llvm.sh | |
chmod +x llvm.sh | |
sudo ./llvm.sh ${{ env.CLANG_VERSION }} | |
sudo update-alternatives --install \ | |
/usr/bin/clang \ | |
clang \ | |
/usr/bin/clang-${{ env.CLANG_VERSION }} \ | |
200 | |
sudo update-alternatives --install \ | |
/usr/bin/clang++ \ | |
clang++ \ | |
/usr/bin/clang++-${{ env.CLANG_VERSION }} \ | |
200 | |
sudo update-alternatives --install \ | |
/usr/bin/llvm-rc \ | |
llvm-rc \ | |
/usr/bin/llvm-rc-${{ env.CLANG_VERSION }} \ | |
200 | |
- name: Setup LLVM MinGW | |
if: startswith(matrix.preset, 'llvm-mingw') | |
run: | | |
wget -nv ${{ env.LLVM_MINGW_DOWNLOAD }} | |
tar -xf ${{ env.LLVM_MINGW_VERSION }}.tar.xz -C ~/ | |
echo $(readlink -f ~/${{ env.LLVM_MINGW_VERSION }}/bin) >> $GITHUB_PATH | |
- name: Set up MinGW | |
if: startswith(matrix.preset, 'mingw') | |
uses: egor-tensin/setup-mingw@v2 | |
with: | |
platform: ${{ fromJSON('["x86", "x64"]')[contains(matrix.preset, 'x64')] }} | |
# xwin does take long enough that caching's worth it | |
- name: Restore xwin cache | |
if: contains(matrix.preset, 'cross') | |
uses: actions/cache@v4 | |
id: cache-xwin | |
with: | |
path: ~/xwin | |
key: ${{ runner.os }}-xwin | |
- name: Setup xwin | |
if: contains(matrix.preset, 'cross') && steps.cache-xwin.outputs.cache-hit != 'true' | |
run: | | |
wget -nv ${{ env.XWIN_DOWNLOAD }} | |
tar -xf ${{ env.XWIN_VERSION }}.tar.gz | |
${{ env.XWIN_VERSION }}/xwin \ | |
--accept-license \ | |
--arch x86_64 \ | |
splat \ | |
--include-debug-libs \ | |
--output ~/xwin | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Configure build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: | | |
pip install requests | |
python libs/pyunrealsdk/common_cmake/explicit_python/download.py \ | |
${{ env.PYTHON_VERSION }} \ | |
amd64 \ | |
--no-debug | |
cmake . \ | |
--preset ${{ matrix.preset }} \ | |
-G Ninja \ | |
-DXWIN_DIR=$(readlink -f ~)/xwin | |
# The extra xwin dir arg won't do anything if we're not cross compiling | |
- name: Build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: cmake --build out/build/${{ matrix.preset }} --target install | |
- name: Prepare Release Zip (dev ci) | |
if: inputs.new-release-tag == '' | |
run: python prepare_release.py ${{ matrix.preset }} --skip-install --no-bl3 --no-wl --unified | |
- name: Upload Artifact | |
if: inputs.new-release-tag == '' | |
uses: actions/upload-artifact@v4 | |
with: | |
name: ${{ matrix.preset }} | |
path: "*.zip" | |
# ============================================================================== | |
clang-tidy: | |
runs-on: windows-latest | |
needs: cache-clang | |
strategy: | |
fail-fast: false | |
matrix: | |
preset: | |
- clang-release | |
steps: | |
- name: Restore Clang Cache | |
uses: actions/cache/restore@v4 | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
fail-on-cache-miss: true | |
- name: Setup CMake and Ninja | |
uses: lukka/get-cmake@latest | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ">=3.11" | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Configure build | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
# Also need pyyaml for clang tidy to enable `-export-fixes` | |
run: | | |
pip install pyyaml requests | |
python libs/pyunrealsdk/common_cmake/explicit_python/download.py ` | |
${{ env.PYTHON_VERSION }} ` | |
amd64 ` | |
--no-debug | |
cmake . --preset ${{ matrix.preset }} -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On | |
(Get-Content "out\build\${{ matrix.preset }}\compile_commands.json") ` | |
-replace "@CMakeFiles.+?\.modmap", "" ` | |
| Set-Content ` | |
-Path "out\build\${{ matrix.preset }}\compile_commands.json" | |
- name: Run clang-tidy | |
working-directory: ${{ env.GITHUB_WORKSPACE }} | |
run: | | |
python (Get-Command run-clang-tidy).Source ` | |
-j ${{ env.CLANG_TIDY_JOBS }} ` | |
-p "out\build\${{ matrix.preset }}" ` | |
-export-fixes clang-tidy-fixes.yml ` | |
$([Regex]::Escape("$pwd\src") + ".+\.(c|cpp|h|hpp)$") ` | |
-extra-arg="-Wno-unknown-pragmas" | |
# For some reason, the above started giving unknown pragma errors in library headers (both | |
# unrealsdk and python) in clang-tidy 17 | |
# It compiles fine, doesn't show up in clangd, and doesn't happen in the unrealsdk build, so | |
# just suppressing it for now | |
- name: Process clang-tidy warnings | |
uses: asarium/clang-tidy-action@v1 | |
with: | |
fixesFile: clang-tidy-fixes.yml | |
clang-format: | |
runs-on: windows-latest | |
needs: cache-clang | |
steps: | |
- name: Restore Clang Cache | |
uses: actions/cache/restore@v4 | |
with: | |
path: C:\Program Files\LLVM | |
key: ${{ runner.os }}-clang-${{ env.CLANG_VERSION }} | |
fail-on-cache-miss: true | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Run clang-format | |
run: | | |
clang-format ` | |
-n -Werror ` | |
$(Get-ChildItem ` | |
src ` | |
-File ` | |
-Recurse ` | |
-Include ("*.c", "*.cpp", "*.h", "*.hpp") ` | |
| % FullName) | |
spelling: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Check spelling | |
uses: crate-ci/typos@master | |
pyright: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository and submodules | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Run pyright | |
uses: jakebailey/pyright-action@v2 | |
with: | |
pylance-version: latest-release | |
working-directory: "./src/" | |
ruff: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Run Ruff Linting | |
uses: chartboost/ruff-action@v1 | |
with: | |
src: ./src | |
- name: Run Ruff Formatting | |
uses: chartboost/ruff-action@v1 | |
with: | |
src: ./src | |
args: format --check | |
# ============================================================================== | |
release-dev-ci: | |
runs-on: ubuntu-latest | |
if: > | |
github.ref == 'refs/heads/master' | |
&& github.repository == 'bl-sdk/oak-mod-manager' | |
&& inputs.new-release-tag == '' | |
needs: | |
- build-ubuntu | |
- build-windows | |
- clang-tidy | |
- clang-format | |
- spelling | |
- pyright | |
- ruff | |
permissions: | |
contents: write | |
steps: | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
- name: Upload releases | |
uses: andelf/nightly-release@main | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
tag_name: nightly | |
files: "*/*.zip" | |
name: Automated Development Release | |
prerelease: true | |
body: > | |
This release is automatically built from the latest passing commits on master - it might | |
break things. Only use this if you know what you're doing. | |
release-draft-full: | |
runs-on: ubuntu-latest | |
if: > | |
github.ref == 'refs/heads/master' | |
&& github.repository == 'bl-sdk/oak-mod-manager' | |
&& inputs.new-release-tag != '' | |
needs: | |
- build-ubuntu | |
- build-windows | |
- clang-tidy | |
- clang-format | |
- spelling | |
- pyright | |
- ruff | |
permissions: | |
contents: write | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
- name: Create new release tag | |
uses: rickstaa/action-create-tag@v1 | |
with: | |
tag: ${{ inputs.new-release-tag }} | |
- name: Upload releases | |
uses: softprops/action-gh-release@v1 | |
with: | |
tag_name: ${{ inputs.new-release-tag }} | |
files: "*/*.zip" | |
fail_on_unmatched_files: true | |
draft: true | |
generate_release_notes: true |