# 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=gnu17" >> $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