name: 'BUILD' on: push: paths-ignore: ['**.md'] branches: - master - 'release/**' tags: ['*'] pull_request: paths-ignore: ['**.md'] branches: [master] env: CACHE_REVISION: '005' 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: '018552ee442ef8a7653f86460d5249e3e03c787629767af9faa85a3369fd8576' QT_HASH_MAC_ARM64: '4f24e220037e1f777148ea6efbd494007cbf56848d861181e025699f66dd15bd' QT_HASH_MAC_UNIVERSAL: 'c1dd451d86f5bb6ba86f4c97f2b0b11a9fa49d14fb91f2ec0934adf2b420477d' QT_VERSION_WIN: '6.3.1' DEPS_VERSION_MAC: '2022-07-29' DEPS_HASH_MAC_X86_64: '7c83e4700455b39796fb84cadf2790bac2d05c0ee47da15edf5c120702d9df9b' DEPS_HASH_MAC_ARM64: '4bd295bd854c8a20011a82ab2181f7e1ad48d05d0a259a4618fc72ef3ecd281f' DEPS_VERSION_WIN: '2022-07-29' 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: '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-5.15-21.08 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 }}'