name: 'BUILD' on: push: paths-ignore: ['**.md'] branches: - master - 'release/**' tags: ['*'] pull_request: paths-ignore: ['**.md'] branches: [master] env: CACHE_REVISION: '006' CEF_BUILD_VERSION_MAC: '5060' CEF_HASH_MAC_X86_64: '88b950aa0bfc001061c35e7f1f3fefba856a6afb35e38b2b7b42ddd8dd239182' CEF_HASH_MAC_ARM64: '98679b92eea6ea9959ac5aa54f46ca60681d8a86c768c35f496dbdd409bf0642' CEF_BUILD_VERSION_LINUX: '5060' CEF_BUILD_VERSION_WIN: '5060' QT_VERSION_MAC: '6.3.1' QT_HASH_MAC_X86_64: 'a83f72a11023b03b6cb2dc365f0a66ad9df31163bbb4fe2df32d601856a9fad3' QT_HASH_MAC_ARM64: '2f30af90c049670a5660656adbb440668aa1b0567f75a5f29e1def9108928403' QT_HASH_MAC_UNIVERSAL: '252e6684f43ab9c6f262c73af739e2296ce391b998da2c4ee04c254aaa07db18' QT_VERSION_WIN: '6.3.1' DEPS_VERSION_MAC: '2022-08-02' DEPS_HASH_MAC_X86_64: '7637e52305e6fc53014b5aabd583f1a4490b1d97450420e977cae9a336a29525' DEPS_HASH_MAC_ARM64: '755e0fa69b17a3ae444e1befa9d91d77e3cafe628fbd1c6333686091826595cd' DEPS_VERSION_WIN: '2022-08-02' VLC_VERSION_MAC: '3.0.8' VLC_HASH_MAC: 'e0149ef4a20a19b9ecd87309c2d27787ee3f47dfd47c6639644bc1f6fd95bdf6' VLC_VERSION_WIN: '3.0.0-git' TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }} TWITCH_HASH: ${{ secrets.TWITCH_HASH }} RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }} RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }} YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }} YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }} YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }} YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }} jobs: clang_check: name: '01 - Code Format Check' runs-on: [ubuntu-22.04] steps: - name: 'Checkout' uses: actions/checkout@v3 with: submodules: 'recursive' - name: 'Install clang-format' run: sudo apt-get install -y clang-format-13 - name: 'Run clang-format' run: | ./CI/check-format.sh ./CI/check-changes.sh - name: 'Install cmake-format' run: sudo pip install cmakelang - name: 'Run cmake-format' run: | ./CI/check-cmake.sh macos_build: name: '02 - macOS' runs-on: [macos-12] strategy: matrix: arch: ['x86_64', 'arm64'] if: always() needs: [clang_check] env: MACOSX_DEPLOYMENT_TARGET_X86_64: '10.15' MACOSX_DEPLOYMENT_TARGET_ARM64: '11.0' SPARKLE_VERSION: '1.26.0' SPARKLE_HASH: '8312cbf7528297a49f1b97692c33cb8d33254c396dc51be394e9484e4b6833a0' BLOCKED_FORMULAS: 'speexdsp curl php composer' CODESIGN_IDENT: '-' HAVE_CODESIGN_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY != '' && secrets.MACOS_SIGNING_CERT != '' }} defaults: run: shell: bash working-directory: 'obs-studio' steps: - name: 'Checkout' uses: actions/checkout@v3 with: submodules: 'recursive' path: 'obs-studio' fetch-depth: 0 - name: 'Check for Github Labels' if: github.event_name == 'pull_request' run: | if test -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')"; then echo "SEEKING_TESTERS=1" >> $GITHUB_ENV else echo "SEEKING_TESTERS=0" >> $GITHUB_ENV fi echo "CACHE_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV - name: 'Restore ccache from cache' id: ccache-cache uses: actions/cache@v3 env: CACHE_NAME: 'ccache-cache' with: path: ${{ github.workspace }}/.ccache key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ matrix.arch }}-${{ env.CACHE_DATE }} - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache uses: actions/cache@v3 env: CACHE_NAME: 'cef-cache' with: path: ${{ github.workspace }}/obs-build-dependencies/cef_binary_${{ env.CEF_BUILD_VERSION_MAC }}_macos_${{ matrix.arch }} key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_MAC }}-${{ matrix.arch }}-${{ env.CACHE_REVISION }} - name: 'Restore VLC dependency from cache' id: vlc-cache uses: actions/cache@v3 env: CACHE_NAME: 'vlc-cache' with: path: ${{ github.workspace }}/obs-build-dependencies/vlc-${{ env.VLC_VERSION_MAC }} key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.VLC_VERSION_MAC }}-${{ env.CACHE_REVISION }} - name: 'Restore Sparkle dependency from cache' id: sparkle-cache uses: actions/cache@v3 env: CACHE_NAME: 'sparkle-cache' with: path: ${{ github.workspace }}/obs-build-dependencies/obs-deps/lib/Sparkle.framework key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.SPARKLE_VERSION }}-${{ env.CACHE_REVISION }} - name: 'Setup build environment' id: setup run: | REMOVE_FORMULAS="" for FORMULA in ${{ env.BLOCKED_FORMULAS }}; do if [ -d "/usr/local/opt/${FORMULA}" ]; then REMOVE_FORMULAS="${REMOVE_FORMULAS}${FORMULA} " fi done if [ -n "${REMOVE_FORMULAS}" ]; then brew uninstall ${REMOVE_FORMULAS} fi echo "::set-output name=commitHash::$(git rev-parse --short=9 HEAD)" - name: 'Switch to Xcode 14 Beta' run: sudo xcode-select -switch /Applications/Xcode_14.0.app - name: 'Install dependencies' env: RESTORED_VLC: ${{ steps.vlc-cache.outputs.cache-hit }} RESTORED_SPARKLE: ${{ steps.sparkle-cache.outputs.cache-hit }} RESTORED_CEF: ${{ steps.cef-cache.outputs.cache-hit }} run: CI/macos/01_install_dependencies.sh --architecture "${{ matrix.arch }}" - name: 'Install Apple Developer Certificate' if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' }} uses: apple-actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071 with: p12-file-base64: ${{ secrets.MACOS_SIGNING_CERT }} p12-password: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }} - name: 'Set Signing Identity' if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' }} run: | echo "CODESIGN_IDENT=${{ secrets.MACOS_SIGNING_IDENTITY }}" >> $GITHUB_ENV echo "BUILD_FOR_DISTRIBUTION=ON" >> $GITHUB_ENV - name: 'Build OBS' run: CI/macos/02_build_obs.sh --codesign --architecture "${{ matrix.arch }}" - name: 'Run tests' if: ${{ success() && matrix.arch == 'x86_64' }} run: cmake --build build -t test - name: 'Create build artifact' if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} run: | CI/macos/03_package_obs.sh --codesign --architecture "${{ matrix.arch }}" ARTIFACT_NAME=$(basename $(/usr/bin/find build -type f -name "obs-studio-*.dmg" -depth 1 | head -1)) echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV - name: 'Upload build Artifact' if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} uses: actions/upload-artifact@v3 with: name: 'obs-studio-macos-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}' path: '${{ github.workspace }}/obs-studio/build/${{ env.FILE_NAME }}' linux_build: name: '02 - Linux' runs-on: ${{ matrix.ubuntu }} strategy: matrix: ubuntu: ['ubuntu-20.04', 'ubuntu-22.04'] if: always() needs: [clang_check] defaults: run: shell: bash working-directory: 'obs-studio' env: BUILD_FOR_DISTRIBUTION: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} steps: - name: 'Checkout' uses: actions/checkout@v3 with: submodules: 'recursive' path: 'obs-studio' fetch-depth: 0 - name: 'Check for Github Labels' if: github.event_name == 'pull_request' run: | if test -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')"; then echo "SEEKING_TESTERS=1" >> $GITHUB_ENV else echo "SEEKING_TESTERS=0" >> $GITHUB_ENV fi echo "CACHE_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV - name: 'Restore ccache from cache' id: ccache-cache uses: actions/cache@v3 env: CACHE_NAME: 'ccache-cache' with: path: ${{ github.workspace }}/.ccache key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ matrix.ubuntu }}-${{ env.CACHE_DATE }} - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache uses: actions/cache@v3 env: CACHE_NAME: 'cef-cache' with: path: ${{ github.workspace }}/obs-build-dependencies/cef_binary_${{ env.CEF_BUILD_VERSION_LINUX }}_linux64 key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_LINUX }}-${{ env.CACHE_REVISION }} - name: 'Setup build environment' id: setup run: | echo "::set-output name=commitHash::$(git rev-parse --short=9 HEAD)" - name: 'Install dependencies' env: RESTORED_CEF: ${{ steps.cef-cache.outputs.cache-hit }} run: CI/linux/01_install_dependencies.sh --disable-pipewire - name: 'Build OBS' run: CI/linux/02_build_obs.sh --disable-pipewire - name: 'Run tests' if: success() run: cmake --build build -t test - name: 'Create build artifact' if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} run: | CI/linux/03_package_obs.sh ARTIFACT_NAME=$(basename $(/usr/bin/find build -maxdepth 1 -type f -name "obs-studio-*.deb" | sort -rn | head -1)) echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV - name: 'Upload build Artifact' if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} uses: actions/upload-artifact@v3 with: name: 'obs-studio-${{ matrix.ubuntu }}-${{ steps.setup.outputs.commitHash }}' path: '${{ github.workspace }}/obs-studio/build/${{ env.FILE_NAME }}' windows_build: name: '02 - Windows' runs-on: [windows-2022] needs: [clang_check] if: always() strategy: matrix: arch: [x64, x86] env: CMAKE_GENERATOR: 'Visual Studio 17 2022' CMAKE_SYSTEM_VERSION: '10.0.18363.657' VIRTUALCAM-GUID: 'A3FCE0F5-3493-419F-958A-ABA1250EC20B' BUILD_FOR_DISTRIBUTION: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} defaults: run: working-directory: 'obs-studio' steps: - name: 'Checkout' uses: actions/checkout@v3 with: submodules: 'recursive' path: 'obs-studio' fetch-depth: 0 - name: 'Add msbuild to PATH' uses: microsoft/setup-msbuild@v1.1 - name: 'Check for Github Labels' if: github.event_name == 'pull_request' run: | $LabelFound = try { (Invoke-RestMethod -Authentication 'Bearer' -Token (ConvertTo-SecureString '${{ secrets.GITHUB_TOKEN }}' -AsPlainText) -Uri "${{ github.event.pull_request.url }}" -UseBasicParsing).labels.name.contains("Seeking Testers") } catch { $false } Write-Output "SEEKING_TESTERS=$(if( $LabelFound -eq $true ) { 1 } else { 0 })" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append - name: 'Restore VLC dependency from cache' id: vlc-cache uses: actions/cache@v3 env: CACHE_NAME: 'vlc-cache' with: path: ${{ github.workspace }}/obs-build-dependencies/vlc-${{ env.VLC_VERSION_WIN }} key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.VLC_VERSION_WIN }}-${{ env.CACHE_REVISION }} - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache uses: actions/cache@v3 env: CACHE_NAME: 'cef-cache' with: path: ${{ github.workspace }}/obs-build-dependencies/cef_binary_${{ env.CEF_BUILD_VERSION_WIN }}_windows_${{ matrix.arch }} key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_WIN }}-${{ matrix.arch }}-${{ env.CACHE_REVISION }} - name: Setup Environment id: setup run: | $CommitHash = git rev-parse --short=9 HEAD Write-Output "::set-output name=commitHash::${CommitHash}" - name: 'Install dependencies' env: RESTORED_VLC: ${{ steps.vlc-cache.outputs.cache-hit }} RESTORED_CEF: ${{ steps.cef-cache.outputs.cache-hit }} run: CI/windows/01_install_dependencies.ps1 -BuildArch ${{ matrix.arch }} - name: 'Build OBS' run: CI/windows/02_build_obs.ps1 -BuildArch ${{ matrix.arch }} - name: 'Create build artifact' if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} run: | CI/windows/03_package_obs.ps1 -BuildArch ${{ matrix.arch }} -Package $ArtifactName = Get-ChildItem -filter "obs-studio-*-windows-${{ matrix.arch }}.zip" -File Write-Output "FILE_NAME=${ArtifactName}" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append - name: 'Upload build artifact' if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} uses: actions/upload-artifact@v3 with: name: 'obs-studio-windows-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}' path: '${{ env.FILE_NAME }}' linux_package: name: '02 - Flatpak Bundle' runs-on: [ubuntu-latest] needs: [clang_check] if: always() defaults: run: shell: bash container: image: bilelmoussaoui/flatpak-github-actions:kde-6.3 options: --privileged steps: - name: 'Check for Github Labels' if: github.event_name == 'pull_request' run: | if ! /usr/bin/command -v "jq" >/dev/null 2>&1; then sudo dnf install -y -q jq; fi if test -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')"; then echo "SEEKING_TESTERS=1" >> $GITHUB_ENV else echo "SEEKING_TESTERS=0" >> $GITHUB_ENV fi - name: 'Checkout' uses: actions/checkout@v3 if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} with: submodules: 'recursive' fetch-depth: 0 - name: 'Setup build environment' if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} run: | git config --global --add safe.directory $GITHUB_WORKSPACE echo "OBS_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV echo "OBS_GIT_HASH=$(git rev-parse --short=9 HEAD)" >> $GITHUB_ENV echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - name: Build Flatpak Manifest uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4 if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} with: bundle: obs-studio-flatpak-${{ env.OBS_GIT_HASH }}.flatpak manifest-path: CI/flatpak/com.obsproject.Studio.json cache-key: flatpak-builder-${{ hashFiles('CI/flatpak/com.obsproject.Studio.json') }} windows_package: name: '03 - Windows Installer' runs-on: [windows-latest] needs: [windows_build] if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} env: BUILD_FOR_DISTRIBUTION: 'ON' steps: - name: 'Checkout' uses: actions/checkout@v3 - name: Setup Environment id: setup run: | $CommitHash = git rev-parse --short=9 HEAD Write-Output "::set-output name=commitHash::${CommitHash}" - name: 'Add msbuild to PATH' uses: microsoft/setup-msbuild@v1.1 - name: 'Download 64-bit artifact' uses: actions/download-artifact@v3 with: name: 'obs-studio-windows-x64-${{ steps.setup.outputs.commitHash }}' - name: 'Download 32-bit artifact' uses: actions/download-artifact@v3 with: name: 'obs-studio-windows-x86-${{ steps.setup.outputs.commitHash }}' - name: 'Unpack Windows build artifacts' id: unpack run: | if (!(Test-Path install_temp)) { $null = New-Item -ItemType Directory -Force -Path install_temp } Expand-Archive -Path "$(Get-ChildItem -filter "obs-studio-*-windows-x86.zip" -File)" -DestinationPath install_temp Expand-Archive -Path "$(Get-ChildItem -filter "obs-studio-*-windows-x64.zip" -File)" -Force -DestinationPath install_temp CI/windows/03_package_obs.ps1 -CombinedArchs -Package $ArtifactName = (Get-ChildItem -filter "obs-studio-*-windows-x86+x64.zip" -File).Name Write-Output "::set-output name=filename::${ArtifactName}" - name: 'Upload build artifact' uses: actions/upload-artifact@v3 with: name: 'obs-studio-windows-installer' path: '${{ steps.unpack.outputs.filename }}' macos_release: name: '03 - macOS notarized image' runs-on: [macos-12] needs: [macos_build] env: HAVE_CODESIGN_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY != '' && secrets.MACOS_SIGNING_CERT != '' }} BUILD_FOR_DISTRIBUTION: 'ON' if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} strategy: matrix: arch: ['x86_64', 'arm64'] defaults: run: shell: bash steps: - name: 'Checkout' if: env.HAVE_CODESIGN_IDENTITY == 'true' uses: actions/checkout@v3 - name: 'Setup build environment' id: setup run: | echo "::set-output name=commitHash::$(git rev-parse --short=9 HEAD)" - name: 'Download artifact' if: env.HAVE_CODESIGN_IDENTITY == 'true' uses: actions/download-artifact@v3 with: name: 'obs-studio-macos-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}' - name: 'Install Apple Developer Certificate' if: env.HAVE_CODESIGN_IDENTITY == 'true' uses: apple-actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071 with: p12-file-base64: ${{ secrets.MACOS_SIGNING_CERT }} p12-password: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }} - name: 'Create disk image for distribution' if: env.HAVE_CODESIGN_IDENTITY == 'true' env: CODESIGN_IDENT: ${{ secrets.MACOS_SIGNING_IDENTITY }} CODESIGN_IDENT_USER: ${{ secrets.MACOS_NOTARIZATION_USERNAME }} CODESIGN_IDENT_PASS: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }} run: | ARTIFACT_NAME=$(/usr/bin/find . -type f -name "obs-studio-*.dmg" -depth 1 | head -1) CI/macos/03_package_obs.sh --notarize-image ${ARTIFACT_NAME} echo "FILE_NAME=$(basename ${ARTIFACT_NAME})" >> $GITHUB_ENV - name: 'Upload build Artifact' if: env.HAVE_CODESIGN_IDENTITY == 'true' uses: actions/upload-artifact@v3 with: name: 'obs-studio-macos-${{ matrix.arch }}-notarized' path: '${{ github.workspace }}/${{ env.FILE_NAME }}'