overte/.github/workflows/linux_server_build.yml

295 lines
11 KiB
YAML

# Copyright 2013-2019 High Fidelity, Inc.
# Copyright 2020-2022 Vircadia contributors.
# Copyright 2021-2025 Overte e.V.
# SPDX-License-Identifier: Apache-2.0
name: Linux Server CI Build
# Keep in mind that GitHub Actions does not allow reading secrets during PR builds.
on:
pull_request:
types: [labeled]
push:
tags:
# Release tags. E.g. 2024.06.1
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet
- "[0-9][0-9][0-9][0-9].[0-9][0-9].**"
env:
BUILD_TYPE: Release
UPLOAD_BUCKET: overte-public
UPLOAD_REGION: fra1
UPLOAD_ENDPOINT: "https://fra1.digitaloceanspaces.com"
jobs:
build:
# Only run master or tagged builds, or PRs when labeled as "server"
if: github.event.label.name == 'server'|| github.event_name != 'pull_request'
name: "${{matrix.os}}, ${{matrix.arch}}"
strategy:
matrix:
include:
- os: debian-11
image: docker.io/overte/overte-server-build:0.1.7-debian-11-amd64
arch: amd64
qt_source: system
runner: ubuntu-latest
- os: debian-11
image: docker.io/overte/overte-server-build:0.1.7-debian-11-aarch64
arch: aarch64
qt_source: system
runner: ubuntu-24.04-arm
- os: debian-12
image: docker.io/overte/overte-server-build:0.1.7-debian-12-amd64
arch: amd64
qt_source: system
runner: ubuntu-latest
- os: debian-12
image: docker.io/overte/overte-server-build:0.1.7-debian-12-aarch64
arch: aarch64
qt_source: system
runner: ubuntu-24.04-arm
- os: debian-13
image: docker.io/overte/overte-server-build:0.1.7-debian-13-amd64
arch: amd64
qt_source: system
runner: ubuntu-latest
- os: debian-13
image: docker.io/overte/overte-server-build:0.1.7-debian-13-aarch64
arch: aarch64
qt_source: system
runner: ubuntu-24.04-arm
- os: ubuntu-22.04
image: docker.io/overte/overte-server-build:0.1.7-ubuntu-22.04-amd64
arch: amd64
qt_source: system
runner: ubuntu-latest
- os: ubuntu-22.04
image: docker.io/overte/overte-server-build:0.1.7-ubuntu-22.04-aarch64
arch: aarch64
qt_source: system
runner: ubuntu-24.04-arm
- os: ubuntu-24.04
image: docker.io/overte/overte-server-build:0.1.7-ubuntu-24.04-amd64
arch: amd64
qt_source: system
runner: ubuntu-latest
- os: ubuntu-24.04
image: docker.io/overte/overte-server-build:0.1.7-ubuntu-24.04-aarch64
arch: aarch64
qt_source: system
runner: ubuntu-24.04-arm
- os: fedora-41
image: docker.io/overte/overte-server-build:0.1.7-fedora-41-amd64
arch: amd64
qt_source: system
runner: ubuntu-latest
- os: fedora-41
image: docker.io/overte/overte-server-build:0.1.7-fedora-41-aarch64
arch: aarch64
qt_source: system
runner: ubuntu-24.04-arm
- os: fedora-42
image: docker.io/overte/overte-server-build:0.1.7-fedora-42-amd64
arch: amd64
qt_source: system
runner: ubuntu-latest
- os: fedora-42
image: docker.io/overte/overte-server-build:0.1.7-fedora-42-aarch64
arch: aarch64
qt_source: system
runner: ubuntu-24.04-arm
- os: rockylinux-9
image: docker.io/overte/overte-server-build:0.1.7-rockylinux-9-amd64
arch: amd64
qt_source: source
runner: ubuntu-latest
fail-fast: false
runs-on: ${{matrix.runner}}
container: ${{matrix.image}}
steps:
- name: Configure Build Environment 1
shell: bash
run: |
# Get git commit
if [ "${{github.event_name}}" = "pull_request" ]; then
echo "GIT_COMMIT_SHORT=`echo ${{ github.event.pull_request.head.sha }} | cut -c1-7`" >> $GITHUB_ENV
else # master or tagged
echo "GIT_COMMIT_SHORT=`echo ${{ github.sha }} | cut -c1-7`" >> $GITHUB_ENV
fi
echo "REFNAME=${{ github.ref_name }}" >> $GITHUB_ENV
echo "JOB_NAME=${{matrix.os}}, ${{matrix.arch}}" >> $GITHUB_ENV
echo "CONAN_CPPSTD=gnu20" >> $GITHUB_ENV
echo "CMAKE_BUILD_EXTRA=-- -j$(nproc)" >> $GITHUB_ENV
if [[ "${{ matrix.os }}" =~ "ubuntu" || "${{ matrix.os }}" =~ "debian" ]]; then
echo "INSTALLER_EXT=deb" >> $GITHUB_ENV
echo "DEBEMAIL=julian.gro@overte.org" >> $GITHUB_ENV
echo "DEBFULLNAME=GitHub Actions CI" >> $GITHUB_ENV
else # RPM
if [ "${{ matrix.arch }}" == "amd64" ]; then
echo "INSTALLER_EXT=x86_64.rpm" >> $GITHUB_ENV
else
echo "INSTALLER_EXT=aarch64.rpm" >> $GITHUB_ENV
fi
fi
# Tagged builds. E.g. release or release candidate builds.
if [ "${{github.ref_type}}" == "tag" ]; then
echo "OVERTE_RELEASE_TYPE=PRODUCTION" >> $GITHUB_ENV
else
echo "OVERTE_RELEASE_TYPE=PR" >> $GITHUB_ENV
fi
echo "CMAKE_EXTRA=-DOVERTE_BUILD_SERVER=true -DOVERTE_BUILD_TOOLS=true -DOVERTE_BUILD_CLIENT=false" >> $GITHUB_ENV
# Configuration is broken into multiple steps because you can't set an env var and also reference it in the same step
- name: Configure Build Environment 2
shell: bash
run: |
# Versioning
if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "DEBVERSION=${{ github.event.number }}PR-$GIT_COMMIT_SHORT-${{ matrix.os }}" >> $GITHUB_ENV
echo "RPMVERSION=PR${{ github.event.number }}.$GIT_COMMIT_SHORT" >> $GITHUB_ENV
elif [ "${{ github.ref_name }}" = "master" ]; then
echo "DEBVERSION=${{ github.run_number }}master-$GIT_COMMIT_SHORT-${{ matrix.os }}" >> $GITHUB_ENV
echo "RPMVERSION=master${{ github.run_number }}.$GIT_COMMIT_SHORT" >> $GITHUB_ENV
echo "UPLOAD_PREFIX=build/overte/master" >> $GITHUB_ENV
echo "RELEASE_NUMBER=${{ github.run_number }}" >> $GITHUB_ENV
else # tagged
echo "DEBVERSION=${{ github.ref_name }}-$GIT_COMMIT_SHORT-${{ matrix.os }}" >> $GITHUB_ENV
# We remove all dash characters from RPM versions, because rpmbuild doesn't allow dashes in version numbers.
echo "RPMVERSION=${REFNAME//-}.$GIT_COMMIT_SHORT" >> $GITHUB_ENV
fi
if [ "${{ github.ref_type }}" == "tag" ]; then # tagged
echo "RELEASE_NUMBER=${{ github.ref_name }}" >> $GITHUB_ENV
if [[ "${{ github.ref_name }}" == *"rc"* ]]; then # release candidate
# The uploader already creates a subfolder for each RELEASE_NUMBER.
echo "UPLOAD_PREFIX=build/overte/release-candidate/" >> $GITHUB_ENV
else # release
echo "UPLOAD_PREFIX=build/overte/release/" >> $GITHUB_ENV
fi
fi
- name: Configure Build Environment 3
shell: bash
run: |
if [[ "${{ matrix.os }}" =~ "ubuntu" || "${{ matrix.os }}" =~ "debian" ]]; then
if [ "${{ matrix.arch }}" == "aarch64" ]; then
echo "ARTIFACT_PATTERN=overte-server_${DEBVERSION}-1_arm64.$INSTALLER_EXT" >> $GITHUB_ENV
else # amd64
echo "ARTIFACT_PATTERN=overte-server_${DEBVERSION}-1_amd64.$INSTALLER_EXT" >> $GITHUB_ENV
fi
else # RPM
if [ "${{ matrix.os }}" == "rockylinux-9" ]; then
echo "ARTIFACT_PATTERN=overte-server-$RPMVERSION-1.el9.$INSTALLER_EXT" >> $GITHUB_ENV
elif [ "${{ matrix.os }}" == "fedora-40" ]; then
echo "ARTIFACT_PATTERN=overte-server-$RPMVERSION-1.fc40.$INSTALLER_EXT" >> $GITHUB_ENV
elif [ "${{ matrix.os }}" == "fedora-41" ]; then
echo "ARTIFACT_PATTERN=overte-server-$RPMVERSION-1.fc41.$INSTALLER_EXT" >> $GITHUB_ENV
elif [ "${{ matrix.os }}" == "fedora-42" ]; then
echo "ARTIFACT_PATTERN=overte-server-$RPMVERSION-1.fc42.$INSTALLER_EXT" >> $GITHUB_ENV
else
echo "Error! ARTIFACT_PATTERN not set!"
exit 1 # Fail
fi
fi
- uses: actions/checkout@v4
with:
submodules: false
fetch-depth: 1
- name: Prepare Conan Build Environment
uses: ./.github/actions/setup-conan
- name: Install Conan dependencies
uses: ./.github/actions/conan-install
with:
qt_source: ${{matrix.qt_source}}
build_type: ${{env.BUILD_TYPE}}
cppstd: ${{env.CONAN_CPPSTD}}
- name: Upload dependency source backups
shell: bash
env:
# Token for uploading dependency source backups.
CONAN_BUILD_DEPENDENCIES_BACKUP_UPLOAD_TOKEN: ${{ secrets.CONAN_BUILD_DEPENDENCIES_BACKUP_UPLOAD_TOKEN }}
run: conan cache backup-upload || echo "Credentials cannot be accessed on remote Pull Request builds. Continuing…"
- name: Configure CMake
shell: bash
# This syntax requires CMake 3.23
run: cmake --preset conan-${BUILD_TYPE,,} -DOVERTE_RELEASE_TYPE=$OVERTE_RELEASE_TYPE -DOVERTE_RELEASE_NUMBER=$RELEASE_NUMBER -DOVERTE_GIT_COMMIT_SHORT=$GIT_COMMIT_SHORT $CMAKE_EXTRA
- name: Build Domain Server
working-directory: build
shell: bash
run: cmake --build . --target domain-server $CMAKE_BUILD_EXTRA
- name: Build Assignment Client
working-directory: build
shell: bash
run: cmake --build . --target assignment-client $CMAKE_BUILD_EXTRA
- name: Build Oven
working-directory: build
shell: bash
run: cmake --build . --target oven $CMAKE_BUILD_EXTRA
- name: Package
working-directory: pkg-scripts
shell: bash
run: |
if [[ "${{ matrix.os }}" = "ubuntu"* || "${{ matrix.os }}" = "debian"* ]]; then # Debian
./make-deb-server
else # RPM
./make-rpm-server
fi
- name: Output system stats
if: ${{ always() }}
shell: bash
run: |
echo "Disk usage:"
df -h
- name: Upload artifact to GitHub
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_PATTERN }}
path: pkg-scripts/${{ env.ARTIFACT_PATTERN }}
- name: Upload artifact to S3
if: github.event_name != 'pull_request' # PR builds cannot be uploaded to S3
shell: bash
working-directory: pkg-scripts
env:
AWS_ACCESS_KEY_ID: ${{ secrets.s3_access_key_id }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.s3_secret_access_key }}
run: python3 $GITHUB_WORKSPACE/tools/ci-scripts/upload.py