overte/.github/workflows/release_build.yml

220 lines
7.9 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: Windows Release Build
on:
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:
APP_NAME: interface
BUILD_TYPE: Release
GIT_COMMIT: ${{ github.sha }}
UPLOAD_BUCKET: overte-public
UPLOAD_REGION: fra1
UPLOAD_ENDPOINT: "https://fra1.digitaloceanspaces.com"
# WIN-specific variables
PreferredToolArchitecture: X64
# Specify build preset, since on Windows, `cmake --build` appears to be unaware of of which build preset to use, using defaults instead.
CMAKE_BUILD_EXTRA: --preset conan-release
jobs:
build:
name: "${{matrix.os}}"
strategy:
matrix:
include:
- os: windows-2022
build_type: full
qt_source: source
fail-fast: false
runs-on: ${{matrix.os}}
steps:
- name: Configure build environment 1
shell: bash
id: buildenv1
run: |
echo "GIT_COMMIT_SHORT=`echo ${{ github.sha }} | cut -c1-7`" >> $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
echo "JOB_NAME=${{matrix.os}}, ${{matrix.build_type}}" >> $GITHUB_ENV
echo "APP_TARGET_NAME=$APP_NAME" >> $GITHUB_ENV
echo "CONAN_CPPSTD=17" >> $GITHUB_ENV
echo "PYTHON_EXEC=python" >> $GITHUB_ENV
echo "ZIP_COMMAND=7z" >> $GITHUB_ENV
echo "ZIP_ARGS=a" >> $GITHUB_ENV
echo "INSTALLER_EXT=exe" >> $GITHUB_ENV
echo "CMAKE_EXTRA=-A x64" >> $GITHUB_ENV
echo "SYMBOL_REGEX=\(exe\|dll\|pdb\)" >> $GITHUB_ENV
echo "SYMBOLS_ARCHIVE=$RELEASE_NUMBER-${{ github.sha }}-win-symbols.zip" >> $GITHUB_ENV
# echo "HF_PFX_PASSPHRASE=${{secrets.pfx_key}}" >> $GITHUB_ENV
# echo "HF_PFX_FILE=${{runner.workspace}}\build\codesign.pfx" >> $GITHUB_ENV
if [[ "${{ matrix.os }}" = "windows-2022" ]]; then
echo "CONAN_PROFILE='./tools/conan-profiles/vs-22-release'" >> $GITHUB_ENV
else
echo "Not sure which Conan profile to use. Exiting." && exit 1
fi
# Configuration is broken into two 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: |
echo "ARTIFACT_PATTERN=Overte-${{ github.ref_name }}.$INSTALLER_EXT" >> $GITHUB_ENV
- uses: actions/checkout@v4
with:
submodules: false
fetch-depth: 1
- name: Override Windows package versions
shell: pwsh
if: startsWith(matrix.os, 'windows')
run: |
choco install nsis --allow-downgrade --version=3.06.1
choco install cmake --allow-downgrade --version=3.31.6 # Our dependencies don't support CMake 4.0 yet.
Invoke-WebRequest https://build-deps.overte.org/conan/nsis-overte-plugins/NSIS-hifi-plugins-1.0.zip -OutFile NSIS-hifi-plugins.zip
Expand-Archive -LiteralPath 'NSIS-hifi-plugins.zip' -DestinationPath 'C:/Program Files (x86)/'
- name: Install Python modules
if: startsWith(matrix.os, 'windows') || startsWith(matrix.os, 'macOS')
shell: bash
run: $PYTHON_EXEC -m pip install boto3 PyGithub conan
- 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}}
conan_profile: ${{env.CONAN_PROFILE}}
- name: Upload Conan dependencies
# Conan isn't glibc aware, so we need to be really careful what we upload to the binary cache on Linux.
# See the upstream discussion: https://github.com/conan-io/conan/issues/7121
if: startsWith(matrix.os, 'windows') || startsWith(matrix.os, 'macOS')
continue-on-error: true
shell: bash
env:
CONAN_LOGIN_USERNAME_OVERTE: ${{ secrets.conan_login_username_overte }}
CONAN_PASSWORD_OVERTE: ${{ secrets.conan_password_overte }}
run: |
conan list --graph=build.json --graph-binaries=build --format=json > pkglist.json
conan upload --list=pkglist.json -r=overte -c
- name: Configure CMake
shell: bash
# This syntax requires CMake 3.23
run: cmake --preset conan-${BUILD_TYPE,,} -DOVERTE_RELEASE_NUMBER=${{ github.ref_name }} -DOVERTE_BUILD_TYPE=PRODUCTION -DJSDOC_ENABLED:BOOL=TRUE $CMAKE_EXTRA
- name: Build application
shell: bash
run: cmake --build . --target $APP_TARGET_NAME $CMAKE_BUILD_EXTRA
- name: Build domain server
shell: bash
run: cmake --build . --target domain-server $CMAKE_BUILD_EXTRA
- name: Build assignment client
shell: bash
run: cmake --build . --target assignment-client $CMAKE_BUILD_EXTRA
- name: Build console
shell: bash
run: cmake --build . --target packaged-server-console $CMAKE_BUILD_EXTRA
- name: Build installer
shell: bash
run: |
echo "Retry code from https://unix.stackexchange.com/a/137639"
function fail {
echo $1 >&2
exit 1
}
function retry {
local n=1
local max=5
local delay=15
while true; do
"$@" && break || {
if [[ $n -lt $max ]]; then
((n++))
echo "Command failed. Attempt $n/$max:"
sleep $delay;
else
fail "The command has failed after $n attempts."
fi
}
done
}
retry cmake --build . --config $BUILD_TYPE --target package $CMAKE_BUILD_EXTRA
#- name: Sign installer (Windows)
# if: startsWith(matrix.os, 'windows')
# shell: powershell
# working-directory: C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64
# run: .\signtool.exe sign /fd sha256 /f ${{runner.workspace}}\build\codesign.pfx /p ${{secrets.pfx_key}} /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 ${{runner.workspace}}\build\${env:ARTIFACT_PATTERN}
- name: Output system stats
if: ${{ always() }}
working-directory: ${{runner.workspace}}/build
shell: bash
run: |
echo "Disk usage:"
df -h
- name: Output installer logs
if: failure() && startsWith(matrix.os, 'windows')
shell: bash
working-directory: ${{runner.workspace}}/build
run: cat ./_CPack_Packages/win64/NSIS/NSISOutput.log
- name: Upload artifact to S3
shell: bash
working-directory: ${{runner.workspace}}/build
env:
AWS_ACCESS_KEY_ID: ${{ secrets.s3_access_key_id }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.s3_secret_access_key }}
run: $PYTHON_EXEC $GITHUB_WORKSPACE/tools/ci-scripts/upload.py
- name: Upload artifact to GitHub
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_PATTERN }}
path: build/Overte-*
if-no-files-found: error
- name: Archive symbols
if: startsWith(matrix.os, 'windows') || startsWith(matrix.os, 'macOS')
shell: bash
run: |
SYMBOLS_TEMP="symbols-temp"
mkdir $SYMBOLS_TEMP
find "./build" -regex ".*\.$SYMBOL_REGEX" -exec cp -r {} $SYMBOLS_TEMP \;
cd $SYMBOLS_TEMP
$ZIP_COMMAND $ZIP_ARGS ../$SYMBOLS_ARCHIVE .
- name: Upload debug symbols to GitHub
uses: actions/upload-artifact@v4
with:
name: ${{ env.SYMBOLS_ARCHIVE }}
path: ${{ env.SYMBOLS_ARCHIVE }}
if-no-files-found: error