mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-22 17:24:48 -05:00
fd263d3755
Even in a successful LibWeb test run, on Linux, we currently always have LSAN output. Causing this step to fail is currently making every run of CI fail. If LibWeb tests did fail, they should exit with a non-zero status code on their own, causing the pipeline to fail.
221 lines
9 KiB
YAML
221 lines
9 KiB
YAML
name: Lagom Template
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
toolchain:
|
|
required: true
|
|
type: string
|
|
os_name:
|
|
required: true
|
|
type: string
|
|
os:
|
|
required: true
|
|
type: string
|
|
fuzzer:
|
|
required: false
|
|
type: string
|
|
default: 'NO_FUZZ'
|
|
clang_plugins:
|
|
required: false
|
|
type: boolean
|
|
default: false
|
|
|
|
env:
|
|
# runner.workspace = /home/runner/work/ladybird
|
|
# github.workspace = /home/runner/work/ladybird/ladybird
|
|
LADYBIRD_SOURCE_DIR: ${{ github.workspace }}
|
|
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
|
VCPKG_ROOT: ${{ github.workspace }}/Build/vcpkg
|
|
VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
|
|
|
|
# Use the compiler version for the ccache compiler hash. Otherwise, if plugins are enabled, the plugin .so files
|
|
# are included in the hash. This results in clean builds on every run as the .so files are rebuilt.
|
|
#
|
|
# Note: This only works because our plugins do not transform any code. If that becomes untrue, we must revisit this.
|
|
CCACHE_COMPILERCHECK: "%compiler% -v"
|
|
|
|
jobs:
|
|
CI:
|
|
runs-on: ${{ inputs.os }}
|
|
|
|
steps:
|
|
# Pull requests can trail behind `master` and can cause breakage if merging before running the CI checks on an updated branch.
|
|
# Luckily, GitHub creates and maintains a merge branch that is updated whenever the target or source branch is modified. By
|
|
# checking this branch out, we gain a stabler `master` at the cost of reproducibility.
|
|
- uses: actions/checkout@v4
|
|
if: ${{ github.event_name != 'pull_request' }}
|
|
|
|
- uses: actions/checkout@v4
|
|
if: ${{ github.event_name == 'pull_request' }}
|
|
with:
|
|
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
|
|
|
- name: Set Up Environment
|
|
uses: ./.github/actions/setup
|
|
with:
|
|
os: ${{ inputs.os_name }}
|
|
arch: 'Lagom'
|
|
|
|
# === PREPARE FOR BUILDING ===
|
|
|
|
- name: Assign Build Parameters
|
|
id: 'build-parameters'
|
|
run: |
|
|
if ${{ inputs.os_name == 'Linux' }} ; then
|
|
if ${{ inputs.toolchain == 'Clang' }} ; then
|
|
echo "host_cc=clang-18" >> "$GITHUB_OUTPUT"
|
|
echo "host_cxx=clang++-18" >> "$GITHUB_OUTPUT"
|
|
elif ${{ inputs.toolchain == 'GNU' }} ; then
|
|
echo "host_cc=gcc-13" >> "$GITHUB_OUTPUT"
|
|
echo "host_cxx=g++-13" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
elif ${{ inputs.os_name == 'macOS' }} ; then
|
|
echo "host_cc=$(xcrun --find clang)" >> "$GITHUB_OUTPUT"
|
|
echo "host_cxx=$(xcrun --find clang++)" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
if ${{ inputs.clang_plugins }} ; then
|
|
echo "ccache_key=${{ inputs.fuzzer }}-CLANG_PLUGINS" >> "$GITHUB_OUTPUT"
|
|
echo "cmake_options=-DENABLE_CLANG_PLUGINS=ON" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "ccache_key=${{ inputs.fuzzer }}" >> "$GITHUB_OUTPUT"
|
|
echo "cmake_options=" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
- name: Restore Caches
|
|
uses: ./.github/actions/cache-restore
|
|
id: 'cache-restore'
|
|
with:
|
|
os: ${{ inputs.os_name }}
|
|
arch: 'Lagom'
|
|
toolchain: ${{ inputs.toolchain }}
|
|
cache_key_extra: ${{ steps.build-parameters.outputs.ccache_key }}
|
|
ccache_path: ${{ env.CCACHE_DIR }}
|
|
download_cache_path: ${{ github.workspace }}/Build/caches
|
|
|
|
- name: Set dynamic environment variables
|
|
run: |
|
|
# Note: Required for vcpkg to use this compiler for its own builds.
|
|
echo "CC=${{ steps.build-parameters.outputs.host_cc }}" >> "$GITHUB_ENV"
|
|
echo "CXX=${{ steps.build-parameters.outputs.host_cxx }}" >> "$GITHUB_ENV"
|
|
|
|
# https://github.com/actions/runner-images/issues/9330
|
|
- name: Enable Microphone Access (macOS 14)
|
|
if: ${{ inputs.os_name == 'macOS' }}
|
|
run: sqlite3 $HOME/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT OR IGNORE INTO access VALUES ('kTCCServiceMicrophone','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159,NULL,NULL,'UNUSED',1687786159);"
|
|
|
|
- name: Create Build Environment
|
|
if: ${{ inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}
|
|
run: |
|
|
cmake --preset Sanitizer_CI -B Build \
|
|
-DINCLUDE_WASM_SPEC_TESTS=ON \
|
|
-DWASM_SPEC_TEST_SKIP_FORMATTING=ON \
|
|
${{ steps.build-parameters.outputs.cmake_options }} \
|
|
-DPython3_EXECUTABLE=${{ env.pythonLocation }}/bin/python \
|
|
-DCMAKE_C_COMPILER=${{ steps.build-parameters.outputs.host_cc }} \
|
|
-DCMAKE_CXX_COMPILER=${{ steps.build-parameters.outputs.host_cxx }}
|
|
|
|
- name: Create Build Environment
|
|
if: ${{ inputs.fuzzer == 'FUZZ' }}
|
|
working-directory: ${{ github.workspace }}
|
|
run: |
|
|
set -e
|
|
|
|
cmake --preset=CI -S Meta/Lagom -B ${{ github.workspace }}/Build/tools-build \
|
|
-DLAGOM_TOOLS_ONLY=ON \
|
|
-DINSTALL_LAGOM_TOOLS=ON \
|
|
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/Build/tools-install \
|
|
-DPython3_EXECUTABLE=${{ env.pythonLocation }}/bin/python \
|
|
-DCMAKE_C_COMPILER=gcc-13 \
|
|
-DCMAKE_CXX_COMPILER=g++-13 \
|
|
-Dpackage=LagomTools
|
|
|
|
ninja -C ${{ github.workspace }}/Build/tools-build install
|
|
|
|
cmake --preset Fuzzers_CI -B Build \
|
|
-DPython3_EXECUTABLE=${{ env.pythonLocation }}/bin/python \
|
|
-DCMAKE_C_COMPILER=${{ steps.build-parameters.outputs.host_cc }} \
|
|
-DCMAKE_CXX_COMPILER=${{ steps.build-parameters.outputs.host_cxx }} \
|
|
-DCMAKE_PREFIX_PATH=${{ github.workspace }}/Build/tools-install
|
|
|
|
# === BUILD ===
|
|
|
|
- name: Build
|
|
working-directory: ${{ github.workspace }}/Build
|
|
run: |
|
|
set -e
|
|
cmake --build .
|
|
cmake --install . --strip --prefix ${{ github.workspace }}/Install
|
|
|
|
- name: Enable the Ladybird Qt chrome
|
|
if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}
|
|
run: cmake -B Build -DENABLE_QT=ON
|
|
|
|
- name: Build the Ladybird Qt chrome
|
|
if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}/Build
|
|
run: cmake --build .
|
|
|
|
- name: Enable the AppKit chrome with Swift files
|
|
if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}
|
|
# FIXME: Don't force release build after https://github.com/LadybirdBrowser/ladybird/issues/1101 is fixed
|
|
run: cmake -B Build -DENABLE_QT=OFF -DENABLE_SWIFT=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
|
|
|
- name: Build the AppKit chrome with Swift files
|
|
if: ${{ inputs.os_name == 'macOS' && inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}/Build
|
|
run: cmake --build .
|
|
|
|
- name: Save Caches
|
|
uses: ./.github/actions/cache-save
|
|
with:
|
|
arch: 'Lagom'
|
|
ccache_path: ${{ env.CCACHE_DIR }}
|
|
ccache_primary_key: ${{ steps.cache-restore.outputs.ccache_primary_key }}
|
|
|
|
# === TEST ===
|
|
|
|
- name: Test
|
|
if: ${{ inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}
|
|
run: ctest --preset Sanitizer --output-on-failure --test-dir Build --timeout 1800
|
|
env:
|
|
TESTS_ONLY: 1
|
|
# NOTE: These are appended to the preset's options.
|
|
ASAN_OPTIONS: 'log_path=${{ github.workspace }}/asan.log'
|
|
UBSAN_OPTIONS: 'log_path=${{ github.workspace }}/ubsan.log'
|
|
|
|
- name: Upload LibWeb Test Artifacts
|
|
if: ${{ always() && inputs.fuzzer == 'NO_FUZZ' }}
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: libweb-test-artifacts-${{ inputs.os_name }}-${{inputs.fuzzer}}-${{inputs.toolchain}}-${{inputs.clang-plugins}}
|
|
path: ${{ github.workspace }}/Build/UI/Headless/test-dumps
|
|
retention-days: 0
|
|
if-no-files-found: ignore
|
|
|
|
- name: Sanitizer Output
|
|
if: ${{ !cancelled() && inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}
|
|
run: |
|
|
log_output=$(find . -maxdepth 1 \( -name 'asan.log.*' -o -name 'ubsan.log.*' \) -exec cat {} \; )
|
|
if [ -z "$log_output" ]; then
|
|
echo "No sanitizer issues found."
|
|
else
|
|
echo "$log_output"
|
|
echo "Sanitizer errors happened while running tests; see the Test step above."
|
|
fi
|
|
|
|
- name: Lints
|
|
if: ${{ inputs.os_name == 'Linux' && inputs.fuzzer == 'NO_FUZZ' }}
|
|
working-directory: ${{ github.workspace }}
|
|
run: |
|
|
set -e
|
|
git ls-files '*.ipc' | xargs ./Build/bin/IPCMagicLinter
|
|
env:
|
|
ASAN_OPTIONS: 'strict_string_checks=1:check_initialization_order=1:strict_init_order=1:detect_stack_use_after_return=1:allocator_may_return_null=1'
|
|
UBSAN_OPTIONS: 'print_stacktrace=1:print_summary=1:halt_on_error=1'
|