Skip to content

Merge pull request #7047 from BOINC/dpa_plan_class2 #8118

Merge pull request #7047 from BOINC/dpa_plan_class2

Merge pull request #7047 from BOINC/dpa_plan_class2 #8118

Workflow file for this run

# This file is part of BOINC.
# https://boinc.berkeley.edu
# Copyright (C) 2026 University of California
#
# BOINC is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License
# as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
#
# BOINC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with BOINC. If not, see <http://www.gnu.org/licenses/>.
name: Linux
on:
push:
branches: [ master, 'client_release/**' ]
tags: [ 'client_release/**' ]
pull_request:
branches: [ master ]
schedule:
- cron: '0 0 * * *'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
env:
AWS_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_KEY }}
AWS_DEFAULT_REGION: us-west-2
jobs:
build:
name: ${{ matrix.type }}-build
runs-on: ubuntu-latest
strategy:
matrix:
type:
- apps
- apps-arm64
- apps-armhf
- apps-vcpkg
- apps-vcpkg-arm64
- apps-vcpkg-armhf
- client
- client-vcpkg
- client-vcpkg-arm64
- client-vcpkg-armhf
- coverity
- integration-test
- libs
- libs-arm64
- libs-armhf
- libs-cmake
- libs-vcpkg
- libs-vcpkg-arm64
- libs-vcpkg-armhf
- manager
- manager-with-webview
- manager-with-webview-vcpkg
- manager-with-webview-vcpkg-arm64
- manager-with-webview-vcpkg-armhf
- manager-without-webview
- server
- unit-test
fail-fast: false
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
with:
fetch-depth: 2
- name: Ignore mirrors when building arm64 or armhf
if: success() && (endsWith(matrix.type, 'arm64') || endsWith(matrix.type, 'armhf'))
run: |
sudo sed -i '/azure/d' /etc/apt/apt-mirrors.txt
- name: Install dependencies
if: matrix.type != 'coverity' || (github.ref == 'refs/heads/master' && github.event_name == 'schedule')
run: |
sudo apt-get update
sudo apt-get install -y autopoint p7zip-full zip
- name: Install dependencies for x64
if: success() && (! endsWith(matrix.type, 'arm64') && ! endsWith(matrix.type, 'armhf') && (matrix.type != 'coverity' || (github.ref == 'refs/heads/master' && github.event_name == 'schedule')))
run: |
sudo apt-get install -y autoconf-archive libftgl-dev freeglut3-dev libcurl4-openssl-dev libxmu-dev libxi-dev libfcgi-dev libxss-dev libnotify-dev libxcb-util0-dev libgtk-3-dev libsecret-1-dev libgcrypt20-dev libsystemd-dev libwebkit2gtk-4.1-dev libxxf86vm-dev ocl-icd-opencl-dev libltdl-dev libzip-dev nlohmann-json3-dev
- name: Install dependencies for manager
if: success() && (matrix.type == 'manager' || (matrix.type == 'coverity' && github.ref == 'refs/heads/master' && github.event_name == 'schedule'))
run: |
sudo apt-get install -y libwxgtk3.2-dev libwxgtk-webview3.2-dev
- name: Install dependencies for arm64
if: success() && endsWith(matrix.type, 'arm64')
run: |
sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
- name: Install dependencies for armhf
if: success() && endsWith(matrix.type, 'armhf')
run: |
sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf binutils-arm-linux-gnueabihf
- name: Fix sources for arm64
if: success() && endsWith(matrix.type, 'arm64') && matrix.type != 'client-vcpkg-arm64'
run: |
arch=arm64
sudo dpkg --add-architecture arm64
sudo sed -i '/^Types: deb$/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources
sudo sed -i '/^Types: deb$/a Architectures: amd64' /etc/apt/sources.list.d/azure-cli.sources
codename=$(lsb_release -cs)
cat <<EOT >> arm-cross-compile-sources.list
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $codename main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $codename-updates main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $codename-security main restricted universe multiverse
deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports $codename-backports main restricted universe multiverse
EOT
sudo mv arm-cross-compile-sources.list /etc/apt/sources.list.d/
sudo apt update
- name: Fix sources for armhf
if: success() && endsWith(matrix.type, 'armhf') && matrix.type != 'client-vcpkg-armhf'
run: |
arch=armhf
sudo dpkg --add-architecture armhf
sudo sed -i '/^Types: deb$/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources
sudo sed -i '/^Types: deb$/a Architectures: amd64' /etc/apt/sources.list.d/azure-cli.sources
codename=$(lsb_release -cs)
cat <<EOT >> armhf-cross-compile-sources.list
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports $codename main restricted universe multiverse
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports $codename-updates main restricted universe multiverse
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports $codename-security main restricted universe multiverse
deb [arch=armhf] http://ports.ubuntu.com/ubuntu-ports $codename-backports main restricted universe multiverse
EOT
sudo mv armhf-cross-compile-sources.list /etc/apt/sources.list.d/
sudo apt update
- name: Install dependencies for arm64 non-vcpkg
if: success() && (matrix.type == 'libs-arm64' || matrix.type == 'apps-arm64')
run: |
sudo apt install -y \
libcurl4-openssl-dev:arm64 \
libssl-dev:arm64 \
libzip-dev:arm64
- name: Install dependencies for armhf non-vcpkg
if: success() && (matrix.type == 'libs-armhf' || matrix.type == 'apps-armhf')
run: |
sudo apt install -y \
libcurl4-openssl-dev:armhf \
libssl-dev:armhf \
libzip-dev:armhf
- name: Install dependencies for apps arm64 vcpkg
if: success() && matrix.type == 'apps-vcpkg-arm64'
run: |
sudo apt install -y \
libxi-dev:arm64 \
libxmu-dev:arm64 \
libgl1-mesa-dev:arm64 \
libglu1-mesa-dev:arm64 \
mesa-common-dev:arm64 \
libxrandr-dev:arm64 \
libxxf86vm-dev:arm64 \
libjpeg-dev:arm64 \
ocl-icd-opencl-dev:arm64 \
libcurl4-openssl-dev:arm64 \
libssl-dev:arm64 \
libzip-dev:arm64
- name: Install dependencies for apps armhf vcpkg
if: success() && matrix.type == 'apps-vcpkg-armhf'
run: |
sudo apt install -y \
libxi-dev:armhf \
libxmu-dev:armhf \
libgl1-mesa-dev:armhf \
libglu1-mesa-dev:armhf \
mesa-common-dev:armhf \
libxrandr-dev:armhf \
libxxf86vm-dev:armhf \
libjpeg-dev:armhf \
ocl-icd-opencl-dev:armhf \
libcurl4-openssl-dev:armhf \
libssl-dev:armhf \
libzip-dev:armhf
- name: Install dependencies for manager arm64 vcpkg
if: success() && matrix.type == 'manager-with-webview-vcpkg-arm64'
run: |
sudo apt install -y \
libltdl-dev:arm64 \
python3-jinja2 \
autoconf-archive
- name: Install dependencies for manager armhf vcpkg
if: success() && matrix.type == 'manager-with-webview-vcpkg-armhf'
run: |
sudo apt install -y \
libltdl-dev:armhf \
python3-jinja2 \
autoconf-archive
- name: Install dependencies for unit testing
if: success() && matrix.type == 'unit-test'
run: |
sudo apt-get install -y libgtest-dev
- name: Install dependencies for integration testing
if: success() && matrix.type == 'integration-test'
env:
BOINC_INTEGRATION_LOG_DIR: ${{ runner.temp }}/integration-test-logs
run: |
sudo apt-get install ansible
sudo service mysql stop
./tests/integration_test/installTestSuite.sh
- name: Cache dependencies
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae
with:
path: |
3rdParty/buildCache
!3rdParty/buildCache/linux/vcpkgcache/
key: linux-${{ matrix.type }}-${{ hashFiles('3rdParty/*Linux*.sh', 'linux/*.sh', '.github/workflows/linux.yml') }}
- name: Check if build is running from origin repo
if: ${{ success() && env.AWS_ACCESS_KEY_ID != 0 && env.AWS_SECRET_ACCESS_KEY != 0 }}
run: |
echo "VCPKG_BINARY_SOURCES=clear;x-aws,s3://vcpkg.cache.boinc/,readwrite" >> $GITHUB_ENV
- name: Check if build is running from fork
if: ${{ success() && (env.AWS_ACCESS_KEY_ID == 0 || env.AWS_SECRET_ACCESS_KEY == 0) }}
run: |
echo "VCPKG_BINARY_SOURCES=clear;x-aws-config,no-sign-request;x-aws,s3://vcpkg.cache.boinc/,read" >> $GITHUB_ENV
- name: Automake
if: success() && (matrix.type != 'coverity' || (github.ref == 'refs/heads/master' && github.event_name == 'schedule'))
run: ./_autosetup
- name: Build libs
if: success() && matrix.type == 'libs'
run: |
./configure --disable-server --disable-client --disable-manager --enable-boinczip
make -j $(nproc --all)
- name: Build client
if: success() && matrix.type == 'client'
run: |
./configure --disable-server --enable-client --disable-manager
make -j $(nproc --all)
- name: Build apps
if: success() && matrix.type == 'apps'
run: |
./configure --enable-apps --enable-apps-vbox --enable-apps-gui --disable-server --disable-client --disable-manager
make -j $(nproc --all)
- name: Build manager
if: success() && matrix.type == 'manager'
run: |
./configure --disable-server --disable-client --enable-manager
make -j $(nproc --all)
- name: Build libs with vcpkg
if: success() && matrix.type == 'libs-vcpkg'
run: |
. ./linux/ci_configure_libs.sh
make -j $(nproc --all)
- name: Build client with vcpkg
if: success() && matrix.type == 'client-vcpkg'
run: |
. ./linux/ci_configure_client.sh
make -j $(nproc --all)
- name: Build apps with vcpkg
if: success() && matrix.type == 'apps-vcpkg'
run: |
. ./linux/ci_configure_apps.sh
make -j $(nproc --all)
- name: Build libs with cmake vcpkg
if: success() && matrix.type == 'libs-cmake'
run: |
. ./linux/ci_configure_libs_cmake.sh
cmake --build build
- name: Build manager with webview and vcpkg
if: success() && matrix.type == 'manager-with-webview-vcpkg'
run: |
. ./linux/ci_configure_manager.sh
make -j $(nproc --all)
- name: Build server
if: success() && matrix.type == 'server'
run: |
./configure --enable-server --disable-client --disable-manager
make
- name: Build manager with webview
if: success() && matrix.type == 'manager-with-webview'
run: |
./3rdParty/buildLinuxDependencies.sh
./configure --disable-server --disable-client --with-wx-prefix=${GITHUB_WORKSPACE}/3rdParty/buildCache/linux
make -j $(nproc --all)
- name: Build manager without webview
if: success() && matrix.type == 'manager-without-webview'
run: |
./3rdParty/buildLinuxDependencies.sh --disable-webview
./configure --disable-server --disable-client --with-wx-prefix=${GITHUB_WORKSPACE}/3rdParty/buildCache/linux
make -j $(nproc --all)
- name: Build server for unit testing
if: success() && matrix.type == 'unit-test'
run: |
./configure --disable-client --disable-manager --enable-unit-tests CFLAGS="-g -O0" CXXFLAGS="-g -O0"
make
- name: Build libraries for arm64 with vcpkg
if: success() && matrix.type == 'libs-vcpkg-arm64'
run: |
. ./linux/arm64/ci_configure_libs.sh
make -j $(nproc --all)
- name: Build apps for arm64 with vcpkg
if: success() && matrix.type == 'apps-vcpkg-arm64'
run: |
. ./linux/arm64/ci_configure_apps.sh
make -j $(nproc --all)
- name: Build client for arm64 with vcpkg
if: success() && matrix.type == 'client-vcpkg-arm64'
run: |
. ./linux/arm64/ci_configure_client.sh
make -j $(nproc --all)
- name: Build manager with webview for arm64 with vcpkg
if: success() && matrix.type == 'manager-with-webview-vcpkg-arm64'
run: |
. ./linux/arm64/ci_configure_manager.sh
make -j $(nproc --all)
- name: Build libraries for armhf with vcpkg
if: success() && matrix.type == 'libs-vcpkg-armhf'
run: |
. ./linux/armhf/ci_configure_libs.sh
make -j $(nproc --all)
- name: Build apps for armhf with vcpkg
if: success() && matrix.type == 'apps-vcpkg-armhf'
run: |
. ./linux/armhf/ci_configure_apps.sh
make -j $(nproc --all)
- name: Build client for armhf with vcpkg
if: success() && matrix.type == 'client-vcpkg-armhf'
run: |
. ./linux/armhf/ci_configure_client.sh
make -j $(nproc --all)
- name: Build manager with webview for armhf with vcpkg
if: success() && matrix.type == 'manager-with-webview-vcpkg-armhf'
run: |
. ./linux/armhf/ci_configure_manager.sh
make -j $(nproc --all)
- name: Build libraries for arm64
if: success() && matrix.type == 'libs-arm64'
run: |
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export CFLAGS="-march=armv8-a -O3"
export CXXFLAGS="-march=armv8-a -O3 -std=c++11"
export LDFLAGS="-march=armv8-a -static-libstdc++ -s"
export RELEASE_ARCH=arm64
export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig
./configure --host=aarch64-linux --with-boinc-platform="aarch64-unknown-linux-gnu" --with-boinc-alt-platform="arm-unknown-linux-gnueabihf" --enable-boinczip --disable-server --disable-manager --disable-client --disable-shared --enable-static
make -j $(nproc --all)
- name: Build apps for arm64
if: success() && matrix.type == 'apps-arm64'
run: |
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export LD=aarch64-linux-gnu-ld
export CFLAGS="-march=armv8-a -O3"
export CXXFLAGS="-march=armv8-a -O3 -std=c++11"
export LDFLAGS="-march=armv8-a -static-libstdc++ -s"
export RELEASE_ARCH=arm64
export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig
./configure --host=aarch64-linux --with-boinc-platform="aarch64-unknown-linux-gnu" --with-boinc-alt-platform="arm-unknown-linux-gnueabihf" --enable-apps --disable-server --disable-manager --disable-client --disable-shared --enable-static
make -j $(nproc --all)
- name: Build libraries for armhf
if: success() && matrix.type == 'libs-armhf'
run: |
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export LD=arm-linux-gnueabihf-ld
export CFLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -O3"
export CXXFLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -O3 -std=c++11"
export LDFLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -static-libstdc++ -s"
export RELEASE_ARCH=armhf
export PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig
./configure --host=arm-linux-gnueabihf --with-boinc-platform="arm-unknown-linux-gnueabihf" --with-boinc-alt-platform="aarch64-unknown-linux-gnu" --enable-boinczip --disable-server --disable-manager --disable-client --disable-shared --enable-static
make -j $(nproc --all)
- name: Build apps for armhf
if: success() && matrix.type == 'apps-armhf'
run: |
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export LD=arm-linux-gnueabihf-ld
export CFLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -O3"
export CXXFLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -O3 -std=c++11"
export LDFLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -static-libstdc++ -s"
export RELEASE_ARCH=armhf
export PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig
./configure --host=arm-linux-gnueabihf --with-boinc-platform="arm-unknown-linux-gnueabihf" --with-boinc-alt-platform="aarch64-unknown-linux-gnu" --enable-apps --disable-server --disable-manager --disable-client --disable-shared --enable-static
make -j $(nproc --all)
- name: Prepare for coverity scan
if: success() && matrix.type == 'coverity' && github.ref == 'refs/heads/master' && github.event_name == 'schedule'
run: ./configure --enable-client --enable-manager --enable-apps --enable-apps-vbox --enable-apps-gui --enable-server --enable-boinczip
- name: Coverity Scan
if: ${{ success() && matrix.type == 'coverity' && github.ref == 'refs/heads/master' && github.event_name == 'schedule' }}
uses: vapier/coverity-scan-action@2068473c7bdf8c2fb984a6a40ae76ee7facd7a85
with:
project: 'BOINC/boinc'
token: ${{ secrets.COVERITY_SCAN_TOKEN }}
email: 'lestat.de.lionkur@gmail.com'
- name: Execute unit-test and report coverage
if: success() && matrix.type == 'unit-test'
run: ./tests/executeUnitTests.sh --report-coverage --report-xml
- name: Execute automation tests
if: success() && matrix.type == 'unit-test'
run: python ./tests/crypt_prog_tests.py ./lib/crypt_prog
- name: Execute integration-test
if: success() && matrix.type == 'integration-test'
env:
BOINC_INTEGRATION_LOG_DIR: ${{ runner.temp }}/integration-test-logs
run: ./tests/integration_test/executeTestSuite.sh
- name: Collect integration-test docker logs
if: ${{ always() && matrix.type == 'integration-test' }}
env:
BOINC_INTEGRATION_LOG_DIR: ${{ runner.temp }}/integration-test-logs
run: |
mkdir -p "$BOINC_INTEGRATION_LOG_DIR"
if [ -d /tmp/boinc-server-docker ]; then
cd /tmp/boinc-server-docker
if ! docker compose ps -a > "$BOINC_INTEGRATION_LOG_DIR/docker-compose-ps.txt" 2>&1; then
echo "docker compose ps -a failed while collecting integration-test diagnostics" >> "$BOINC_INTEGRATION_LOG_DIR/docker-compose-ps.txt"
fi
if ! docker compose logs --no-color > "$BOINC_INTEGRATION_LOG_DIR/docker-compose.log" 2>&1; then
echo "docker compose logs failed while collecting integration-test diagnostics" >> "$BOINC_INTEGRATION_LOG_DIR/docker-compose.log"
fi
else
echo "/tmp/boinc-server-docker was not created" > "$BOINC_INTEGRATION_LOG_DIR/docker-compose.log"
fi
if ! docker ps -a > "$BOINC_INTEGRATION_LOG_DIR/docker-ps.txt" 2>&1; then
echo "docker ps -a failed while collecting integration-test diagnostics" >> "$BOINC_INTEGRATION_LOG_DIR/docker-ps.txt"
fi
- name: Upload integration-test docker logs
if: ${{ always() && matrix.type == 'integration-test' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: linux_integration_test_docker_logs_${{ github.sha }}
path: ${{ runner.temp }}/integration-test-logs
if-no-files-found: warn
- name: Prepare logs on failure
if: ${{ failure() }}
run: python ./deploy/prepare_deployment.py logs
- name: Upload logs on failure
if: ${{ failure() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: linux_logs_${{ matrix.type }}_${{ github.event.pull_request.head.sha }}
path: deploy/logs.7z
- name: Prepare artifacts for deploy
if: success() && ! contains(matrix.type, 'libs') && ! contains(matrix.type, 'server') && ! contains(matrix.type, 'test') && matrix.type != 'coverity'
run: python ./deploy/prepare_deployment.py linux_${{ matrix.type }}
- name: Upload artifacts
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
if: ${{ ! contains(matrix.type, 'libs') && ! contains(matrix.type, 'server') && ! contains(matrix.type, 'test') && matrix.type != 'coverity' }}
with:
name: linux_${{ matrix.type }}_${{ github.event.pull_request.head.sha }}
path: deploy/linux_${{ matrix.type }}.7z
- name: Upload Google Tests Results
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
if: always() && matrix.type == 'unit-test' # run this step even if previous step failed
with:
name: Linux_tests_results
path: "tests/gtest/**/*_xml_report.xml"
- name: Upload coverage report
if: success() && matrix.type == 'unit-test'
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}