# 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-2019 build_type: full qt_source: aqt 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-2019" ]]; then echo "CONAN_PROFILE='./tools/conan-profiles/vs-19-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