Link Time Optimization #592
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
# Copyright 2013-2019 High Fidelity, Inc. | |
# Copyright 2020-2022 Vircadia contributors. | |
# Copyright 2021-2023 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: [opened, synchronize, reopened, labeled] | |
push: | |
branches: | |
- master | |
env: | |
BUILD_TYPE: Release | |
UPLOAD_BUCKET: overte-public | |
UPLOAD_REGION: fra1 | |
UPLOAD_ENDPOINT: "https://fra1.digitaloceanspaces.com" | |
CMAKE_BACKTRACE_URL: ${{ secrets.SENTRY_MINIDUMP_ENDPOINT }} | |
CMAKE_BACKTRACE_TOKEN: server_${{ github.event.number }}_${{ github.sha }} | |
jobs: | |
build: | |
# Only run master or tagged builds, or PRs if labeled as "server" | |
if: contains( github.event.pull_request.labels.*.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.3-debian-11-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
- os: debian-11 | |
image: docker.io/overte/overte-server-build:0.1.3-debian-11-aarch64 | |
arch: aarch64 | |
runner: linux_aarch64 | |
- os: debian-12 | |
image: docker.io/overte/overte-server-build:0.1.3-debian-12-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
- os: debian-12 | |
image: docker.io/overte/overte-server-build:0.1.3-debian-12-aarch64 | |
arch: aarch64 | |
runner: linux_aarch64 | |
- os: ubuntu-18.04 | |
image: docker.io/overte/overte-server-build:0.1.3-ubuntu-18.04-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
- os: ubuntu-20.04 | |
image: docker.io/overte/overte-server-build:0.1.3-ubuntu-20.04-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
- os: ubuntu-22.04 | |
image: docker.io/overte/overte-server-build:0.1.3-ubuntu-22.04-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
- os: ubuntu-22.04 | |
image: docker.io/overte/overte-server-build:0.1.3-ubuntu-22.04-aarch64 | |
arch: aarch64 | |
runner: linux_aarch64 | |
- os: fedora-37 | |
image: docker.io/overte/overte-server-build:0.1.3-fedora-37-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
- os: fedora-37 | |
image: docker.io/overte/overte-server-build:0.1.3-fedora-37-aarch64 | |
arch: aarch64 | |
runner: linux_aarch64 | |
- os: fedora-38 | |
image: docker.io/overte/overte-server-build:0.1.3-fedora-38-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
- os: fedora-38 | |
image: docker.io/overte/overte-server-build:0.1.3-fedora-38-aarch64 | |
arch: aarch64 | |
runner: linux_aarch64 | |
- os: rockylinux-9 | |
image: docker.io/overte/overte-server-build:0.1.3-rockylinux-9-amd64 | |
arch: amd64 | |
runner: ubuntu-latest | |
fail-fast: false | |
runs-on: ${{matrix.runner}} | |
container: ${{matrix.image}} | |
steps: | |
- name: Clear Working Directories | |
if: contains(matrix.runner, 'linux_aarch64') | |
shell: bash | |
run: | | |
rm -rf ./* | |
rm -rf ~/overte-files | |
rm -rf ~/.cache | |
- 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 "JOB_NAME=${{matrix.os}}, ${{matrix.arch}}" >> $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 "[email protected]" >> $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.event_name}}" != "pull_request" ]; then | |
echo "PRODUCTION_BUILD=true" >> $GITHUB_ENV | |
fi | |
# Systems requiring our prebuilt Qt package | |
if [[ "${{ matrix.os }}" = "ubuntu-18.04" || "${{ matrix.os }}" = "ubuntu-20.04" ]]; then | |
echo # false | |
else | |
echo "OVERTE_USE_SYSTEM_QT=true" >> $GITHUB_ENV | |
fi | |
# Architecture specific variables | |
if [[ "${{ matrix.arch }}" = "aarch64" ]]; then | |
echo "VCPKG_FORCE_SYSTEM_BINARIES=true" >> $GITHUB_ENV | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE= -DSERVER_ONLY=true -DBUILD_TOOLS=true" >> $GITHUB_ENV | |
else # amd64 | |
echo "CMAKE_EXTRA=-DOVERTE_CPU_ARCHITECTURE=-msse3 -DSERVER_ONLY=true -DBUILD_TOOLS=true" >> $GITHUB_ENV | |
fi | |
# 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.run_number }}-${{ github.ref_name }}-$GIT_COMMIT_SHORT-${{ matrix.os }}" >> $GITHUB_ENV | |
echo "RPMVERSION=${${{ github.ref_name }}//-/.}.${{ github.run_number }}.$GIT_COMMIT_SHORT" >> $GITHUB_ENV | |
fi | |
if [[ "${{ github.ref_name }}" != "master" && "${{ github.ref_name }}" != "pull_request" ]]; then # tagged | |
echo "RELEASE_NUMBER=/${{ github.ref_name }}" >> $GITHUB_ENV | |
if [ "${{ github.ref_name }}" == *"rc"* ]; then # release candidate | |
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-37" ]; then | |
echo "ARTIFACT_PATTERN=overte-server-$RPMVERSION-1.fc37.$INSTALLER_EXT" >> $GITHUB_ENV | |
elif [ "${{ matrix.os }}" == "fedora-38" ]; then | |
echo "ARTIFACT_PATTERN=overte-server-$RPMVERSION-1.fc38.$INSTALLER_EXT" >> $GITHUB_ENV | |
else | |
echo "Error! ARTIFACT_PATTERN not set!" | |
exit 1 # Fail | |
fi | |
fi | |
- uses: actions/checkout@v3 | |
with: | |
submodules: false | |
fetch-depth: 1 | |
- name: Create Build Environment | |
shell: bash | |
run: mkdir build | |
- name: Configure CMake | |
working-directory: build | |
shell: bash | |
run: | | |
if [ -z "$CMAKE_BACKTRACE_URL" ] ; then | |
# We're building a PR, default to the PR endpoint | |
export CMAKE_BACKTRACE_URL="https://o4504831972343808.ingest.sentry.io/api/4504832427950080/minidump/?sentry_key=f511de295975461b8f92a36f4a4a4f32" | |
export CMAKE_BACKTRACE_TOKEN="server_pr_${{ github.event.number }}_${{ github.sha }}" | |
fi | |
cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DVCPKG_BUILD_TYPE=release $CMAKE_EXTRA | |
- name: Compress cmake logs | |
if: always() | |
shell: bash | |
run: | | |
if [ ${{ env.CI_WORKSPACE }} ]; then | |
find "$CI_WORKSPACE/overte-files/vcpkg" -name '*log' -type f -print0 | tar --null --force-local -T - -c --xz -v -f "cmake-logs-${{ matrix.os }}-${{ matrix.arch }}-${{ github.event.number }}.tar.xz" | |
else | |
find "$HOME/overte-files/vcpkg" -name '*log' -type f -print0 | tar --null --force-local -T - -c --xz -v -f "cmake-logs-${{ matrix.os }}-${{ matrix.arch }}-${{ github.event.number }}.tar.xz" | |
fi | |
- name: Archive cmake logs | |
if: always() | |
uses: actions/upload-artifact@v3 | |
with: | |
name: cmake-logs-${{ matrix.os }}-${{ matrix.arch }}-${{ github.event.number }}.tar.xz | |
path: cmake-logs-${{ matrix.os }}-${{ matrix.arch }}-${{ github.event.number }}.tar.xz | |
- name: Build Domain Server | |
working-directory: build | |
shell: bash | |
run: cmake --build . --config $BUILD_TYPE --target domain-server $CMAKE_BUILD_EXTRA | |
- name: Build Assignment Client | |
working-directory: build | |
shell: bash | |
run: cmake --build . --config $BUILD_TYPE --target assignment-client $CMAKE_BUILD_EXTRA | |
- name: Build Oven | |
working-directory: build | |
shell: bash | |
run: cmake --build . --config $BUILD_TYPE --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 | |
if: github.event_name == 'pull_request' | |
uses: actions/upload-artifact@v3 | |
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 | |
- name: Clear Working Directories | |
if: contains(matrix.runner, 'linux_aarch64') | |
shell: bash | |
run: | | |
rm -rf ./* | |
rm -rf ~/overte-files | |
rm -rf ~/.cache |