name: Steam Upload description: Creates and uploads stable and nightly builds of obs-studio and beta builds (if available) inputs: steamSecret: description: Steam auth code required: true steamUser: description: Steam user name required: true steamPassword: description: Steam user password required: true workflowSecret: description: GitHub API token to use for API calls required: true tagName: description: Tag name to use for packaging required: false default: '' stableBranch: description: Name of the stable branch to use required: false default: staging betaBranch: description: Name of the beta branch to use required: false default: beta_staging nightlyBranch: description: Name of the nightly branch to use required: false default: nightly playtestBranch: description: Name of the playtest branch to use required: false default: staging customAssetWindows: description: Custom asset for Windows required: false default: '' customAssetMacOSApple: description: Custom asset for macOS Apple Silicon required: false default: '' customAssetMacOSIntel: description: Custom asset for macOS Intel required: false default: '' preview: description: Enable preview mode (no uploads done) required: false default: '' runs: using: composite steps: - name: Check Runner Operating System 🏃‍♂️ if: runner.os != 'macOS' shell: bash run: | : Check Runner Operating System 🏃‍♂️ echo '::error::steam-upload action requires a macOS-based runner.' exit 2 - name: Check GitHub Event 🔬 if: contains(fromJSON('["release", "workflow_dispatch", "schedule"]'), github.event_name) != true shell: zsh --no-rcs --errexit --pipefail {0} run: | : Check GitHub Event 🔬 print "::error:steam-upload action can only be used with 'release', 'workflow-dispatch', or 'schedule' events." exit 2 - name: Download Nightly Assets 🌙 id: asset-info-nightly uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 if: github.event_name == 'schedule' - name: Download Assets 📥 id: asset-info shell: zsh --no-rcs --errexit --pipefail {0} env: GH_TOKEN: ${{ inputs.workflowSecret }} windows_custom_asset: ${{ inputs.customAssetWindows }} macos_apple_custom_asset: ${{ inputs.customAssetMacOSApple }} macos_intel_custom_asset: ${{ inputs.customAssetMacOSIntel }} run: | : Download Assets 📥 if (( ${+RUNNER_DEBUG} )) setopt XTRACE local root_dir="${PWD}" local description local is_prerelease case ${GITHUB_EVENT_NAME} { release) gh release download ${{ inputs.tagName }} \ --pattern '*.dmg' \ --pattern '*.zip' \ --clobber IFS=';' read -r is_prerelease description <<< \ "$(gh release view ${{ inputs.tagName }} --json isPrerelease,tagName --jq 'join(";")')" ;; workflow_dispatch) if [[ '${{ inputs.tagName }}' =~ [0-9]+\.[0-9]+\.[0-9]+(-(rc|beta)[0-9]+)*$ ]] { gh release download ${{ inputs.tagName }} \ --pattern '*.dmg' \ --pattern '*.zip' \ --clobber description='${{ inputs.tagName }}' read -r is_prerelease <<< \ "$(gh release view ${{ inputs.tagName }} --json isPrerelease --jq '.isPrerelease')" local -A custom_assets=( windows "Windows x64;${windows_custom_asset}" macos_apple "macOS Apple;${macos_apple_custom_asset}" macos_intel "macOS Intel;${macos_intel_custom_asset}" ) local display_name local url mkdir -p custom_assets && pushd custom_assets for platform (windows macos_apple macos_intel) { IFS=';' read -r display_name url <<< "${custom_assets[${platform}]}" if [[ ${url} ]] { print "::group::Download of ${display_name} custom asset" curl --location --silent --remote-name ${url} if [[ ! -f ${root_dir}/${url:t} ]] { print "::warning::Custom asset for ${display_name} does not replace an existing release asset" } else { rm -rf -- ${root_dir}/${url:t} } mv ${url:t} ${root_dir} print '::endgroup::' } } popd } else { print "::error::Invalid tag name for non-release workflow run: '${{ inputs.tagName }}'." exit 2 } ;; schedule) local short_hash="${GITHUB_SHA:0:9}" mv obs-studio-windows-x64-${short_hash}/obs-studio-*-windows-x64.zip \ ${root_dir} mv obs-studio-macos-arm64-${short_hash}/obs-studio-*-macos-apple.dmg \ ${root_dir} mv obs-studio-macos-x86_64-${short_hash}/obs-studio-*-macos-intel.dmg \ ${root_dir} description="g${GITHUB_SHA:0:9}" is_prerelease='false' ;; } print "description=${description}" >> $GITHUB_OUTPUT print "is_prerelease=${is_prerelease}" >> $GITHUB_OUTPUT - name: Prepare Builds for Steam 🍜 shell: zsh --no-rcs --errexit --pipefail --extendedglob {0} run: | : Prepare Builds for Steam 🍜 if (( ${+RUNNER_DEBUG} )) setopt XTRACE local root_dir="${PWD}" mkdir -p steam && pushd steam print '::group::Prepare Windows x64 assets' mkdir -p steam-windows && pushd steam-windows unzip ${root_dir}/(#i)obs-studio-*-windows-x64.zip rm ${root_dir}/(#i)obs-studio-*-windows*.zip cp -r ${root_dir}/build-aux/steam/scripts_windows scripts touch disable_updater popd print '::endgroup::' print '::group::Prepare macOS Apple assets' mkdir -p steam-macos/arm64/OBS.app hdiutil attach -noverify -readonly -noautoopen -mountpoint /Volumes/obs-studio-arm64 ${root_dir}/(#i)obs-studio-*-macos-apple.dmg ditto /Volumes/obs-studio-arm64/OBS.app steam-macos/arm64/OBS.app hdiutil unmount /Volumes/obs-studio-arm64 rm ${root_dir}/(#i)obs-studio-*-macos-apple.dmg print '::endgroup::' print '::group::Prepare macOS Intel assets' mkdir -p steam-macos/x86_64/OBS.app hdiutil attach -noverify -readonly -noautoopen -mountpoint /Volumes/obs-studio-x86_64 ${root_dir}/(#i)obs-studio-*-macos-intel.dmg ditto /Volumes/obs-studio-x86_64/OBS.app steam-macos/x86_64/OBS.app hdiutil unmount /Volumes/obs-studio-x86_64 rm ${root_dir}/(#i)obs-studio-*-macos-intel.dmg print '::endgroup::' cp ${root_dir}/build-aux/steam/scripts_macos/launch.sh steam-macos/launch.sh popd - name: Set Up steamcmd 🚂 uses: andriivitiv/setup-steamcmd@afc45f145b95c175c3a3862d3ca84756537d48e8 # v1.3.0 - name: Generate Steam auth code 🔐 id: steam-totp uses: andriivitiv/steam-totp@1661caebf0a84a79be0166020f81837039137101 # v1.2.0 if: ${{ ! fromJSON(inputs.preview) }} with: shared_secret: ${{ inputs.steamSecret }} - name: Upload to Steam 📤 shell: zsh --no-rcs --errexit --pipefail {0} run: | : Upload to Steam 📤 if (( ${+RUNNER_DEBUG} )) setopt XTRACE local root_dir="${PWD}" local build_file='build.vdf' local branch_name pushd steam print '::group::Prepare Steam Build Script' case ${GITHUB_EVENT_NAME} { schedule) branch_name='${{ inputs.nightlyBranch }}' ;; release|workflow_dispatch) if [[ '${{ steps.asset-info.outputs.is_prerelease }}' == 'true' ]] { branch_name='${{ inputs.betaBranch }}' } else { branch_name='${{ inputs.stableBranch }}' } ;; } sed "s/@@DESC@@/${branch_name}-${{ steps.asset-info.outputs.description }}/;s/@@BRANCH@@/${branch_name}/" \ ${root_dir}/build-aux/steam/obs_build.vdf > ${build_file} print "Generated ${build_file}:\n$(<${build_file})" print '::endgroup::' print '::group::Upload to Steam' local preview='${{ inputs.preview }}' steamcmd \ +login '${{ inputs.steamUser }}' '${{ inputs.steamPassword }}' '${{ steps.steam-totp.outputs.code }}' \ +run_app_build ${preview:+-preview} ${build_file:a} \ +quit print '::endgroup' popd - name: Generate Steam auth code 🔐 id: steam-totp-playtest uses: andriivitiv/steam-totp@1661caebf0a84a79be0166020f81837039137101 # v1.2.0 if: ${{ ! fromJSON(inputs.preview) && fromJSON(steps.asset-info.outputs.is_prerelease) }} with: shared_secret: ${{ inputs.steamSecret }} - name: Upload to Steam (Playtest) 📤 if: fromJSON(steps.asset-info.outputs.is_prerelease) shell: zsh --no-rcs --errexit --pipefail {0} run: | : Upload to Steam Playtest 📤 if (( ${+RUNNER_DEBUG} )) setopt XTRACE local root_dir="${PWD}" local build_file='build_playtest.vdf' local branch_name='${{ inputs.playtestBranch }}' pushd steam print '::group::Prepare Steam Build Script' sed "s/@@DESC@@/${branch_name}-${{ steps.asset-info.outputs.description }}/;s/@@BRANCH@@/${branch_name}/" \ ${root_dir}/build-aux/steam/obs_playtest_build.vdf > ${build_file} print "Generated ${build_file}:\n$(<${build_file})" print '::endgroup::' print '::group::Upload to Steam' local preview if [[ '${{ inputs.preview }}' == 'true' ]] preview='-preview' steamcmd \ +login '${{ inputs.steamUser }}' '${{ inputs.steamPassword }}' '${{ steps.steam-totp-playtest.outputs.code }}' \ +run_app_build ${preview} ${build_file:a} \ +quit print '::endgroup' popd - name: Upload Steam build logs uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: steam-build-logs path: ${{ github.workspace }}/steam/build/*.log