C/C++ CI #606
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: C/C++ CI | |
on: | |
push: | |
branches: ['*'] | |
tags: ['*'] | |
paths: | |
- '**' | |
- '!docs/**' | |
- '!.github/**' | |
- '.github/workflows/cppcmake.yml' | |
pull_request: | |
release: | |
types: ['created'] | |
workflow_dispatch: | |
inputs: | |
cmakeextra: | |
description: 'Extra CMake options' | |
required: false | |
default: '' | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
cancel-in-progress: true | |
defaults: | |
run: | |
shell: bash | |
jobs: | |
build: | |
name: ${{ matrix.config.name }} | |
runs-on: ${{ matrix.config.os }} | |
strategy: | |
fail-fast: false | |
matrix: | |
config: | |
- {name: "ubuntu-20.04", os: "ubuntu-20.04", cmake_extra: "-DLSL_BUNDLED_PUGIXML=OFF"} | |
- {name: "ubuntu-22.04", os: "ubuntu-22.04", cmake_extra: "-DLSL_BUNDLED_PUGIXML=OFF" } | |
- {name: "windows-x64", os: "windows-latest", cmake_extra: "-T v142,host=x86"} | |
- {name: "windows-32", os: "windows-latest", cmake_extra: "-T v142,host=x86 -A Win32"} | |
- {name: "macOS-latest", os: "macOS-latest"} | |
# runs all steps in the container configured in config.docker or as subprocesses when empty | |
container: ${{ matrix.config.docker }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: set up build environment in container | |
run: | | |
set -x | |
apt update | |
apt install -y --no-install-recommends g++ git ninja-build file dpkg-dev lsb-release sudo curl cmake libpugixml-dev | |
if: ${{ matrix.config.docker }} | |
- name: Configure CMake | |
run: | | |
if [[ "${{ matrix.config.name }}" = ubuntu-2* ]]; then | |
sudo apt-get install -y --no-install-recommends libpugixml-dev | |
fi | |
cmake --version | |
cmake -S . -B build \ | |
-DCMAKE_BUILD_TYPE=Release \ | |
-DCMAKE_INSTALL_PREFIX=${PWD}/install \ | |
-DLSL_UNITTESTS=ON \ | |
-DLSL_BENCHMARKS=ON \ | |
-DLSL_BUILD_EXAMPLES=ON \ | |
-DCPACK_PACKAGE_DIRECTORY=${PWD}/package \ | |
-Dlslgitrevision=${{ github.sha }} \ | |
-Dlslgitbranch=${{ github.ref }} \ | |
${{ matrix.config.cmake_extra }} \ | |
${{ github.event.inputs.cmakeextra }} | |
echo ${PWD} | |
- name: make | |
run: cmake --build build --target install --config Release -j | |
- name: package | |
run: | | |
echo $GITHUB_REF | |
cmake --build build --target package --config Release -j | |
echo $PWD | |
ls -la | |
# On Debian / Ubuntu the dependencies can only be resolved for | |
# already installed packages. Therefore, we have built all | |
# packages without dependencies in the previous step, | |
# install them and rebuild them with dependency discovery enabled | |
if [[ "${{ matrix.config.os }}" == ubuntu-* ]]; then | |
cmake -DCPACK_DEBIAN_PACKAGE_SHLIBDEPS=ON . | |
sudo dpkg -i package/*.deb | |
cmake --build build --target package --config Release -j | |
dpkg -I package/liblsl*.deb | |
fi | |
cmake -E remove_directory package/_CPack_Packages | |
cp testing/lslcfgs/default.cfg . | |
- name: upload install dir | |
uses: actions/upload-artifact@master | |
with: | |
name: build-${{ matrix.config.name }} | |
path: install | |
- name: upload package | |
uses: actions/upload-artifact@master | |
with: | |
name: pkg-${{ matrix.config.name }} | |
path: package | |
- name: print network config | |
run: | | |
which ifconfig && ifconfig | |
if [ `which ip` ]; then | |
ip link | |
ip addr | |
ip route | |
ip -6 route | |
fi | |
# run internal tests, ignore test failures on docker (missing IPv6 connectivity) | |
- name: unit tests | |
run: | | |
if [[ "${{ matrix.config.name }}" = ubuntu-2* ]]; then | |
ulimit -c unlimited | |
echo "$PWD/dumps/corefile-%e-%p-%t" | sudo tee /proc/sys/kernel/core_pattern | |
fi | |
mkdir -p dumps | |
install/bin/lsl_test_internal --order rand --wait-for-keypress never --durations yes || test ! -z "${{ matrix.config.docker }}" | |
install/bin/lsl_test_exported --order rand --wait-for-keypress never --durations yes | |
timeout-minutes: 10 | |
- name: upload dump | |
if: failure() | |
uses: actions/upload-artifact@master | |
with: | |
name: dumps-${{ matrix.config.name }} | |
path: dumps | |
- name: upload to release page | |
if: github.event_name == 'release' | |
env: | |
TOKEN: "token ${{ secrets.GITHUB_TOKEN }}" | |
TAG: ${{ github.event.release.tag_name }} | |
UPLOAD_URL: ${{ github.event.release.upload_url }} | |
run: | | |
# Do try this at home! The REST API is documented at | |
# https://docs.github.com/en/free-pro-team@latest/rest and you can get a personal | |
# access token at https://github.com/settings/tokens | |
# (set TOKEN to "bearer abcdef1234") | |
# you can get the UPLOAD_URL with a short bash snippet; make sure to set the env var TAG: | |
# UPLOAD_URL=$(curl -H 'Accept: application/vnd.github.v3+json' $GITHUB_API_URL/repos/$GITHUB_REPOSITORY/releases/tags/$TAG | jq -r .upload_url) | |
UPLOAD_URL=${UPLOAD_URL%\{*} # remove "{name,label}" suffix | |
for pkg in package/*.*; do | |
NAME=$(basename $pkg) | |
MIME=$(file --mime-type $pkg|cut -d ' ' -f2) | |
curl -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: $TOKEN" -H "Content-Type: $MIME" --data-binary @$pkg $UPLOAD_URL?name=$NAME | |
done |