name: VRCX on: - workflow_dispatch concurrency: group: ${{ github.ref }} cancel-in-progress: true permissions: id-token: write contents: write jobs: set_version: runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.version }} date: ${{ steps.version.outputs.date }} steps: - uses: actions/checkout@v5 - id: version run: | export FILENAME="$(cat Version)" export DATE="$(cat Version)" echo "version=${FILENAME}" >> $GITHUB_OUTPUT echo "date=${DATE}" >> $GITHUB_OUTPUT build_dotnet_windows: runs-on: windows-latest defaults: run: shell: bash needs: [set_version, build_node] steps: - uses: actions/checkout@v5 - name: Setup .NET 10 uses: actions/setup-dotnet@v5 with: dotnet-version: '10.0.x' - name: Set version run: | echo "${{ needs.set_version.outputs.version }}" > Version echo "!define PRODUCT_VERSION_FROM_FILE \"${{ needs.set_version.outputs.date }}.0\"" > Installer/version_define.nsh cat Version - uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/Dotnet/VRCX-Cef.csproj') }} restore-keys: | ${{ runner.os }}-nuget- - name: Build Cef .NET Application run: dotnet build Dotnet/VRCX-Cef.csproj -p:Configuration=Release -p:WarningLevel=0 -p:Platform=x64 -p:PlatformTarget=x64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m -a x64 --self-contained - name: Azure login uses: azure/login@v2 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Sign Dotnet executables uses: azure/trusted-signing-action@v0 with: azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} endpoint: https://eus.codesigning.azure.net/ trusted-signing-account-name: ${{ secrets.AZURE_ACCOUNT_NAME }} certificate-profile-name: ${{ secrets.AZURE_PROFILE_NAME }} file-digest: SHA256 timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 files: | ${{ github.workspace }}\build\Cef\CefSharp.BrowserSubprocess.Core.dll ${{ github.workspace }}\build\Cef\CefSharp.Core.dll ${{ github.workspace }}\build\Cef\CefSharp.Core.Runtime.dll ${{ github.workspace }}\build\Cef\CefSharp.dll ${{ github.workspace }}\build\Cef\CefSharp.OffScreen.dll ${{ github.workspace }}\build\Cef\CefSharp.WinForms.dll ${{ github.workspace }}\build\Cef\DiscordRPC.dll ${{ github.workspace }}\build\Cef\libcef.dll ${{ github.workspace }}\build\Cef\libEGL.dll ${{ github.workspace }}\build\Cef\libGLESv2.dll ${{ github.workspace }}\build\Cef\librsync.net.dll ${{ github.workspace }}\build\Cef\VRCX.dll ${{ github.workspace }}\build\Cef\VRCX.exe - name: Download Cef-html artifacts uses: actions/download-artifact@v6 with: name: Cef-html path: build/Cef/html - name: Install NSIS run: choco install nsis -y - name: Create NSIS installer uses: joncloud/makensis-action@v4 with: script-file: Installer/installer.nsi additional-plugin-paths: Installer/Plugins - name: Rename setup run: | file_name="VRCX_${{ needs.set_version.outputs.version }}_Setup.exe" echo "Setup FileName: ${file_name}" mv Installer/VRCX_Setup.exe $file_name - name: Sign Cef setup uses: azure/trusted-signing-action@v0 with: azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }} endpoint: https://eus.codesigning.azure.net/ trusted-signing-account-name: ${{ secrets.AZURE_ACCOUNT_NAME }} certificate-profile-name: ${{ secrets.AZURE_PROFILE_NAME }} file-digest: SHA256 timestamp-rfc3161: http://timestamp.acs.microsoft.com timestamp-digest: SHA256 files: | ${{ github.workspace }}\VRCX_${{ needs.set_version.outputs.version }}_Setup.exe - name: Upload Cef dotnet artifacts uses: actions/upload-artifact@v5 with: name: Cef-Release path: build/Cef - name: Upload setup artifact uses: actions/upload-artifact@v5 with: name: Cef-Setup path: VRCX_${{ needs.set_version.outputs.version }}_Setup.exe build_dotnet_linux: runs-on: ubuntu-latest needs: set_version steps: - uses: actions/checkout@v5 - name: Setup .NET 9 uses: actions/setup-dotnet@v5 with: dotnet-version: '9.0.x' - name: Set version run: | echo "${{ needs.set_version.outputs.version }}" > Version cat Version - uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/Dotnet/VRCX-Electron.csproj') }}-${{ hashFiles('**/Dotnet/VRCX-Electron-arm64.csproj') }} restore-keys: | ${{ runner.os }}-nuget- - name: Build Electron x64 .NET Application run: dotnet build 'Dotnet/VRCX-Electron.csproj' -p:Configuration=Release -p:WarningLevel=0 -p:Platform=x64 -p:PlatformTarget=x64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m -a x64 - name: Upload Electron x64 dotnet artifacts uses: actions/upload-artifact@v5 with: name: Electron-Release-Linux-x64 path: build/Electron - name: Cleanup run: | rm -R build/Electron - name: Build Electron arm64 .NET Application run: dotnet build 'Dotnet/VRCX-Electron-arm64.csproj' -p:Configuration=Release -p:WarningLevel=0 -p:Platform=arm64 -p:PlatformTarget=arm64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m -a arm64 - name: Upload Electron arm64 dotnet artifacts uses: actions/upload-artifact@v5 with: name: Electron-Release-Linux-arm64 path: build/Electron build_dotnet_macos: runs-on: macos-latest needs: set_version steps: - uses: actions/checkout@v5 - name: Setup .NET 9 uses: actions/setup-dotnet@v5 with: dotnet-version: '9.0.x' - name: Set version run: | echo "${{ needs.set_version.outputs.version }}" > Version cat Version - uses: actions/cache@v4 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/Dotnet/VRCX-Electron.csproj') }}-${{ hashFiles('**/Dotnet/VRCX-Electron-arm64.csproj') }} restore-keys: | ${{ runner.os }}-nuget- - name: Build Electron x64 .NET Application run: dotnet build 'Dotnet/VRCX-Electron.csproj' -p:Configuration=Release -p:WarningLevel=0 -p:Platform=x64 -p:PlatformTarget=x64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m -a x64 - name: Upload Electron x64 .NET artifacts uses: actions/upload-artifact@v5 with: name: Electron-Release-macOS-x64 path: build/Electron - name: Cleanup run: | rm -R build/Electron - name: Build Electron arm64 .NET Application run: dotnet build 'Dotnet/VRCX-Electron-arm64.csproj' -p:Configuration=Release -p:WarningLevel=0 -p:Platform=arm64 -p:PlatformTarget=arm64 -p:RestorePackagesConfig=true -t:"Restore;Clean;Build" -m -a arm64 - name: Upload Electron arm64 dotnet artifacts uses: actions/upload-artifact@v5 with: name: Electron-Release-macOS-arm64 path: build/Electron build_node: runs-on: ubuntu-latest needs: [set_version, build_dotnet_linux] steps: - uses: actions/checkout@v5 - name: Set version run: | echo "${{ needs.set_version.outputs.version }}" > Version cat Version - name: Node.js uses: actions/setup-node@v4 with: node-version: lts/* - name: Get npm cache directory id: npm-cache-dir shell: bash run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT} - uses: actions/cache@v4 id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true' with: path: ${{ steps.npm-cache-dir.outputs.dir }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Restore dependencies run: npm ci - name: Build Cef-html env: SENTRY_AUTH_TOKEN: ${{ secrets.SentryAuthToken }} run: npm run prod - name: Upload Cef-html artifacts uses: actions/upload-artifact@v5 with: name: Cef-html path: build/html - name: Build Electron-html env: SENTRY_AUTH_TOKEN: ${{ secrets.SentryAuthToken }} run: npm run prod-linux - name: Download Electron x64 dotnet artifacts uses: actions/download-artifact@v6 with: name: Electron-Release-Linux-x64 path: build/Electron - name: Build x64 AppImage run: npm run build-electron - name: Upload Electron x64 AppImage artifacts uses: actions/upload-artifact@v5 with: name: Electron-AppImage-x64 path: 'build/VRCX_${{ needs.set_version.outputs.version }}_x64.AppImage' - name: Download Electron arm64 dotnet artifacts uses: actions/download-artifact@v6 with: name: Electron-Release-Linux-arm64 path: build/Electron - name: Build arm64 AppImage run: npm run build-electron-arm64 - name: Upload Electron arm64 AppImage artifacts uses: actions/upload-artifact@v5 with: name: Electron-AppImage-arm64 path: 'build/VRCX_${{ needs.set_version.outputs.version }}_arm64.AppImage' build_macos: runs-on: macos-latest needs: [set_version, build_dotnet_macos] steps: - uses: actions/checkout@v5 - name: Set version run: | echo "${{ needs.set_version.outputs.version }}" > Version cat Version - name: Use Node.js uses: actions/setup-node@v4 with: node-version: lts/* - name: Get npm cache directory id: npm-cache-dir shell: bash run: echo "dir=$(npm config get cache)" >> ${GITHUB_OUTPUT} - uses: actions/cache@v4 id: npm-cache # use this to check for `cache-hit` ==> if: steps.npm-cache.outputs.cache-hit != 'true' with: path: ${{ steps.npm-cache-dir.outputs.dir }} key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - name: Restore dependencies run: npm ci - name: Build Electron-html run: npm run prod-linux --arch=x64 - name: Download x64 Electron dotnet artifacts uses: actions/download-artifact@v6 with: name: Electron-Release-macOS-x64 path: build/Electron - name: Build x64 macOS .dmg run: npm run build-electron - name: Upload x64 Electron macOS artifacts uses: actions/upload-artifact@v5 with: name: Electron-MacDmg-x64 path: 'build/VRCX_${{ needs.set_version.outputs.version }}_x64.dmg' - name: Cleanup run: | rm -R build/Electron - name: Build Electron-html run: npm run prod-linux --arch=arm64 - name: Download arm64 Electron dotnet artifacts uses: actions/download-artifact@v6 with: name: Electron-Release-macOS-arm64 path: build/Electron - name: Build arm64 macOS .dmg run: npm run build-electron-arm64 - name: Upload arm64 Electron macOS artifacts uses: actions/upload-artifact@v5 with: name: Electron-MacDmg-arm64 path: 'build/VRCX_${{ needs.set_version.outputs.version }}_arm64.dmg' create_setup: runs-on: ubuntu-latest needs: [ set_version, build_dotnet_windows, build_dotnet_linux, build_dotnet_macos, build_node, build_macos ] steps: - name: Download Cef-Setup artifacts uses: actions/download-artifact@v6 with: name: Cef-Setup - name: Download Cef dotnet artifacts uses: actions/download-artifact@v6 with: name: Cef-Release path: build/Cef - name: Download Cef-html artifacts uses: actions/download-artifact@v6 with: name: Cef-html path: build/Cef/html - name: Make zip run: | file_name="VRCX_${{ needs.set_version.outputs.version }}.zip" cd build/Cef 7z a -tzip ${file_name} * -mx=7 -xr0!*.log mv ${file_name} ../../${file_name} echo "Zip FileName: ${file_name}" - name: Upload Zip artifact uses: actions/upload-artifact@v5 with: name: VRCX-Zip path: 'VRCX_${{ needs.set_version.outputs.version }}.zip'