Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
6f2f93adaThis file is pinned to the selected release. Download the original to open it in your design tool.
name: CI
on: [push, pull_request]
env:
CI_BRANCH_NAME: ${{ github.ref }}
# Specify build author as an environment variable because on Apple Silicon
# build_librepcb.sh is run locally where we want to use a different author.
LIBREPCB_BUILD_AUTHOR: "LibrePCB CI"
# Configure ccache.
CCACHE_MAXSIZE: 1G
# Incremental builds make no sense on CI -> disable it to avoid creating
# additional build artifacts.
CARGO_INCREMENTAL: 0
jobs:
stylecheck:
name: Stylecheck
runs-on: ubuntu-24.04
container: librepcb/librepcb-dev:devtools-7
steps:
- uses: actions/checkout@v6
with:
clean: true
submodules: recursive
- name: Print Environment
run: ./ci/print_environment.sh
# https://github.com/actions/checkout/issues/1048
- name: Fix Git Permissions
run: git config --global --add safe.directory $GITHUB_WORKSPACE
- name: Run Stylecheck
run: ./ci/stylecheck.sh
- name: Build Translations
run: python3 ./dev/i18n.py --update --translate
- name: Check EditorCommandSet
run: python3 ./dev/generate_editorcommandset.py --check
- name: Find Unused Code
run: python3 ./dev/find_unused_code.py
doxygen:
name: Doxygen
runs-on: ubuntu-24.04
container: librepcb/librepcb-dev:devtools-7
steps:
- uses: actions/checkout@v6
# https://github.com/actions/checkout/issues/1048
- name: Fix Git Permissions
run: git config --global --add safe.directory $GITHUB_WORKSPACE
- name: Build Documentation
run: ./ci/build_doxygen.sh
- name: Tar & Upload Artifacts
if: ${{ success() && (github.event_name == 'push') && env.UPLOAD_URL }}
run: |
./ci/tar_artifacts.sh
./ci/upload_artifacts.sh
env:
UPLOAD_URL: ${{ secrets.UPLOAD_URL }}
UPLOAD_USER: ${{ secrets.UPLOAD_USER }}
UPLOAD_PASS: ${{ secrets.UPLOAD_PASS }}
UPLOAD_SIGN_KEY: ${{ secrets.UPLOAD_SIGN_KEY }}
windows-x64:
name: Windows x86_64
runs-on: windows-2025
env:
# Docker image tag: windowsservercore-ltsc2025-qt6.10-64bit-1
# Using digest for easier verification of the transparent build chain.
# https://github.com/LibrePCB/docker-librepcb-dev/actions/runs/20745227440/job/59560845499
IMAGE_DIGEST: f78cc56d8c863317e44d20ab5a14080e20c0f13af8cab20533d2a6437a2437c9
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
# Workaround for spurious job failures due to Docker error.
# https://github.com/actions/runner-images/issues/13729
- name: Start Docker Service
run: |
$dockerState = Get-Service -Name "docker"
if ($dockerState.Status -ne "Running") {
Start-Service -Name "docker"
}
- name: Start Docker Container
run: >
docker run -d -t --name ci -w C:/work
-v ${{ github.workspace }}:C:/work
-e OS="windows"
-e ARCH="x86_64"
-e CI_BRANCH_NAME="${{ env.CI_BRANCH_NAME }}"
-e CCACHE_DIR="C:/work/build/.ccache-dir"
-e CCACHE_MAXSIZE="${{ env.CCACHE_MAXSIZE }}"
-e CARGO_HOME="C:/work/build/.cargo-home"
-e CARGO_INCREMENTAL="${{ env.CARGO_INCREMENTAL }}"
-e LIBREPCB_BUILD_AUTHOR="${{ env.LIBREPCB_BUILD_AUTHOR }}"
"ghcr.io/librepcb/docker-librepcb-dev@sha256:${{ env.IMAGE_DIGEST }}"
- name: Print Environment
run: docker exec ci bash ./ci/print_environment.sh
- name: Install Dependencies
run: >
docker exec
-e SLINT_UI_TESTING_AUTH="${{ secrets.SLINT_UI_TESTING_AUTH }}"
ci bash ./ci/install_dependencies.sh
# caching --->
- name: Cache .ccache
uses: actions/cache@v4
with:
key: ${{ github.job }}-${{ github.ref }}
restore-keys: ${{ github.job }}-refs/heads/master
path: build/.ccache-dir
- name: Cache .cargo
uses: actions/cache@v4
with:
key: ${{ github.job }}-${{ hashFiles('libs/librepcb/**/Cargo.lock') }}-${{ github.ref }}
restore-keys: ${{ github.job }}-${{ hashFiles('libs/librepcb/**/Cargo.lock') }}-refs/heads/master
path: |
./build/.cargo-home/bin/
./build/.cargo-home/registry/index/
./build/.cargo-home/registry/cache/
./build/.cargo-home/git/db/
./build/cargo/
./libs/librepcb/rust-core/target/
# <--- caching
- name: Print New Environment # Print again since it has been modified
run: docker exec ci bash ./ci/print_environment.sh
- name: Build LibrePCB
run: docker exec ci bash ./ci/build_librepcb.sh
- name: Build Archive
run: docker exec ci bash ./ci/build_windows_archive.sh
- name: Build Installer
run: docker exec ci bash ./ci/build_windows_installer.sh
- name: Run rust-core tests
run: docker exec -w C:/work/libs/librepcb/rust-core ci cargo test --features=fail-on-warnings
- name: Run LibrePCB Unittests
run: docker exec ci build\\tests\\unittests\\librepcb-unittests.exe
- name: Run LibrePCB-CLI Functional Tests
run: docker exec ci uv --directory ./tests/cli run --no-dev pytest -vvv --librepcb-executable="../../build/install/bin/librepcb-cli.exe"
- name: Run LibrePCB Functional Tests
run: docker exec ci uv --directory ./tests/funq run --no-dev pytest -vvv --librepcb-executable="../../build/install/bin/librepcb.exe" --reruns 5 --reruns-delay 10
- name: Run LibrePCB UI Tests
if: ${{ success() && env.SLINT_UI_TESTING_AUTH }}
run: docker exec ci uv --directory ./tests/ui run --no-dev pytest -vvv --librepcb-executable="../../build/install/bin/librepcb.exe"
env:
SLINT_UI_TESTING_AUTH: ${{ secrets.SLINT_UI_TESTING_AUTH }}
- name: Tar Artifacts
run: docker exec ci bash ./ci/tar_artifacts.sh
- name: Upload Artifacts
if: ${{ success() && (github.event_name == 'push') && env.UPLOAD_URL }}
run: >
docker exec
-e UPLOAD_URL="${{ secrets.UPLOAD_URL }}"
-e UPLOAD_USER="${{ secrets.UPLOAD_USER }}"
-e UPLOAD_PASS="${{ secrets.UPLOAD_PASS }}"
-e UPLOAD_SIGN_KEY="${{ secrets.UPLOAD_SIGN_KEY }}"
ci bash ./ci/upload_artifacts.sh
env:
UPLOAD_URL: ${{ secrets.UPLOAD_URL }} # Required to use it in 'if' condition
- name: Stop Container
if: ${{ always() }}
run: docker stop -t 30 ci
macos-arm64:
name: MacOS ARM64
# Make sure the 'runs-on' really refers to an Apple Silicon CPU:
# https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners
runs-on: macos-14
env:
OS: 'mac'
ARCH: 'arm64'
COPYFILE_DISABLE: 1 # Stop creating shit files (https://superuser.com/questions/259703/get-mac-tar-to-stop-putting-filenames-in-tar-archives)
HOMEBREW_NO_INSTALL_CLEANUP: 1 # Might speed up homebrew commands(?)
CCACHE_DIR: '/Users/runner/ccache-dir'
CARGO_HOME: '/Users/runner/cargo-home'
# Qt 6.7.3 is the last version that runs on macOS 11.
QT_URL: 'https://qt.mirror.constant.com/archive/qt/6.7/6.7.3/single/qt-everywhere-src-6.7.3.tar.xz'
QT_SHA256: 'a3f1d257cbb14c6536585ffccf7c203ce7017418e1a0c2ed7c316c20c729c801'
QT_ROOT: '/Users/runner/qt'
OCC_VERSION: '7_9_1'
OCC_ROOT: '/Users/runner/occ'
MACOSX_DEPLOYMENT_TARGET: '11' # Picked up by CMake and Rust
CMAKE_PREFIX_PATH: '/Users/runner/qt/lib/cmake/Qt6:/Users/runner/occ/lib/cmake/opencascade'
CMAKE_XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME: 'YES' # Required for notarizing
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Print Environment
run: ./ci/print_environment.sh
# caching --->
- name: Cache .ccache
uses: actions/cache@v4
with:
key: ${{ github.job }}-${{ github.ref }}
restore-keys: ${{ github.job }}-refs/heads/master
path: ${{ env.CCACHE_DIR }}
- name: Cache .cargo
uses: actions/cache@v4
with:
key: ${{ github.job }}-${{ hashFiles('libs/librepcb/**/Cargo.lock') }}-${{ github.ref }}
restore-keys: ${{ github.job }}-${{ hashFiles('libs/librepcb/**/Cargo.lock') }}-refs/heads/master
path: |
${{ env.CARGO_HOME }}/bin/
${{ env.CARGO_HOME }}/registry/index/
${{ env.CARGO_HOME }}/registry/cache/
${{ env.CARGO_HOME }}/git/db/
./build/cargo/
./libs/librepcb/rust-core/target/
- name: Cache Qt
uses: actions/cache@v4
with:
key: qt-${{ env.QT_SHA256 }}-macos-${{ env.MACOSX_DEPLOYMENT_TARGET }}-v6
path: ${{ env.QT_ROOT }}
- name: Cache OpenCascade
uses: actions/cache@v4
with:
key: occ-${{ env.OCC_VERSION }}-macos-${{ env.MACOSX_DEPLOYMENT_TARGET }}-v6
path: ${{ env.OCC_ROOT }}
# <--- caching
- name: Install Dependencies
run: |
source ./ci/install_dependencies.sh
# Pass modified PATH to following steps:
echo "$PATH" > "$GITHUB_PATH"
env:
SLINT_UI_TESTING_AUTH: ${{ secrets.SLINT_UI_TESTING_AUTH }}
- name: Print New Environment
run: ./ci/print_environment.sh
- name: Build LibrePCB
run: ./ci/build_librepcb.sh
- name: Build Bundle
run: ./ci/build_mac_bundle.sh
- name: Build DMG
run: ./ci/build_mac_dmg.sh
- name: Run rust-core tests
run: cd libs/librepcb/rust-core && cargo test --features=fail-on-warnings
- name: Run LibrePCB Unittests
run: ./build/tests/unittests/librepcb-unittests
- name: Run LibrePCB-CLI Functional Tests
run: uv --directory ./tests/cli run --no-dev pytest -vvv --librepcb-executable="../../build/install/LibrePCB.app/Contents/MacOS/librepcb-cli"
- name: Run LibrePCB Functional Tests
run: uv --directory ./tests/funq run --no-dev pytest -vvv --librepcb-executable="../../build/install/LibrePCB.app/Contents/MacOS/librepcb" --reruns 5 --reruns-delay 10
- name: Run LibrePCB UI Tests
if: ${{ success() && env.SLINT_UI_TESTING_AUTH }}
run: uv --directory ./tests/ui run --no-dev pytest -vvv --librepcb-executable="../../build/install/LibrePCB.app/Contents/MacOS/librepcb"
env:
SLINT_UI_TESTING_AUTH: ${{ secrets.SLINT_UI_TESTING_AUTH }}
- name: Tar & Upload Artifacts
if: ${{ success() && (github.event_name == 'push') && env.UPLOAD_URL }}
run: |
./ci/tar_artifacts.sh
./ci/upload_artifacts.sh
env:
UPLOAD_URL: ${{ secrets.UPLOAD_URL }}
UPLOAD_USER: ${{ secrets.UPLOAD_USER }}
UPLOAD_PASS: ${{ secrets.UPLOAD_PASS }}
UPLOAD_SIGN_KEY: ${{ secrets.UPLOAD_SIGN_KEY }}