Add group chat snooze menu back from history #224
Workflow file for this run
This file contains hidden or 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
| name: Build | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| channel: | |
| description: "Channel to configure the build" | |
| required: true | |
| type: choice | |
| default: "Auto" | |
| options: | |
| - "Auto" | |
| - "Test" | |
| - "Develop" | |
| - "Project" | |
| - "Beta" | |
| - "Release" | |
| - "Release edu" | |
| project: | |
| description: "Project Name (used for channel name in Project builds)" | |
| required: true | |
| type: string | |
| default: "hippo" | |
| pull_request: | |
| push: | |
| branches: ["main", "release/*", "beta/*", "project/*"] | |
| tags: ["Alchemy*"] | |
| permissions: | |
| contents: read | |
| jobs: | |
| # The whole point of the setup job is that we want to set variables once | |
| # that will be consumed by multiple subsequent jobs. | |
| setup: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| viewer_branch: ${{ steps.which-branch.outputs.branch }} | |
| relnotes: ${{ steps.which-branch.outputs.relnotes }} | |
| release_run: ${{ steps.setvar.outputs.release_run }} | |
| build_type: ${{ steps.setvar.outputs.build_type }} | |
| bugsplat_db: ${{ steps.setvar.outputs.bugsplat_db }} | |
| viewer_channel: ${{ steps.setvar.outputs.viewer_channel }} | |
| is_private_build: ${{ steps.setvar.outputs.is_private_build }} | |
| env: | |
| # Build with a tag like "Alchemy#abcdef0" to generate a release page | |
| # (used for builds we are planning to deploy). | |
| # When you want to use a string variable as a workflow YAML boolean, it's | |
| # important to ensure it's the empty string when false. If you omit || '', | |
| # its value when false is "false", which is interpreted as true. | |
| RELEASE_RUN: ${{ (github.event.inputs.release_run || github.ref_type == 'tag' && startsWith(github.ref_name, 'Alchemy')) && 'Y' || '' }} | |
| FROM_FORK: ${{ github.event.pull_request.head.repo.fork }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v7 | |
| with: | |
| ref: ${{ github.event.pull_request.head.sha || github.sha }} | |
| - name: Setup python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: "3.14" | |
| - name: Determine source branch | |
| id: which-branch | |
| uses: AlchemyViewer/viewer-build-util/which-branch@v3 | |
| with: | |
| token: ${{ github.token }} | |
| - name: Set Variables | |
| id: setvar | |
| shell: bash | |
| env: | |
| BUILD_VCS_BRANCH: ${{ steps.which-branch.outputs.branch }} | |
| VIEWER_CHANNEL_BASE: "Alchemy" | |
| run: | | |
| echo "release_run=$RELEASE_RUN" >> "$GITHUB_OUTPUT" | |
| if [[ "x$GITHUB_REPOSITORY" == "xAlchemyViewer/AlchemyInternal" ]]; then | |
| echo 'is_private_build=true' >> $GITHUB_OUTPUT | |
| else | |
| echo 'is_private_build=false' >> $GITHUB_OUTPUT | |
| fi | |
| if [[ "x$GITHUB_REPOSITORY" != "xAlchemyViewer/Alchemy" || "x$GITHUB_REPOSITORY" != "xAlchemyViewer/AlchemyInternal" ]]; then | |
| # Non-linden viewer repository run OSS build | |
| echo 'build_type=opensource' >> $GITHUB_OUTPUT | |
| echo "bugsplat_db=" >> $GITHUB_OUTPUT | |
| elif [[ "$FROM_FORK" == "true" ]]; then | |
| # PR from fork; don't build with Bugsplat, proprietary libs | |
| echo 'build_type=opensource' >> $GITHUB_OUTPUT | |
| echo "bugsplat_db=" >> $GITHUB_OUTPUT | |
| else | |
| echo 'build_type=proprietary' >> $GITHUB_OUTPUT | |
| echo "bugsplat_db=" >> $GITHUB_OUTPUT | |
| fi | |
| # determine the viewer channel from the branch or tag name | |
| # trigger an EDU build by including "edu" in the tag | |
| edu=${{ github.ref_type == 'tag' && contains(github.ref_name, 'edu') }} | |
| echo "ref_type=${{ github.ref_type }}, ref_name=${{ github.ref_name }}, edu='$edu'" | |
| branch=$BUILD_VCS_BRANCH | |
| if [[ "${{inputs.channel}}" != "" && "${{inputs.channel}}" != "Auto" ]]; | |
| then | |
| if [[ "${{inputs.channel}}" == "Project" ]]; | |
| then | |
| export viewer_channel="${{ env.VIEWER_CHANNEL_BASE }} Project ${{inputs.project}}" | |
| else | |
| export viewer_channel="${{ env.VIEWER_CHANNEL_BASE }} ${{inputs.channel}}" | |
| fi | |
| elif [[ "$edu" == "true" ]]; | |
| then | |
| export viewer_channel="${{ env.VIEWER_CHANNEL_BASE }} Release edu" | |
| elif [[ "$branch" == "develop" ]]; | |
| then | |
| export viewer_channel="${{ env.VIEWER_CHANNEL_BASE }} Develop" | |
| else | |
| IFS='/' read -ra ba <<< "$branch" | |
| prefix=${ba[0]} | |
| if [ "$prefix" == "project" ]; then | |
| IFS='_' read -ra prj <<< "${ba[1]}" | |
| prj_str="${prj[*]}" | |
| # uppercase first letter of each word | |
| capitalized=$(echo "$prj_str" | awk '{for (i=1; i<=NF; i++) $i = toupper(substr($i,1,1)) substr($i,2); print}') | |
| export viewer_channel="${{ env.VIEWER_CHANNEL_BASE }} Project $capitalized" | |
| elif [[ "$prefix" == "release" || "$prefix" == "main" ]]; | |
| then | |
| export viewer_channel="${{ env.VIEWER_CHANNEL_BASE }} Release" | |
| else | |
| export viewer_channel="${{ env.VIEWER_CHANNEL_BASE }} Test" | |
| fi | |
| fi | |
| echo "viewer_channel=$viewer_channel" >> "$GITHUB_OUTPUT" | |
| build: | |
| needs: setup | |
| permissions: | |
| packages: write | |
| strategy: | |
| matrix: | |
| runner: ["windows-2025-vs2026", "macos-26", "ubuntu-24.04"] | |
| configuration: [release] | |
| arch: [x64, arm64] | |
| build_variant: [Viewer, Tests] | |
| exclude: | |
| - runner: ubuntu-24.04 | |
| arch: arm64 | |
| - runner: windows-2025-vs2026 | |
| arch: arm64 | |
| - build_variant: Viewer | |
| configuration: relwithdebinfo | |
| - build_variant: Viewer | |
| configuration: optdebug | |
| - runner: macos-26 | |
| configuration: relwithdebinfo | |
| - runner: macos-26 | |
| configuration: optdebug | |
| runs-on: ${{ matrix.runner }} | |
| outputs: | |
| viewer_version: ${{ steps.build.outputs.viewer_version }} | |
| imagename: ${{ steps.build.outputs.imagename }} | |
| # Windows Velopack outputs (passed to sign-pkg-windows) | |
| velopack_pack_id: ${{ steps.build.outputs.velopack_pack_id }} | |
| velopack_pack_version: ${{ steps.build.outputs.velopack_pack_version }} | |
| velopack_pack_authors: ${{ steps.build.outputs.velopack_pack_authors }} | |
| velopack_pack_title: ${{ steps.build.outputs.velopack_pack_title }} | |
| velopack_main_exe: ${{ steps.build.outputs.velopack_main_exe }} | |
| velopack_exclude: ${{ steps.build.outputs.velopack_exclude }} | |
| velopack_icon: ${{ steps.build.outputs.velopack_icon }} | |
| velopack_splash: ${{ steps.build.outputs.velopack_splash }} | |
| velopack_splash_color: ${{ steps.build.outputs.velopack_splash_color }} | |
| velopack_installer_base: ${{ steps.build.outputs.velopack_installer_base }} | |
| # macOS Velopack outputs (passed to sign-pkg-mac) | |
| velopack_mac_pack_id: ${{ steps.build.outputs.velopack_mac_pack_id }} | |
| velopack_mac_pack_version: ${{ steps.build.outputs.velopack_mac_pack_version }} | |
| velopack_mac_pack_title: ${{ steps.build.outputs.velopack_mac_pack_title }} | |
| velopack_mac_main_exe: ${{ steps.build.outputs.velopack_mac_main_exe }} | |
| velopack_mac_bundle_id: ${{ steps.build.outputs.velopack_mac_bundle_id }} | |
| env: | |
| # Sets Xcode version used for build | |
| DEVELOPER_DIR: "/Applications/Xcode_26.6.app/Contents/Developer" | |
| # Ensure that Linden viewer builds engage Bugsplat. | |
| BUGSPLAT_DB: ${{ needs.setup.outputs.bugsplat_db }} | |
| # Decide if we're building tests or the viewer | |
| BUILD_VIEWER: ${{ matrix.build_variant == 'Viewer' }} | |
| BUILD_APPEARANCE_UTIL: false # ${{ startsWith(matrix.runner, 'ubuntu-') && matrix.build_variant == 'Viewer' }} | |
| BUILD_TESTS: ${{ matrix.build_variant == 'Tests' }} | |
| # Build Config | |
| BUILD_ARCH: ${{ matrix.arch }} | |
| BUILD_CONFIG: ${{ matrix.configuration }} | |
| BUILD_TYPE: ${{ needs.setup.outputs.build_type }} | |
| # Crash Reporting - Disabled on linux | |
| RELEASE_CRASH_REPORTING: ${{ !startsWith(matrix.runner, 'ubuntu-') && needs.setup.outputs.build_type == 'proprietary' }} | |
| # Viewer Channel | |
| VIEWER_CHANNEL: ${{ needs.setup.outputs.viewer_channel }} | |
| VIEWER_GRID: "agni" | |
| # Link Time Optimization | |
| USE_LTO: ${{ matrix.configuration == 'release' }} | |
| # Setting this variable directs Linden's TUT test driver code to capture | |
| # test-program log output at the specified level, but to display it only if | |
| # the individual test fails. | |
| LOGFAIL: DEBUG | |
| master_message_template_checkout: ${{ github.workspace }}/.master-message-template | |
| # vcpkg Setup | |
| VCPKG_ROOT: ${{ github.workspace }}/vcpkg | |
| VCPKG_USERNAME: ${{ github.repository_owner }} | |
| VCPKG_FEED_URL: https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json | |
| VCPKG_BINARY_SOURCES: "clear;nuget,https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json,readwrite" | |
| steps: | |
| - name: Linux Dependency Install and Disk Cleanup | |
| if: runner.os == 'Linux' | |
| run: | | |
| sudo apt update | |
| sudo apt install -y \ | |
| autoconf autoconf-archive automake bison build-essential cmake curl flex gettext \ | |
| libasound2-dev libaudio-dev libdbus-1-dev libdbus-1-dev libdecor-0-dev libdrm-dev \ | |
| libegl1-mesa-dev libfribidi-dev libgbm-dev libgl1-mesa-dev libgles2-mesa-dev \ | |
| libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libibus-1.0-dev libjack-dev libltdl-dev \ | |
| libosmesa6-dev libpipewire-0.3-dev libpulse-dev libsndio-dev libtext-unidecode-perl \ | |
| libthai-dev libtool libudev-dev libunwind-dev liburing-dev libvlc-dev libwayland-dev \ | |
| libx11-dev libxcursor-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev \ | |
| libxkbcommon-dev libxrandr-dev libxss-dev libxtst-dev linux-libc-dev mono-complete \ | |
| nasm ninja-build pkgconf tar tex-common texinfo unzip zip | |
| sudo locale-gen en_US.UTF-8 | |
| sudo locale-gen en_GB.UTF-8 | |
| sudo locale-gen fr_FR.UTF-8 | |
| df -h | |
| sudo docker container prune -f | |
| sudo docker image prune -a -f | |
| sudo rm -rf /usr/local/lib/android | |
| sudo rm -rf /opt/ghc | |
| sudo rm -rf /usr/local/.ghcup | |
| df -h | |
| - name: macOS Homebrew Dependency Install | |
| if: runner.os == 'macOS' | |
| run: | | |
| brew install autoconf autoconf-archive automake libtool mono nasm unzip zip | |
| - name: Checkout code | |
| uses: actions/checkout@v7 | |
| with: | |
| submodules: recursive | |
| ref: ${{ github.event.pull_request.head.sha || github.sha }} | |
| - name: Checkout master-message-template | |
| uses: actions/checkout@v7 | |
| with: | |
| repository: secondlife/master-message-template | |
| path: .master-message-template | |
| - name: Setup python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: "3.14" | |
| - name: Install python dependencies | |
| run: pip3 install llsd cmake ninja | |
| - name: Bootstrap vcpkg Windows | |
| if: runner.os == 'Windows' | |
| run: | | |
| ./vcpkg/bootstrap-vcpkg.bat | |
| - name: Bootstrap vcpkg non-Windows | |
| if: runner.os == 'macOS' || runner.os == 'Linux' | |
| run: | | |
| ./vcpkg/bootstrap-vcpkg.sh | |
| - name: Set up vcpkg nuget caching | |
| shell: bash | |
| run: | | |
| if [[ "$RUNNER_OS" == "Windows" ]] | |
| then | |
| $(${VCPKG_ROOT}/vcpkg fetch nuget | tail -n 1) \ | |
| sources add \ | |
| -Source "${{ env.VCPKG_FEED_URL }}" \ | |
| -StorePasswordInClearText \ | |
| -Name GitHubPackages \ | |
| -UserName "${{ env.VCPKG_USERNAME }}" \ | |
| -Password "${{ secrets.GITHUB_TOKEN }}" | |
| $(${VCPKG_ROOT}/vcpkg fetch nuget | tail -n 1) \ | |
| setapikey "${{ secrets.GITHUB_TOKEN }}" \ | |
| -Source "${{ env.VCPKG_FEED_URL }}" | |
| else | |
| mono $(${VCPKG_ROOT}/vcpkg fetch nuget | tail -n 1) \ | |
| sources add \ | |
| -Source "${{ env.VCPKG_FEED_URL }}" \ | |
| -StorePasswordInClearText \ | |
| -Name GitHubPackages \ | |
| -UserName "${{ env.VCPKG_USERNAME }}" \ | |
| -Password "${{ secrets.GITHUB_TOKEN }}" | |
| mono $(${VCPKG_ROOT}/vcpkg fetch nuget | tail -n 1) \ | |
| setapikey "${{ secrets.GITHUB_TOKEN }}" \ | |
| -Source "${{ env.VCPKG_FEED_URL }}" | |
| fi | |
| - name: Cache Rust Dependencies | |
| uses: actions/cache@v6 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} | |
| - name: Configure | |
| id: configure | |
| shell: bash | |
| env: | |
| HAVOK: false # ${{ needs.setup.outputs.build_type == 'proprietary' }} | |
| run: | | |
| set -x | |
| # Set VCPKG root | |
| export VCPKG_ROOT=$VCPKG_INSTALLATION_ROOT | |
| [ -n "$master_message_template_checkout" ] \ | |
| && [ -r "$master_message_template_checkout/message_template.msg" ] \ | |
| && template_verifier_master_url="-DTEMPLATE_VERIFIER_MASTER_URL=file://$master_message_template_checkout/message_template.msg" | |
| cmake_preset_postfix="" | |
| if [[ "$BUILD_TYPE" != "proprietary" ]] | |
| then | |
| cmake_preset_postfix="-os" | |
| fi | |
| SIGNING=() | |
| case "$RUNNER_OS" in | |
| Windows) | |
| cmake_preset_name="vs2026$cmake_preset_postfix" | |
| build_directory="build-Windows-$cmake_preset_name" | |
| vcpkg_triplet="x64-windows-alchemy-release" | |
| ;; | |
| macOS) | |
| cmake_preset_name="ninja$cmake_preset_postfix-$BUILD_ARCH" | |
| build_directory="build-Darwin-$cmake_preset_name" | |
| vcpkg_triplet="$BUILD_ARCH-osx-alchemy-release" | |
| ;; | |
| Linux) | |
| cmake_preset_name="ninja$cmake_preset_postfix" | |
| build_directory="build-Linux-$cmake_preset_name" | |
| vcpkg_triplet="x64-linux-alchemy-release" | |
| ;; | |
| esac | |
| echo "build_directory=$build_directory" >> "$GITHUB_OUTPUT" | |
| echo "cmake_preset=$cmake_preset_name" >> "$GITHUB_OUTPUT" | |
| cmake -S indra --preset $cmake_preset_name \ | |
| -DVCPKG_TARGET_TRIPLET="$vcpkg_triplet" \ | |
| -DBUILD_VIEWER:BOOL="$BUILD_VIEWER" \ | |
| -DBUILD_APPEARANCE_UTIL:BOOL="$BUILD_APPEARANCE_UTIL" \ | |
| -DBUILD_TESTING:BOOL="$BUILD_TESTS" \ | |
| -DPACKAGE:BOOL=ON \ | |
| -DUSE_VELOPACK:BOOL=ON \ | |
| -DHAVOK:BOOL="$HAVOK" \ | |
| -DUSE_LTO:BOOL="$USE_LTO" \ | |
| -DDISABLE_RELEASE_DEBUG_LOGGING=ON \ | |
| -DRELEASE_CRASH_REPORTING:BOOL="$RELEASE_CRASH_REPORTING" \ | |
| -DBUGSPLAT_DB:STRING="${BUGSPLAT_DB:-}" \ | |
| -DVIEWER_CHANNEL:STRING="${VIEWER_CHANNEL}" \ | |
| -DGRID:STRING="\"$VIEWER_GRID\"" \ | |
| -DTEMPLATE_VERIFIER_OPTIONS:STRING="$template_verifier_options" $template_verifier_master_url \ | |
| "${SIGNING[@]}" | |
| - name: Build | |
| id: build | |
| shell: bash | |
| env: | |
| BUILD_DIRECTORY: ${{ steps.configure.outputs.build_directory }} | |
| CMAKE_PRESET_NAME: ${{ steps.configure.outputs.cmake_preset }} | |
| CTEST_OUTPUT_ON_FAILURE: 1 # Output log on test failure | |
| working-directory: "${{ github.workspace }}/indra" | |
| run: | | |
| set -x | |
| # Set VCPKG root | |
| export VCPKG_ROOT=$VCPKG_INSTALLATION_ROOT | |
| if $BUILD_TESTS | |
| then | |
| # Now build the tests. We want to build them in a separate step before running them. | |
| cmake --build --preset $CMAKE_PRESET_NAME-$BUILD_CONFIG | |
| # Now that we've built the tests, we can run them to validate the build. | |
| # If the tests fail, their output will be visible in the logs due to | |
| # CTEST_OUTPUT_ON_FAILURE above, and the build step will be marked as failed. | |
| cmake --build --preset $CMAKE_PRESET_NAME-$BUILD_CONFIG --target BUILD_AND_RUN_TESTS | |
| elif $BUILD_VIEWER | |
| then | |
| cmake --build --preset $CMAKE_PRESET_NAME-$BUILD_CONFIG || fatal "failed building $BUILD_CONFIG viewer" | |
| else | |
| echo "::notice::Skipping build due to both viewer and tests being disabled" | |
| fi | |
| # Each artifact is downloaded as a distinct .zip file. Multiple jobs | |
| # (per the matrix above) writing the same filepath to the same | |
| # artifact name will *overwrite* that file. Moreover, they can | |
| # interfere with each other, causing the upload to fail. | |
| # https://github.com/actions/upload-artifact#uploading-to-the-same-artifact | |
| # Given the size of our installers, and the fact that we typically | |
| # only want to download just one instead of a single zip containing | |
| # several, generate a distinct artifact name for each installer. | |
| # If the matrix above can run multiple builds on the same | |
| # platform, we must disambiguate on more than the platform name. | |
| # e.g. if we were still running Windows 32-bit builds, we'd need to | |
| # qualify the artifact with bit width. | |
| if [[ "$BUILD_TYPE" != "proprietary" ]] | |
| then cfg_suffix='-OS' | |
| else cfg_suffix='' | |
| fi | |
| echo "artifact=$RUNNER_OS$cfg_suffix-$BUILD_ARCH" >> $GITHUB_OUTPUT | |
| # Gather version metadata | |
| if [ -r "$BUILD_DIRECTORY/newview/viewer_version.txt" ] | |
| then | |
| viewer_version="$(<"$BUILD_DIRECTORY/newview/viewer_version.txt")" | |
| echo "viewer_version=$viewer_version" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Upload executable | |
| uses: actions/upload-artifact@v7 | |
| if: matrix.configuration == 'release' && matrix.build_variant == 'Viewer' | |
| with: | |
| name: "${{ steps.build.outputs.artifact }}-app" | |
| if-no-files-found: error | |
| compression-level: 9 | |
| path: | | |
| ${{ steps.build.outputs.viewer_app }} | |
| # The other upload of nontrivial size is the symbol file. Use a distinct | |
| # artifact for that too. | |
| - name: Upload Windows symbol file | |
| uses: actions/upload-artifact@v7 | |
| if: runner.os == 'Windows' && matrix.configuration == 'release' && matrix.build_variant == 'Viewer' && needs.setup.outputs.build_type == 'proprietary' | |
| with: | |
| name: "${{ steps.build.outputs.artifact }}-symbols" | |
| if-no-files-found: error | |
| path: | | |
| ${{ steps.configure.outputs.build_directory }}/symbols/Release/${{ needs.setup.outputs.viewer_channel }}.sym.tar.xz | |
| - name: Upload macOS symbol file | |
| uses: actions/upload-artifact@v7 | |
| if: runner.os == 'macOS' && matrix.configuration == 'release' && matrix.build_variant == 'Viewer' && needs.setup.outputs.build_type == 'proprietary' | |
| with: | |
| name: "${{ steps.build.outputs.artifact }}-symbols" | |
| if-no-files-found: error | |
| path: | | |
| ${{ steps.configure.outputs.build_directory }}/symbols/Release/${{ needs.setup.outputs.viewer_channel }}.xcarchive.zip | |
| - name: Upload metadata | |
| uses: actions/upload-artifact@v7 | |
| if: matrix.configuration == 'release' && matrix.build_variant == 'Viewer' | |
| with: | |
| name: "${{ steps.build.outputs.artifact }}-metadata" | |
| if-no-files-found: error | |
| compression-level: 9 | |
| path: | | |
| ${{ steps.configure.outputs.build_directory }}/newview/viewer_version.txt | |
| # - name: Upload appearance utility package | |
| # uses: actions/upload-artifact@v7 | |
| # if: runner.os == 'Linux' && matrix.configuration == 'release' && matrix.build_variant == 'Viewer' | |
| # with: | |
| # name: "${{ steps.build.outputs.artifact }}-appearanceutility" | |
| # path: | | |
| # ${{ steps.configure.outputs.build_directory }}/llappearanceutility/Release/appearance-utility-bin | |
| # ${{ steps.configure.outputs.build_directory }}/llappearanceutility/Release/appearance-utility-headless-bin | |
| sign-and-package-windows: | |
| needs: [setup, build] | |
| runs-on: windows-2025 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v7 | |
| with: | |
| persist-credentials: false | |
| submodules: recursive | |
| ref: ${{ github.event.pull_request.head.sha || github.sha }} | |
| - name: Setup .NET for Velopack | |
| uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: '10.x' | |
| - name: Install Velopack CLI | |
| run: dotnet tool restore | |
| - name: Fetch Windows app | |
| uses: actions/download-artifact@v8 | |
| if: needs.setup.outputs.build_type == 'proprietary' | |
| with: | |
| name: Windows-x64-app | |
| path: .app | |
| - name: Fetch Windows OS app | |
| uses: actions/download-artifact@v8 | |
| if: needs.setup.outputs.build_type != 'proprietary' | |
| with: | |
| name: Windows-OS-x64-app | |
| path: .app | |
| - name: Build and sign Velopack package | |
| shell: bash | |
| env: | |
| PACK_ID: ${{ needs.build.outputs.velopack_pack_id }} | |
| PACK_VERSION: ${{ needs.build.outputs.velopack_pack_version }} | |
| PACK_TITLE: ${{ needs.build.outputs.velopack_pack_title }} | |
| PACK_AUTHORS: ${{ needs.build.outputs.velopack_pack_authors }} | |
| MAIN_EXE: ${{ needs.build.outputs.velopack_main_exe }} | |
| EXCLUDE: ${{ needs.build.outputs.velopack_exclude }} | |
| ICON: ${{ needs.build.outputs.velopack_icon }} | |
| SPLASH_IMAGE: ${{ needs.build.outputs.velopack_splash }} | |
| SPLASH_COLOR: ${{ needs.build.outputs.velopack_splash_color }} | |
| INSTALLER_BASE: ${{ needs.build.outputs.velopack_installer_base }} | |
| run: | | |
| set -x | |
| vpk_args=( | |
| dotnet vpk pack | |
| --packId "$PACK_ID" | |
| --packVersion "$PACK_VERSION" | |
| --packAuthors "$PACK_AUTHORS" | |
| --packDir .app | |
| --mainExe "$MAIN_EXE" | |
| --packTitle "$PACK_TITLE" | |
| --exclude "$EXCLUDE" | |
| --shortcuts '' | |
| --splashProgressColor "$SPLASH_COLOR" | |
| ) | |
| # Add icon if provided | |
| if [[ -n "$ICON" && -f ".app/$ICON" ]]; then | |
| vpk_args+=(--icon ".app/$ICON") | |
| fi | |
| # Add splash if provided | |
| if [[ -n "$SPLASH_IMAGE" && -f ".app/$SPLASH_IMAGE" ]]; then | |
| vpk_args+=(--splashImage ".app/$SPLASH_IMAGE") | |
| fi | |
| "${vpk_args[@]}" | |
| - name: Rename Velopack outputs | |
| shell: bash | |
| env: | |
| PACK_ID: ${{ needs.build.outputs.velopack_pack_id }} | |
| INSTALLER_BASE: ${{ needs.build.outputs.velopack_installer_base }} | |
| run: | | |
| # Move Setup.exe into .app for the installer upload step | |
| setup="Releases/${PACK_ID}-win-Setup.exe" | |
| if [[ -f "$setup" ]]; then | |
| mv "$setup" ".app/${INSTALLER_BASE}_Setup.exe" | |
| echo "Moved $setup to .app/${INSTALLER_BASE}_Setup.exe" | |
| fi | |
| # Rename Portable.zip to include version | |
| portable="Releases/${PACK_ID}-win-Portable.zip" | |
| if [[ -f "$portable" ]]; then | |
| mv "$portable" "Releases/${INSTALLER_BASE}_Portable.zip" | |
| echo "Moved $portable to Releases/${INSTALLER_BASE}_Portable.zip" | |
| fi | |
| - name: Find Velopack installer | |
| id: find-installer | |
| shell: bash | |
| run: | | |
| installer="$(ls -t .app/*_Setup.exe 2>/dev/null | head -n 1 || true)" | |
| if [[ -z "$installer" ]]; then | |
| echo "::error::No Velopack installer found under .app" | |
| exit 1 | |
| fi | |
| echo "installer=$installer" >> "$GITHUB_OUTPUT" | |
| - name: Post the installer | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: "Windows-installer" | |
| path: ${{ steps.find-installer.outputs.installer }} | |
| if-no-files-found: error | |
| - name: Upload Velopack releases | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: "Windows-releases" | |
| path: Releases/ | |
| if-no-files-found: error | |
| # sign-and-package-mac: | |
| # env: | |
| # NOTARIZE_CREDS_MACOS: ${{ secrets.NOTARIZE_CREDS_MACOS }} | |
| # SIGNING_CERT_MACOS: ${{ secrets.SIGNING_CERT_MACOS }} | |
| # SIGNING_CERT_MACOS_IDENTITY: ${{ secrets.SIGNING_CERT_MACOS_IDENTITY }} | |
| # SIGNING_CERT_MACOS_PASSWORD: ${{ secrets.SIGNING_CERT_MACOS_PASSWORD }} | |
| # needs: [setup, build] | |
| # runs-on: macos-latest | |
| # if: needs.setup.outputs.build_type == 'proprietary' | |
| # steps: | |
| # - name: Unpack Mac notarization credentials | |
| # if: env.NOTARIZE_CREDS_MACOS | |
| # id: note-creds | |
| # shell: bash | |
| # run: | | |
| # # In NOTARIZE_CREDS_MACOS we expect to find: | |
| # # USERNAME="..." | |
| # # PASSWORD="..." | |
| # # TEAM_ID="..." | |
| # eval "${{ env.NOTARIZE_CREDS_MACOS }}" | |
| # echo "::add-mask::$USERNAME" | |
| # echo "::add-mask::$PASSWORD" | |
| # echo "::add-mask::$TEAM_ID" | |
| # echo "note_user=$USERNAME" >> "$GITHUB_OUTPUT" | |
| # echo "note_pass=$PASSWORD" >> "$GITHUB_OUTPUT" | |
| # echo "note_team=$TEAM_ID" >> "$GITHUB_OUTPUT" | |
| # # If we didn't manage to retrieve all of these credentials, better | |
| # # find out sooner than later. | |
| # [[ -n "$USERNAME" && -n "$PASSWORD" && -n "$TEAM_ID" ]] | |
| # - name: Sign and package Mac viewer | |
| # if: env.SIGNING_CERT_MACOS && env.SIGNING_CERT_MACOS_IDENTITY && env.SIGNING_CERT_MACOS_PASSWORD && steps.note-creds.outputs.note_user && steps.note-creds.outputs.note_pass && steps.note-creds.outputs.note_team | |
| # uses: secondlife/viewer-build-util/sign-pkg-mac@v2 | |
| # with: | |
| # channel: ${{ needs.setup.outputs.viewer_channel }} | |
| # imagename: ${{ needs.build.outputs.imagename }} | |
| # cert_base64: ${{ env.SIGNING_CERT_MACOS }} | |
| # cert_name: ${{ env.SIGNING_CERT_MACOS_IDENTITY }} | |
| # cert_pass: ${{ env.SIGNING_CERT_MACOS_PASSWORD }} | |
| # note_user: ${{ steps.note-creds.outputs.note_user }} | |
| # note_pass: ${{ steps.note-creds.outputs.note_pass }} | |
| # note_team: ${{ steps.note-creds.outputs.note_team }} | |
| # post-windows-symbols: | |
| # env: | |
| # BUGSPLAT_DATABASE: "${{ secrets.BUGSPLAT_DATABASE }}" | |
| # SYMBOL_UPLOAD_CLIENT_ID: "${{ secrets.BUGSPLAT_SYMBOL_UPLOAD_CLIENT_ID }}" | |
| # SYMBOL_UPLOAD_CLIENT_SECRET: "${{ secrets.BUGSPLAT_SYMBOL_UPLOAD_CLIENT_SECRET }}" | |
| # needs: [setup, build] | |
| # if: needs.setup.outputs.build_type == 'proprietary' | |
| # runs-on: ubuntu-latest | |
| # steps: | |
| # - name: Download viewer exe | |
| # uses: actions/download-artifact@v8 | |
| # with: | |
| # name: Windows-x64-app | |
| # path: _artifacts | |
| # - name: Download Windows Symbols | |
| # if: env.BUGSPLAT_DATABASE && env.SYMBOL_UPLOAD_CLIENT_ID | |
| # uses: actions/download-artifact@v8 | |
| # with: | |
| # name: Windows-x64-symbols | |
| # - name: Extract viewer pdb | |
| # if: env.BUGSPLAT_DATABASE && env.SYMBOL_UPLOAD_CLIENT_ID | |
| # shell: bash | |
| # run: | | |
| # tar -xJf "${{ needs.setup.outputs.viewer_channel }}.sym.tar.xz" -C _artifacts | |
| # - name: Post Windows symbols | |
| # if: env.BUGSPLAT_DATABASE && env.SYMBOL_UPLOAD_CLIENT_ID | |
| # uses: BugSplat-Git/symbol-upload@2a0d2b8cf9c54c494144048f25da863d93a02ccd | |
| # with: | |
| # clientId: "${{ env.SYMBOL_UPLOAD_CLIENT_ID }}" | |
| # clientSecret: "${{ env.SYMBOL_UPLOAD_CLIENT_SECRET }}" | |
| # database: "${{ env.BUGSPLAT_DATABASE }}" | |
| # application: ${{ needs.setup.outputs.viewer_channel }} | |
| # version: ${{ needs.build.outputs.viewer_version }} | |
| # directory: _artifacts | |
| # files: "**/{SecondLifeViewer.exe,llwebrtc.dll,*.pdb}" | |
| # node-version: "22" | |
| # dumpSyms: false | |
| # post-mac-symbols: | |
| # env: | |
| # BUGSPLAT_DATABASE: "${{ secrets.BUGSPLAT_DATABASE }}" | |
| # SYMBOL_UPLOAD_CLIENT_ID: "${{ secrets.BUGSPLAT_SYMBOL_UPLOAD_CLIENT_ID }}" | |
| # SYMBOL_UPLOAD_CLIENT_SECRET: "${{ secrets.BUGSPLAT_SYMBOL_UPLOAD_CLIENT_SECRET }}" | |
| # needs: [setup, build] | |
| # if: needs.setup.outputs.build_type == 'proprietary' | |
| # runs-on: ubuntu-latest | |
| # steps: | |
| # - name: Download Mac Symbols | |
| # if: env.BUGSPLAT_DATABASE && env.SYMBOL_UPLOAD_CLIENT_ID | |
| # uses: actions/download-artifact@v8 | |
| # with: | |
| # name: macOS-x64-symbols | |
| # - name: Post Mac symbols | |
| # if: env.BUGSPLAT_DATABASE && env.SYMBOL_UPLOAD_CLIENT_ID | |
| # uses: BugSplat-Git/symbol-upload@2a0d2b8cf9c54c494144048f25da863d93a02ccd | |
| # with: | |
| # clientId: "${{ env.SYMBOL_UPLOAD_CLIENT_ID }}" | |
| # clientSecret: "${{ env.SYMBOL_UPLOAD_CLIENT_SECRET }}" | |
| # database: "${{ env.BUGSPLAT_DATABASE }}" | |
| # application: ${{ needs.setup.outputs.viewer_channel }} | |
| # version: ${{ needs.build.outputs.viewer_version }} (${{ needs.build.outputs.viewer_version }}) | |
| # directory: . | |
| # files: "**/*.xcarchive.zip" | |
| # node-version: "22" | |
| # dumpSyms: false | |
| release: | |
| needs: [setup, build, sign-and-package-windows] | |
| runs-on: ubuntu-latest | |
| if: needs.setup.outputs.release_run | |
| permissions: | |
| contents: write | |
| steps: | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| pattern: "*-installer" | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| pattern: "*-releases" | |
| - uses: actions/download-artifact@v8 | |
| with: | |
| name: "Linux-x64-app" | |
| # forked from softprops/action-gh-release | |
| - name: Create GitHub release | |
| id: release | |
| uses: AlchemyViewer/action-gh-release@v3 | |
| with: | |
| # name the release page for the branch. We want channel and version. | |
| name: "${{ needs.setup.outputs.viewer_channel }} ${{ needs.build.outputs.viewer_version }}" | |
| body: | | |
| prerelease: true | |
| generate_release_notes: true | |
| target_commitish: ${{ github.sha }} | |
| append_body: true | |
| fail_on_unmatched_files: true | |
| files: | | |
| Windows-installer/*.exe | |
| *.tar.xz | |
| Windows-releases/* | |
| - name: post release URL | |
| run: | | |
| echo "::notice::Release ${{ steps.release.outputs.url }}" |