diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 4b0e759ec..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -open_collective: obsproject -patreon: obsproject diff --git a/.github/actions/download_libwebrtc/action.yml b/.github/actions/download_libwebrtc/action.yml new file mode 100644 index 000000000..4e3d6ca81 --- /dev/null +++ b/.github/actions/download_libwebrtc/action.yml @@ -0,0 +1,38 @@ +name: 'Download libWebRTC' +description: 'Download libWebRTC' +inputs: + access_token: + description: 'GH App Installation access token - base64' + required: true + release_tag: + description: 'LibWebRTC release tag.' + required: true + asset_pattern: + description: 'Find release asset by defined pattern.' + required: true + default: "^.*" +runs: + using: "composite" + steps: + - run: | + echo "Looking for libwebrtc using the pattern: ${LIBWEBRTC_ASSETS_PATTERN}" + echo "LibWebRTC release tag: ${LIBWEBRTC_RELEASE_TAG}" + export GH_ACCESS_TOKEN_1H_EXPIRATION=$(echo ${GH_ACCESS_TOKEN_1H_EXPIRATION} | base64 -d) + export LIBWEBRTC_RELEASE_URL=$(curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${GH_ACCESS_TOKEN_1H_EXPIRATION}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/tags/${LIBWEBRTC_RELEASE_TAG} | jq .url | tr -d '"') + echo "LIBWEBRTC_RELEASE_URL: ${LIBWEBRTC_RELEASE_URL}" + curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${GH_ACCESS_TOKEN_1H_EXPIRATION}" -H "X-GitHub-Api-Version: 2022-11-28" ${LIBWEBRTC_RELEASE_URL}/assets > assets.json + for asset_pair in $(cat assets.json | jq '.[] | (.id|tostring) + "|" + .name' | tr -d '"') + do + asset_pair=( ${asset_pair//|/ } ) + if [[ $(echo ${asset_pair[1]} | grep -e ${LIBWEBRTC_ASSETS_PATTERN}) ]]; then + echo "Downloading ${asset_pair[1]} from GitHub - GH_ASSET_ID: ${asset_pair[0]}..." + curl -L -H "Accept: application/octet-stream" -H "Authorization: Bearer ${GH_ACCESS_TOKEN_1H_EXPIRATION}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/assets/${asset_pair[0]} > ${asset_pair[1]} + fi + done + rm assets.json + ls -la + env: + GH_ACCESS_TOKEN_1H_EXPIRATION: ${{ inputs.access_token }} + LIBWEBRTC_RELEASE_TAG: ${{ inputs.release_tag }} + LIBWEBRTC_ASSETS_PATTERN: ${{ inputs.asset_pattern }} + shell: bash diff --git a/.github/actions/download_libwebrtc/win/action.yml b/.github/actions/download_libwebrtc/win/action.yml new file mode 100644 index 000000000..eed715c77 --- /dev/null +++ b/.github/actions/download_libwebrtc/win/action.yml @@ -0,0 +1,44 @@ +name: 'Download libWebRTC' +description: 'Download libWebRTC' +inputs: + access_token: + description: 'GH App Installation access token - base64' + required: true + release_tag: + description: 'LibWebRTC release tag.' + required: true + asset_pattern: + description: 'Find release asset by defined pattern.' + required: true + default: "^.*" +runs: + using: "composite" + steps: + - run: | + Write-Host "Looking for libwebrtc using the pattern: $env:LIBWEBRTC_ASSETS_PATTERN" + Write-Host "LibWebRTC release tag: $env:LIBWEBRTC_RELEASE_TAG" + $env:GH_ACCESS_TOKEN_1H_EXPIRATION = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($env:GH_ACCESS_TOKEN_1H_EXPIRATION)).Trim() + $env:LIBWEBRTC_RELEASE_URL = cmd.exe /c curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $env:GH_ACCESS_TOKEN_1H_EXPIRATION" -H "X-GitHub-Api-Version: 2022-11-28" "https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/tags/$env:LIBWEBRTC_RELEASE_TAG" | jq -r .url + Write-Host $env:LIBWEBRTC_RELEASE_URL + + cmd.exe /c curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $env:GH_ACCESS_TOKEN_1H_EXPIRATION" -H "X-GitHub-Api-Version: 2022-11-28" $env:LIBWEBRTC_RELEASE_URL/assets > assets.json + cmd.exe /c type .\assets.json | jq -r '.[] | (.id|tostring) + \"|\" + .name' > assets.txt + + Get-Content -Path .\assets.txt | ForEach-Object -Process { + $asset_pair = $_.Split("|") + + if ( $asset_pair[1] -match "$env:LIBWEBRTC_ASSETS_PATTERN" ) { + Write-Host "Downloading " $asset_pair[1] " from GitHub - GH_ASSET_ID: " $asset_pair[0] "..." + $asset_url = "https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/assets/" + $asset_pair[0] + Write-Host "Asset url:" $asset_url + cmd.exe /c curl -L -H "Accept: application/octet-stream" -H "Authorization: Bearer $env:GH_ACCESS_TOKEN_1H_EXPIRATION" -H "X-GitHub-Api-Version: 2022-11-28" $asset_url --output $asset_pair[1] + } + } + Remove-Item -Path .\assets.json + Remove-Item -Path .\assets.txt + ls + env: + GH_ACCESS_TOKEN_1H_EXPIRATION: ${{ inputs.access_token }} + LIBWEBRTC_RELEASE_TAG: ${{ inputs.release_tag }} + LIBWEBRTC_ASSETS_PATTERN: ${{ inputs.asset_pattern }} + shell: powershell diff --git a/.github/actions/gh_access_token/action.yml b/.github/actions/gh_access_token/action.yml new file mode 100644 index 000000000..771e4fa8a --- /dev/null +++ b/.github/actions/gh_access_token/action.yml @@ -0,0 +1,38 @@ +name: 'Generate access token' +description: 'Generate access token' +inputs: + script: + description: 'Python script for generate access token stored in repo/org secrets.' + required: false + default: "IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKaW1wb3J0IGp3dAppbXBvcnQgdGltZQppbXBvcnQgc3lzCmltcG9ydCByZXF1ZXN0cwppbXBvcnQganNvbgppbXBvcnQgb3MKCgpQRU1fRklMRSA9IG9zLmVudmlyb25bJ1BFTV9GSUxFJ10KR0hfQVBQX0lEID0gb3MuZW52aXJvblsnR0hfQVBQX0lEJ10KR0hfQVBQX0lOU1RBTExBVElPTl9JRCA9IG9zLmVudmlyb25bJ0dIX0FQUF9JTlNUQUxMQVRJT05fSUQnXQoKIyBPcGVuIFBFTQp3aXRoIG9wZW4oUEVNX0ZJTEUsICdyYicpIGFzIHBlbV9maWxlOgogICAgc2lnbmluZ19rZXkgPSBqd3QuandrX2Zyb21fcGVtKHBlbV9maWxlLnJlYWQoKSkKCnBheWxvYWQgPSB7CiAgICAjIElzc3VlZCBhdCB0aW1lCiAgICAnaWF0JzogaW50KHRpbWUudGltZSgpKSwKICAgICMgSldUIGV4cGlyYXRpb24gdGltZSAoMTAgbWludXRlcyBtYXhpbXVtKQogICAgJ2V4cCc6IGludCh0aW1lLnRpbWUoKSkgKyA2MDAsCiAgICAjIEdpdEh1YiBBcHAncyBpZGVudGlmaWVyCiAgICAnaXNzJzogR0hfQVBQX0lECn0KCiMgQ3JlYXRlIEpXVApqd3RfaW5zdGFuY2UgPSBqd3QuSldUKCkKZW5jb2RlZF9qd3QgPSBqd3RfaW5zdGFuY2UuZW5jb2RlKHBheWxvYWQsIHNpZ25pbmdfa2V5LCBhbGc9J1JTMjU2JykKCiMgR2V0IGdoIGFjY2VzcyB0b2tuZQpoZWFkZXJzID0geyJBdXRob3JpemF0aW9uIjogZiJCZWFyZXIge2VuY29kZWRfand0fSIsCiAgICAgICAgICAgIkFjY2VwdCI6ICJhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24iLAogICAgICAgICAgICJYLUdpdEh1Yi1BcGktVmVyc2lvbiI6ICIyMDIyLTExLTI4IgogICAgICAgICAgIH0KdXJsID0gZiJodHRwczovL2FwaS5naXRodWIuY29tL2FwcC9pbnN0YWxsYXRpb25zL3tHSF9BUFBfSU5TVEFMTEFUSU9OX0lEfS9hY2Nlc3NfdG9rZW5zIgoKciA9IHJlcXVlc3RzLnBvc3QodXJsLCBoZWFkZXJzPWhlYWRlcnMpCmlmIHIuc3RhdHVzX2NvZGUgIT0gMjAxOgogICAgcmFpc2UgSU9FcnJvcihmIkVycm9yOiB7ci5zdGF0dXNfY29kZX0uIEZpbmQgbW9yZSBoZXJlOiBodHRwczovL2RvY3MuZ2l0aHViLmNvbS9lbi9yZXN0L2FwcHMvYXBwcz9hcGlWZXJzaW9uPTIwMjItMTEtMjgjY3JlYXRlLWFuLWluc3RhbGxhdGlvbi1hY2Nlc3MtdG9rZW4tZm9yLWFuLWFwcCIpCmVsc2U6CiAgICByZXNwb25zZV9qc29uID0gci5qc29uKCkKICAgIHByaW50KHJlc3BvbnNlX2pzb25bJ3Rva2VuJ10pCg==" + gh_app_priv_key: + description: 'GitHub Application private key' + required: true + gh_app_id: + description: 'GitHub Application ID' + required: true + gh_app_installation_id: + description: 'GitHub Application intallation ID' + required: true +outputs: + token: + value: ${{ steps.accessToken.outputs.GH_ACCESS_TOKEN_1H_EXPIRATION}} +runs: + using: "composite" + steps: + - id: accessToken + run: | + python3 -m pip install jwt requests + echo ${GH_APP_RELEASECREATOR_TOKEN_PYTHON_SCRIPT} | base64 -d > ./generate_gh_app_installation_token.py + echo ${GH_APP_RELEASECREATOR_PRIV_KEY} | base64 -d > ./gh_app_priv_key.pem + export PEM_FILE=./gh_app_priv_key.pem + export GH_ACCESS_TOKEN_1H_EXPIRATION=$( python3 ./generate_gh_app_installation_token.py ) + echo "GH_ACCESS_TOKEN_1H_EXPIRATION=$( echo ${GH_ACCESS_TOKEN_1H_EXPIRATION} | base64 )" >> "$GITHUB_OUTPUT" + rm ./gh_app_priv_key.pem ./generate_gh_app_installation_token.py + echo "Access token is ready." + env: + GH_APP_RELEASECREATOR_TOKEN_PYTHON_SCRIPT: ${{ inputs.script }} + GH_APP_RELEASECREATOR_PRIV_KEY: ${{ inputs.gh_app_priv_key }} + GH_APP_ID: ${{ inputs.gh_app_id }} + GH_APP_INSTALLATION_ID: ${{ inputs.gh_app_installation_id }} + shell: bash diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml deleted file mode 100644 index 6e62216a6..000000000 --- a/.github/workflows/clang-format.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Clang Format Check - -on: - push: - paths-ignore: ['**.md'] - branches-ignore: [master] - pull_request: - paths-ignore: ['**.md'] - branches-ignore: [master] - -jobs: - clang-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 diff --git a/.github/workflows/crowdin-sync-download.yml b/.github/workflows/crowdin-sync-download.yml deleted file mode 100644 index 05f45034f..000000000 --- a/.github/workflows/crowdin-sync-download.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: "Crowdin Sync: Import latest translations" -on: workflow_dispatch -jobs: - crowdin-sync-download: - name: Import latest translations - runs-on: ubuntu-latest - if: github.repository_owner == 'obsproject' - env: - CROWDIN_PAT: ${{ secrets.CROWDIN_SYNC_CROWDIN_PAT }} - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - fetch-depth: 0 - token: ${{ secrets.CROWDIN_SYNC_GITHUB_PAT }} - - uses: obsproject/obs-crowdin-sync/download@0.2.1 diff --git a/.github/workflows/crowdin-sync-upload.yml b/.github/workflows/crowdin-sync-upload.yml deleted file mode 100644 index 37edd6b8c..000000000 --- a/.github/workflows/crowdin-sync-upload.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: "Crowdin Sync: Upload English strings" -on: - push: - branches: - - master - paths: - - "**/en-US.ini" -jobs: - crowdin-sync-upload: - name: Upload English strings - runs-on: ubuntu-latest - env: - CROWDIN_PAT: ${{ secrets.CROWDIN_SYNC_CROWDIN_PAT }} - GITHUB_EVENT_BEFORE: ${{ github.event.before }} - steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - fetch-depth: 100 - - uses: obsproject/obs-crowdin-sync/upload@0.2.1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 214af2c3f..000000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Generate Documentation - -on: - push: - paths-ignore: - - "cmake/**" - pull_request: - paths: - - "docs/sphinx/**" - -jobs: - docs: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Bump Version Number - shell: bash - if: github.event_name == 'push' - run: | - VERTEST="\#define\sLIBOBS_API_\w+_VER\s([0-9]{1,2})" - VER="" - MAJOR="" - while IFS= read -r l - do - if [[ $l =~ $VERTEST ]]; then - if [[ $VER = '' ]]; then MAJOR="${BASH_REMATCH[1]}"; else VER+="."; fi - VER+="${BASH_REMATCH[1]}" - fi - done < "libobs/obs-config.h" - - SVER="version = '([0-9\.]+)'" - RVER="version = '$VER'" - SREL="release = '([0-9\.]+)'" - RREL="release = '$VER'" - SCOPY="copyright = '([A-Za-z0-9, ]+)'" - RCOPY="copyright = '2017-$(date +"%Y"), Hugh Bailey'" - sed -i -E -e "s/${SVER}/${RVER}/g" -e "s/${SREL}/${RREL}/g" -e "s/${SCOPY}/${RCOPY}/g" docs/sphinx/conf.py - - uses: ./.github/actions/sphinx-publish-action-1.2.0 - with: - sphinx_src: 'docs/sphinx' - build_only: True - target_branch: 'master' - target_path: '../home/_build' - pre_build_commands: 'pip install -Iv sphinx==5.1.1' - - uses: actions/upload-artifact@v3 - with: - name: OBS Studio Documentation (HTML) - path: | - ${{ runner.temp }}/_github_home/_build - !${{ runner.temp }}/_github_home/_build/.doctrees diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml deleted file mode 100644 index 511610e77..000000000 --- a/.github/workflows/flatpak.yml +++ /dev/null @@ -1,110 +0,0 @@ ---- - -name: Flatpak - -on: - release: - types: [published] - branches: [master, 'release/**'] - -env: - 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: - check_tag: - name: Check release tag - runs-on: [ubuntu-latest] - outputs: - valid_tag: ${{ steps.check_tag.outputs.valid_tag }} - matrix: ${{ steps.check_tag.outputs.matrix }} - steps: - - name: Check the tag - id: check_tag - run: | - shopt -s extglob - - case ${GITHUB_REF##*/} in - +([0-9]).+([0-9]).+([0-9]) ) - echo 'valid_tag=${{ toJSON(true) }}' >> $GITHUB_OUTPUT - echo 'matrix=["beta", "stable"]' >> $GITHUB_OUTPUT - ;; - +([0-9]).+([0-9]).+([0-9])-@(beta|rc)*([0-9]) ) - echo 'valid_tag=${{ toJSON(true) }}' >> $GITHUB_OUTPUT - echo 'matrix=["beta"]' >> $GITHUB_OUTPUT - ;; - * ) echo 'valid_tag=${{ toJSON(false) }}' >> $GITHUB_OUTPUT ;; - esac - - publish: - name: Publish to Flathub - runs-on: [ubuntu-latest] - needs: check_tag - if: fromJSON(needs.check_tag.outputs.valid_tag) - env: - FLATPAK_BUILD_PATH: flatpak_app/files/share - container: - image: bilelmoussaoui/flatpak-github-actions:kde-6.3 - options: --privileged - strategy: - matrix: - branch: ${{ fromJSON(needs.check_tag.outputs.matrix) }} - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: 'recursive' - - - name: 'Setup build environment' - id: setup - run: | - git config --global --add safe.directory $GITHUB_WORKSPACE - echo "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT - - - name: Build Flatpak Manifest - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@master - with: - bundle: obs-studio-${{ steps.setup.outputs.commitHash }}.flatpak - manifest-path: CI/flatpak/com.obsproject.Studio.json - cache-key: flatpak-builder-${{ hashFiles('CI/flatpak/com.obsproject.Studio.json') }} - mirror-screenshots-url: https://dl.flathub.org/repo/screenshots - branch: ${{ matrix.branch }} - - - name: Validate AppStream - shell: bash - working-directory: ${{ env.FLATPAK_BUILD_PATH }} - run: | - appstream-util validate appdata/com.obsproject.Studio.appdata.xml - - - name: Verify icon and metadata in app-info - shell: bash - working-directory: ${{ env.FLATPAK_BUILD_PATH }} - run: | - test -f app-info/icons/flatpak/128x128/com.obsproject.Studio.png || { echo "Missing 128x128 icon in app-info" ; exit 1; } - test -f app-info/xmls/com.obsproject.Studio.xml.gz || { echo "Missing com.obsproject.Studio.xml.gz in app-info" ; exit 1; } - - - name: Commit screenshots to the OSTree repository - run: | - ostree commit --repo=repo --canonical-permissions --branch=screenshots/x86_64 flatpak_app/screenshots - - - name: Publish to Flathub Beta - uses: bilelmoussaoui/flatpak-github-actions/flat-manager@v4 - if: matrix.branch == 'beta' - with: - flat-manager-url: https://hub.flathub.org/ - repository: beta - token: ${{ secrets.FLATHUB_BETA_TOKEN }} - - - name: Publish to Flathub - uses: bilelmoussaoui/flatpak-github-actions/flat-manager@v4 - if: matrix.branch == 'stable' - with: - flat-manager-url: https://hub.flathub.org/ - repository: stable - token: ${{ secrets.FLATHUB_TOKEN }} diff --git a/.github/workflows/macOSarm64.yml b/.github/workflows/macOSarm64.yml new file mode 100644 index 000000000..a77def878 --- /dev/null +++ b/.github/workflows/macOSarm64.yml @@ -0,0 +1,235 @@ +name: 'BUILD-MACOS-ARM64' + +on: + push: + paths-ignore: ['**.md'] + branches: + - master + - 'release/**' + - "m**" + tags: ['m*'] + 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 }} + OBS_VERSION: "1.5.1-28.1.2-m112" + LIBWEBRTC_RELEASE_TAG: "m112-release" + LIBWEBRTC_VERSION: "112.0" + WORKSPACE_ROOT: "obs-studio" + +jobs: + macos_build: + name: 'MACOS-ARM64' + runs-on: ['self-hosted', 'macOS', 'ARM64'] + strategy: + matrix: + arch: ['arm64'] + 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: ${{ env.WORKSPACE_ROOT }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + with: + submodules: 'recursive' + path: ${{ env.WORKSPACE_ROOT }} + fetch-depth: 0 + + - name: 'Check for Github Labels' + 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 "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT + + - name: Download libwebrtc + env: + LIBWEBRTC_RELEASE_TAG: ${{ env.LIBWEBRTC_RELEASE_TAG }} + LIBWEBRTC_ASSETS_PATTERN: "^libWebRTC-${{ env.LIBWEBRTC_VERSION }}-.*64-Release-H264-OpenSSL_1_1_1.*.dmg.*" + GH_APP_RELEASECREATOR_TOKEN_PYTHON_SCRIPT: ${{ secrets.GH_APP_RELEASECREATOR_TOKEN_PYTHON_SCRIPT }} + GH_APP_RELEASECREATOR_PRIV_KEY: ${{ secrets.GH_APP_RELEASECREATOR_PRIV_KEY }} + GH_APP_ID: ${{ secrets.GH_APP_ID }} + GH_APP_INSTALLATION_ID: ${{ secrets.GH_APP_INSTALLATION_ID }} + run: | + python3 -m pip install jwt requests + echo ${GH_APP_RELEASECREATOR_TOKEN_PYTHON_SCRIPT} | base64 -d > ./generate_gh_app_installation_token.py + echo ${GH_APP_RELEASECREATOR_PRIV_KEY} | base64 -d > ./gh_app_priv_key.pem + export PEM_FILE=./gh_app_priv_key.pem + export GH_ACCESS_TOKEN_1H_EXPIRATION=$( python3 ./generate_gh_app_installation_token.py ) + rm ./gh_app_priv_key.pem ./generate_gh_app_installation_token.py + echo "GH_ACCESS_TOKEN_1H_EXPIRATION=${GH_ACCESS_TOKEN_1H_EXPIRATION}" >> $GITHUB_OUTPUT + echo "GH_ACCESS_TOKEN_1H_EXPIRATION is ready!" + + echo "Looking for libwebrtc using the pattern: ${LIBWEBRTC_ASSETS_PATTERN}" + echo "LibWebRTC release tag: ${LIBWEBRTC_RELEASE_TAG}" + export LIBWEBRTC_RELEASE_URL=$(curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${GH_ACCESS_TOKEN_1H_EXPIRATION}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/tags/${LIBWEBRTC_RELEASE_TAG} | jq .url | tr -d '"') + echo "LIBWEBRTC_RELEASE_URL: ${LIBWEBRTC_RELEASE_URL}" + curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer ${GH_ACCESS_TOKEN_1H_EXPIRATION}" -H "X-GitHub-Api-Version: 2022-11-28" ${LIBWEBRTC_RELEASE_URL}/assets > assets.json + for asset_pair in $(cat assets.json | jq '.[] | (.id|tostring) + "|" + .name' | tr -d '"') + do + asset_pair=( ${asset_pair//|/ } ) + if [[ $(echo ${asset_pair[1]} | grep -e ${LIBWEBRTC_ASSETS_PATTERN}) ]]; then + echo "Downloading ${asset_pair[1]} from GitHub - GH_ASSET_ID: ${asset_pair[0]}..." + curl -L -H "Accept: application/octet-stream" -H "Authorization: Bearer ${GH_ACCESS_TOKEN_1H_EXPIRATION}" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/assets/${asset_pair[0]} > ${asset_pair[1]} + fi + done + rm assets.json + + - 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: 'Unlock keychain' + run: | + security -v unlock-keychain -p ${MACOS_KEYCHAIN_PASSWORD} ${MACOS_KEYCHAIN_PATH} + env: + MACOS_KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + MACOS_KEYCHAIN_PATH: /Users/dolbyvoice/Library/Keychains/cosmosoftware.keychain-db + + # Geneate OBS without obs-ndi plugin + - name: 'Build OBS - no NDI' + run: CI/macos/02_build_obs.sh --codesign --architecture "${{ matrix.arch }}" + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Create build artifact' + run: | + CI/macos/03_package_obs.sh --codesign --architecture "${{ matrix.arch }}" + ARTIFACT_NAME=$(basename $(find build/. -name "obs-webrtc*.dmg")) + echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + echo "ARTIFACT READY: ${ARTIFACT_NAME}" + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Upload build Artifact' + 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 }}' + + # Geneate OBS with obs-ndi plugin + - name: 'Build OBS - with NDI' + run: CI/macos/02_build_obs.sh --codesign --architecture "${{ matrix.arch }}" --ndi + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Create build artifact' + run: | + CI/macos/03_package_obs.sh --codesign --architecture "${{ matrix.arch }}" --ndi + ARTIFACT_NAME=$(basename $(find build/. -name "obs-webrtc-ndi*.dmg")) + echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + echo "ARTIFACT READY: ${ARTIFACT_NAME}" + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Upload build Artifact' + uses: actions/upload-artifact@v3 + with: + name: 'obs-studio-macos-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}-ndi' + path: '${{ github.workspace }}/obs-studio/build/${{ env.FILE_NAME }}' diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c2a93416f..7ce1e8408 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,15 +1,12 @@ -name: 'BUILD' +name: 'Build OBS-studio-webrtc' on: push: paths-ignore: ['**.md'] - branches: - - master - - 'release/**' - tags: ['*'] + branches: ["master", "release/**", "CI/**"] pull_request: paths-ignore: ['**.md'] - branches: [master] + branches: ['m**'] env: CACHE_REVISION: '006' @@ -38,79 +35,81 @@ env: YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }} YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }} YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }} + OBS_VERSION: "1.5.1-28.1.2-m112" + LIBWEBRTC_RELEASE_TAG: "m112-release" + LIBWEBRTC_VERSION: "112.0" + VENDOR: "Millicast" jobs: - clang_check: - name: '01 - Code Format Check' - runs-on: [ubuntu-22.04] + preprocessing: + name: "Preprocessing" + runs-on: ubuntu-latest steps: - - name: 'Checkout' + - name: Checkout code uses: actions/checkout@v3 + - name: Generate access token + id: gh_access_token + uses: ./.github/actions/gh_access_token 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' + gh_app_priv_key: ${{ secrets.GH_APP_RELEASECREATOR_PRIV_KEY }} + gh_app_id: ${{ secrets.GH_APP_ID }} + gh_app_installation_id: ${{ secrets.GH_APP_INSTALLATION_ID }} + outputs: + gh_access_token: ${{ steps.gh_access_token.outputs.token }} + + macos_build_x86_64: + name: 'MacOS-x86_64' runs-on: [macos-12] - strategy: - matrix: - arch: ['x86_64', 'arm64'] - if: always() - needs: [clang_check] + needs: preprocessing + if: success() 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 != '' }} + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + TARGET_ARCH: 'x86_64' 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: 'Download libWebRTC' + uses: ./.github/actions/download_libwebrtc + with: + access_token: ${{ needs.preprocessing.outputs.gh_access_token }} + release_tag: ${{ env.LIBWEBRTC_RELEASE_TAG }} + asset_pattern: "^libWebRTC-${{ env.LIBWEBRTC_VERSION }}-x64-Release-H264-OpenSSL_1_1_1.*.dmg.*" - - name: 'Check for Github Labels' - if: github.event_name == 'pull_request' + - name: 'Setup additional build environment variables' + id: setup run: | + echo "CACHE_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV + + 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 "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT + 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 }} + echo "DEPS_BUILD_DIR_=$(dirname ${{ github.workspace }})/obs-build-dependencies_${{ env.TARGET_ARCH }}" >> $GITHUB_ENV - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache @@ -118,8 +117,8 @@ jobs: 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 }} + path: ${{ env.DEPS_BUILD_DIR_ }}/cef_binary_${{ env.CEF_BUILD_VERSION_MAC }}_macos_${{ env.TARGET_ARCH}} + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_MAC }}-${{ env.TARGET_ARCH }}-${{ env.CACHE_REVISION }} - name: 'Restore VLC dependency from cache' id: vlc-cache @@ -127,7 +126,7 @@ jobs: env: CACHE_NAME: 'vlc-cache' with: - path: ${{ github.workspace }}/obs-build-dependencies/vlc-${{ env.VLC_VERSION_MAC }} + path: ${{ env.DEPS_BUILD_DIR_ }}/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' @@ -136,12 +135,127 @@ jobs: env: CACHE_NAME: 'sparkle-cache' with: - path: ${{ github.workspace }}/obs-build-dependencies/obs-deps/lib/Sparkle.framework + path: ${{ env.DEPS_BUILD_DIR_ }}/obs-deps/lib/Sparkle.framework key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.SPARKLE_VERSION }}-${{ env.CACHE_REVISION }} - - name: 'Setup build environment' + - 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 }} + DEPS_BUILD_DIR: ${{ env.DEPS_BUILD_DIR_ }} + run: CI/macos/01_install_dependencies.sh --architecture ${{ env.TARGET_ARCH }} + + - name: 'Setup plugins' + run: | + git stash + rm -rf ${{ github.workspace }}/plugins/obs-ndi + rm -rf ${{ github.workspace }}/plugins/obs-browser + git submodule update --init --recursive + + - name: 'Install MacOS cert and create keychain' + run: | + echo -n ${MACOS_SIGNING_CERT} | base64 --decode -o ${CERTIFACTE_PATH} + security create-keychain -p "${KEYCHAIN_PASSWORD}" ${KEYCHAIN_PATH} + security set-keychain-settings -lut 3600 $KEYCHAIN_PATH + security unlock-keychain -p "${KEYCHAIN_PASSWORD}" ${KEYCHAIN_PATH} + security import ${CERTIFACTE_PATH} -P ${MACOS_SIGNING_CERT_PASSWORD} -A -t cert -f pkcs12 -k ${KEYCHAIN_PATH} + security list-keychain -d user -s ${KEYCHAIN_PATH} + + env: + MACOS_SIGNING_CERT: ${{ secrets.MACOS_SIGNING_CERT }} + MACOS_SIGNING_CERT_PASSWORD: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + KEYCHAIN_PATH: ${{ github.workspace }}/app-signing.keychain-db + CERTIFACTE_PATH: ${{ github.workspace }}/app-signing-cert.p12 + + # Geneate OBS without obs-ndi plugin + - name: 'Build OBS - no NDI' + run: CI/macos/02_build_obs.sh --codesign --architecture ${{ env.TARGET_ARCH }} --vendor ${{ env.VENDOR }} + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Create build artifact' + run: | + CI/macos/03_package_obs.sh --codesign --notarize --architecture ${{ env.TARGET_ARCH }} --vendor ${{ env.VENDOR }} + ARTIFACT_NAME=$(basename $(find build/. -name "obs-webrtc*.dmg")) + echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + echo "ARTIFACT READY: ${ARTIFACT_NAME}" + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Upload build Artifact' + uses: actions/upload-artifact@v3 + with: + name: 'obs-studio-macos-${{ env.TARGET_ARCH }}-${{ steps.setup.outputs.commitHash }}' + path: '${{ github.workspace }}/build/${{ env.FILE_NAME }}' + + # Geneate OBS with obs-ndi plugin + - name: 'Build OBS - with NDI' + run: CI/macos/02_build_obs.sh --codesign --architecture ${{ env.TARGET_ARCH }} --ndi + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Create build artifact' + run: | + CI/macos/03_package_obs.sh --codesign --notarize --architecture ${{ env.TARGET_ARCH }} --ndi + ARTIFACT_NAME=$(basename $(find build/. -name "obs-webrtc-ndi*.dmg")) + echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + echo "ARTIFACT READY: ${ARTIFACT_NAME}" + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Upload build Artifact' + uses: actions/upload-artifact@v3 + with: + name: 'obs-studio-macos-${{ env.TARGET_ARCH }}-${{ steps.setup.outputs.commitHash }}-ndi' + path: '${{ github.workspace }}/build/${{ env.FILE_NAME }}' + + macos_build_arm64: + name: 'MacOS-arm64' + runs-on: ['self-hosted', 'macOS', 'ARM64'] + needs: preprocessing + if: success() + env: + MACOSX_DEPLOYMENT_TARGET_ARM64: '11.0' + SPARKLE_VERSION: '1.26.0' + SPARKLE_HASH: '8312cbf7528297a49f1b97692c33cb8d33254c396dc51be394e9484e4b6833a0' + BLOCKED_FORMULAS: 'speexdsp curl php composer' + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + TARGET_ARCH: 'arm64' + defaults: + run: + shell: bash + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + with: + submodules: 'recursive' + fetch-depth: 0 + - name: 'Download libWebRTC' + uses: ./.github/actions/download_libwebrtc + with: + access_token: ${{ needs.preprocessing.outputs.gh_access_token }} + release_tag: ${{ env.LIBWEBRTC_RELEASE_TAG }} + asset_pattern: "^libWebRTC-${{ env.LIBWEBRTC_VERSION }}-arm64-Release-H264-OpenSSL_1_1_1.*.dmg.*" + + - name: 'Setup additional build environment variables' id: setup run: | + echo "CACHE_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV + REMOVE_FORMULAS="" for FORMULA in ${{ env.BLOCKED_FORMULAS }}; do if [ -d "/usr/local/opt/${FORMULA}" ]; then @@ -155,91 +269,155 @@ jobs: echo "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT - - name: 'Switch to Xcode 14.1' - run: sudo xcode-select -switch /Applications/Xcode_14.1.app + 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 "DEPS_BUILD_DIR_=$(dirname ${{ github.workspace }})/obs-build-dependencies_${{ env.TARGET_ARCH }}" >> $GITHUB_ENV + + - name: 'Restore Chromium Embedded Framework from cache' + id: cef-cache + uses: actions/cache@v3 + env: + CACHE_NAME: 'cef-cache' + with: + path: ${{ env.DEPS_BUILD_DIR_ }}/cef_binary_${{ env.CEF_BUILD_VERSION_MAC }}_macos_${{ env.TARGET_ARCH}} + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_MAC }}-${{ env.TARGET_ARCH }}-${{ env.CACHE_REVISION }} + + - name: 'Restore VLC dependency from cache' + id: vlc-cache + uses: actions/cache@v3 + env: + CACHE_NAME: 'vlc-cache' + with: + path: ${{ env.DEPS_BUILD_DIR_ }}/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: ${{ env.DEPS_BUILD_DIR_ }}/obs-deps/lib/Sparkle.framework + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.SPARKLE_VERSION }}-${{ env.CACHE_REVISION }} - 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 }}" + DEPS_BUILD_DIR: ${{ env.DEPS_BUILD_DIR_ }} + run: CI/macos/01_install_dependencies.sh --architecture ${{ env.TARGET_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: 'Setup plugins' + run: | + git stash + rm -rf ${{ github.workspace }}/plugins/obs-ndi + rm -rf ${{ github.workspace }}/plugins/obs-browser + git submodule update --init --recursive - - name: 'Set Signing Identity' - if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' }} + - name: 'Unlock keychain' run: | - echo "CODESIGN_IDENT=${{ secrets.MACOS_SIGNING_IDENTITY }}" >> $GITHUB_ENV - echo "BUILD_FOR_DISTRIBUTION=ON" >> $GITHUB_ENV + security -v unlock-keychain -p ${MACOS_KEYCHAIN_PASSWORD} ${MACOS_KEYCHAIN_PATH} && echo "Keychain is unlocked" || exit 1 + env: + MACOS_KEYCHAIN_PASSWORD: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + MACOS_KEYCHAIN_PATH: /Users/dolbyvoice/Library/Keychains/cosmosoftware.keychain-db - - name: 'Build OBS' - run: CI/macos/02_build_obs.sh --codesign --architecture "${{ matrix.arch }}" + # Geneate OBS without obs-ndi plugin + - name: 'Build OBS - no NDI' + run: CI/macos/02_build_obs.sh --codesign --architecture ${{ env.TARGET_ARCH }} + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} - - name: 'Run tests' - if: ${{ success() && matrix.arch == 'x86_64' }} - run: cmake --build build -t test + - name: 'Create build artifact' + run: | + CI/macos/03_package_obs.sh --codesign --notarize --architecture ${{ env.TARGET_ARCH }} + ARTIFACT_NAME=$(basename $(find build/. -name "obs-webrtc*.dmg")) + echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + echo "ARTIFACT READY: ${ARTIFACT_NAME}" + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} + + - name: 'Upload build Artifact' + uses: actions/upload-artifact@v3 + with: + name: 'obs-studio-macos-${{ env.TARGET_ARCH }}-${{ steps.setup.outputs.commitHash }}' + path: '${{ github.workspace }}/build/${{ env.FILE_NAME }}' + + # Geneate OBS with obs-ndi plugin + - name: 'Build OBS - with NDI' + run: CI/macos/02_build_obs.sh --codesign --architecture ${{ env.TARGET_ARCH }} --ndi + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} - 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)) + CI/macos/03_package_obs.sh --codesign --notarize --architecture ${{ env.TARGET_ARCH }} --ndi + ARTIFACT_NAME=$(basename $(find build/. -name "obs-webrtc-ndi*.dmg")) echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + echo "ARTIFACT READY: ${ARTIFACT_NAME}" + env: + CODESIGN_IDENT: ${{ secrets.CODESIGN_IDENT }} + CODESIGN_TEAM_ID: ${{ secrets.CODESIGN_TEAM_ID }} + CODESIGN_IDENT_USER: ${{ secrets.CODESIGN_IDENT_USER }} + NOTARIZE_APP_SPECIFIC_PASSWORD: ${{ secrets.NOTARIZE_APP_SPECIFIC_PASSWORD }} - 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 }}' + name: 'obs-studio-macos-${{ env.TARGET_ARCH }}-${{ steps.setup.outputs.commitHash }}-ndi' + path: '${{ github.workspace }}/build/${{ env.FILE_NAME }}' linux_build: - name: '02 - Linux' - runs-on: ${{ matrix.ubuntu }} + name: 'Linux' strategy: matrix: ubuntu: ['ubuntu-20.04', 'ubuntu-22.04'] + runs-on: ${{ matrix.ubuntu }} + needs: preprocessing 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: 'Download libWebRTC' + uses: ./.github/actions/download_libwebrtc + with: + access_token: ${{ needs.preprocessing.outputs.gh_access_token }} + release_tag: ${{ env.LIBWEBRTC_RELEASE_TAG }} + asset_pattern: "^libWebRTC-${{ env.LIBWEBRTC_VERSION }}-.*64-Release-.*.sh.*" - - name: 'Check for Github Labels' - if: github.event_name == 'pull_request' + - name: 'Setup additional build environment variables' + id: setup run: | + echo "CACHE_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV + + echo "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT + 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 }} + echo "DEPS_BUILD_DIR_=$(dirname ${{ github.workspace }})/obs-build-dependencies_${{ env.TARGET_ARCH }}" >> $GITHUB_ENV - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache @@ -250,18 +428,25 @@ jobs: 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 "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT - - name: 'Install dependencies' env: RESTORED_CEF: ${{ steps.cef-cache.outputs.cache-hit }} - run: CI/linux/01_install_dependencies.sh --disable-pipewire + run: | + git submodule update --init --recursive + CI/linux/01_install_dependencies.sh --disable-pipewire + + - name: 'Setup plugins' + run: | + set -e + git stash + rm -rf ${{ github.workspace }}/plugins/obs-ndi + rm -rf ${{ github.workspace }}/plugins/obs-browser + git submodule update --init --recursive - name: 'Build OBS' run: CI/linux/02_build_obs.sh --disable-pipewire + env: + UBUNTU_VERSION: ${{ matrix.ubuntu }} - name: 'Run tests' if: success() @@ -271,48 +456,51 @@ jobs: 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)) + ARTIFACT_NAME=$(basename $(find build/. -name "obs-webrtc-*.deb" | sort -rn | head -1)) echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + env: + UBUNTU_VERSION: $${ matrix.ubuntu }} - 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 }}' + path: '${{ github.workspace }}/build/${{ env.FILE_NAME }}' windows_build: - name: '02 - Windows' + name: 'Windows_x64' runs-on: [windows-2022] - needs: [clang_check] + needs: preprocessing 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' + TARGET_ARCH: 'x64' steps: - name: 'Checkout' uses: actions/checkout@v3 with: submodules: 'recursive' - path: 'obs-studio' fetch-depth: 0 + - name: 'Download libWebRTC' + uses: ./.github/actions/download_libwebrtc/win + with: + access_token: ${{ needs.preprocessing.outputs.gh_access_token }} + release_tag: ${{ env.LIBWEBRTC_RELEASE_TAG }} + asset_pattern: "^libWebRTC-${{ env.LIBWEBRTC_VERSION }}-x64-Mt-Release-.*.exe.*" - name: 'Add msbuild to PATH' uses: microsoft/setup-msbuild@v1.1 - - name: 'Check for Github Labels' - if: github.event_name == 'pull_request' + - name: 'Setup additional build environment variables' + id: setup 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 + $CommitHash = git rev-parse --short=9 HEAD + "commitHash=${CommitHash}" >> $env:GITHUB_OUTPUT - name: 'Restore VLC dependency from cache' id: vlc-cache @@ -323,192 +511,33 @@ jobs: 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 - "commitHash=${CommitHash}" >> $env:GITHUB_OUTPUT - - 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 }} + run: CI/windows/01_install_dependencies.ps1 -BuildArch ${{ env.TARGET_ARCH }} + + - name: 'Setup plugings' + run: | + git stash + Remove-Item ${{ github.workspace }}\\plugins\\obs-ndi -Recurse -Force + Remove-Item ${{ github.workspace }}\\plugins\\obs-browser -Recurse -Force + git submodule update --init --recursive - name: 'Build OBS' - run: CI/windows/02_build_obs.ps1 -BuildArch ${{ matrix.arch }} + run: CI/windows/02_build_obs.ps1 -BuildArch ${{ env.TARGET_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 + CI/windows/03_package_obs.ps1 -BuildArch ${{ env.TARGET_ARCH }} -Package + $ArtifactName = Get-ChildItem -filter "obs-webrtc-*-windows-${{ env.TARGET_ARCH }}.zip" -File -Recurse Write-Output "FILE_NAME=${ArtifactName}" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + Write-Host $env:FILE_NAME - 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 }}' + name: 'obs-studio-windows-${{ env.TARGET_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 - "commitHash=${CommitHash}" >> $env:GITHUB_OUTPUT - - - 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 - "filename=${ArtifactName}" >> $env:GITHUB_OUTPUT - - - 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 "commitHash=$(git rev-parse --short=9 HEAD)" >> $GITHUB_OUTPUT - - - 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 }}' diff --git a/.github/workflows/qt-xml.yml b/.github/workflows/qt-xml.yml deleted file mode 100644 index 0b51ef014..000000000 --- a/.github/workflows/qt-xml.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: UI XML Validator - -on: - push: - paths-ignore: - - "cmake/**" - pull_request: - paths: - - "UI/forms/**" - -jobs: - qt-xml-validator: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: 'recursive' - - - name: Install xmllint - run: | - sudo apt-get -qq update - sudo apt-get install --no-install-recommends -y libxml2-utils - - - name: Register Annotations - uses: ./.github/actions/xmllint-problem-matcher-1.1.0 - - - name: Validate - run: | - xmllint --schema UI/forms/XML-Schema-Qt5.15.xsd --noout UI/forms/*.ui UI/forms/**/*.ui diff --git a/.github/workflows/services-json.yml b/.github/workflows/services-json.yml deleted file mode 100644 index 6778fa355..000000000 --- a/.github/workflows/services-json.yml +++ /dev/null @@ -1,93 +0,0 @@ -name: Services Validator - -on: - push: - paths: - - "plugins/rtmp-services/data/services.json" - - "plugins/rtmp-services/data/package.json" - pull_request: - paths: - - "plugins/rtmp-services/data/services.json" - - "plugins/rtmp-services/data/package.json" - schedule: - - cron: 0 0 * * * - workflow_dispatch: - -jobs: - schema: - name: Schema - runs-on: [ubuntu-20.04] - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Install & Configure Python - run: | - sudo apt install python3.9-dev - python3.9 -m pip install jsonschema json_source_map - - - name: Validate Service JSON Schema - run: | - JSON_FILES=( - plugins/rtmp-services/data/services.json - plugins/rtmp-services/data/package.json - ) - python3.9 CI/check-jsonschema.py "${JSON_FILES[@]}" - - - name: Annotate Errors - if: failure() - uses: yuzutech/annotations-action@v0.4.0 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" - title: "Service JSON Errors" - input: "./validation_errors.json" - - service_check: - name: Service Check - runs-on: ubuntu-20.04 - needs: schema - if: ${{ github.repository_owner == 'obsproject' && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }} - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Restore cache - uses: actions/cache@v3 - with: - path: ${{ github.workspace }}/other - # Workaround to create a new cache every time, since a cache key is immutable: - # https://github.com/actions/cache/blob/main/workarounds.md#update-a-cache - key: service-check-${{ github.run_id }} - restore-keys: service-check - - - name: Install & Configure Python - run: | - sudo apt install python3.9 - python3.9 -m pip install requests - - - name: Check Services - id: check - run: python3.9 -u CI/check-services.py - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - WORKFLOW_RUN_ID: ${{ github.run_id }} - REPOSITORY: ${{ github.repository }} - - - uses: actions/upload-artifact@v3 - with: - name: timestamps - path: ${{ github.workspace }}/other/* - - - name: Create Pull Request - uses: peter-evans/create-pull-request@f094b77505fb89581e68a1163fbd2fffece39da1 - if: steps.check.outputs.make_pr == 'true' - with: - author: "Service Checker " - commit-message: "rtmp-services: Remove defunct servers/services" - title: "rtmp-services: Remove defunct servers/services" - branch: "automated/clean-services" - body: ${{ fromJSON(steps.check.outputs.pr_message) }} - delete-branch: true diff --git a/.github/workflows/steam.yml b/.github/workflows/steam.yml deleted file mode 100644 index b9f5c6719..000000000 --- a/.github/workflows/steam.yml +++ /dev/null @@ -1,264 +0,0 @@ -name: Steam Upload - -on: - release: - types: - - published - workflow_dispatch: - inputs: - tag: - description: 'Tag to fetch and upload (nightly if none)' - required: false - win_url_override: - description: 'Windows build to use (.zip only)' - required: false - mac_url_override: - description: 'Mac build to use (.dmg only)' - required: false - mac_arm_url_override: - description: 'Mac ARM build to use (.dmg only)' - required: false - schedule: - - cron: 0 0 * * * - -env: - WORKFLOW_ID: 583765 - GIT_NIGHTLY_BRANCH: master - STEAM_NIGHTLY_BRANCH: nightly - STEAM_STABLE_BRANCH: staging - STEAM_BETA_BRANCH: beta_staging - SEVENZIP_HASH: 5290409e7bbe2f133d0bd7e7482548678157ea2be276b0f9cb440600f4be9a2d - -jobs: - upload: - name: Steam upload - runs-on: ubuntu-20.04 - if: github.repository_owner == 'obsproject' - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - path: source - - # The 7-Zip version available in the default ubuntu repos (p7zip) is wildly out-of-date and does not properly support DMG files. - - name: Setup 7-Zip - run: | - mkdir 7z && cd 7z - curl -s https://www.7-zip.org/a/7z2200-linux-x64.tar.xz -o 7z.tar.xz - - if [[ '${{ env.SEVENZIP_HASH }}' != "$(sha256sum 7z.tar.xz | cut -d " " -f 1)" ]]; then - echo "7-Zip Download hash does not match!" - exit 1 - fi - - tar -xJf 7z.tar.xz - echo "$(pwd)" >> $GITHUB_PATH - - - name: Get build information - id: build-info - run: | - EVENT='${{ github.event_name }}' - if [[ ${EVENT} == 'release' || ( ${EVENT} == 'workflow_dispatch' && -n '${{ github.event.inputs.tag }}') ]]; then - if [[ ${EVENT} == "release" ]]; then - DESC='${{ github.event.release.tag_name }}' - if [[ '${{ github.event.release.prerelease }}' == 'true' ]]; then - BRANCH='${{ env.STEAM_BETA_BRANCH }}' - else - BRANCH='${{ env.STEAM_STABLE_BRANCH }}' - fi - ASSETS_URL='${{ github.event.release.assets_url }}' - else - RELEASE="$(curl -s '${{ github.api_url }}/repos/obsproject/obs-studio/releases/tags/${{ github.event.inputs.tag }}')" - - DESC="$(jq -r '.tag_name' <<< ${RELEASE})" - if [[ "$(jq -r '.prerelease' <<< ${RELEASE})" == 'true' ]]; then - BRANCH='${{ env.STEAM_BETA_BRANCH }}' - else - BRANCH='${{ env.STEAM_STABLE_BRANCH }}' - fi - ASSETS_URL="$(jq -r '.assets_url' <<< ${RELEASE})" - fi - - ASSETS="$(curl -s "${ASSETS_URL}")" - WIN_ASSET_URL="$(jq -r '.[] | select(.name|test(".*x64.zip")) .browser_download_url' <<< ${ASSETS})" - MAC_ASSET_URL="$(jq -r '.[] | select(.name|test(".*x86_64.*.dmg")) .browser_download_url' <<< ${ASSETS})" - MAC_ARM_ASSET_URL="$(jq -r '.[] | select(.name|test(".*arm64.*.dmg")) .browser_download_url' <<< ${ASSETS})" - TYPE='release' - else - BRANCH='${{ env.STEAM_NIGHTLY_BRANCH }}' - BUILDS="$(curl -s '${{ github.api_url }}/repos/obsproject/obs-studio/actions/workflows/${{ env.WORKFLOW_ID }}/runs?per_page=1&event=push&status=success&branch=${{ env.GIT_NIGHTLY_BRANCH }}')" - ARTIFACTS_URL="$(jq -r '.workflow_runs[].artifacts_url' <<< ${BUILDS})" - DESC="g$(jq -r '.workflow_runs[].head_sha' <<< "${BUILDS}" | cut -c1-9)" - - ARTIFACTS="$(curl -s ${ARTIFACTS_URL})" - WIN_ASSET_URL="$(jq -r '.artifacts[] | select(.name|test(".*windows-x64.*")) .archive_download_url' <<< ${ARTIFACTS})" - MAC_ASSET_URL="$(jq -r '.artifacts[] | select(.name|test(".*macos-x86_64.*")) .archive_download_url' <<< ${ARTIFACTS})" - MAC_ARM_ASSET_URL="$(jq -r '.artifacts[] | select(.name|test(".*macos-arm64.*")) .archive_download_url' <<< ${ARTIFACTS})" - TYPE='nightly' - fi - - # Apply overrides from workflow_dispatch - if [[ ${EVENT} == 'workflow_dispatch' ]]; then - if [[ -n '${{ github.event.inputs.win_url_override }}' ]]; then - WIN_ASSET_URL='${{ github.event.inputs.win_url_override }}' - fi - - if [[ -n '${{ github.event.inputs.mac_url_override }}' ]]; then - MAC_ASSET_URL='${{ github.event.inputs.mac_url_override }}' - fi - - if [[ -n '${{ github.event.inputs.mac_arm_url_override }}' ]]; then - MAC_ARM_ASSET_URL='${{ github.event.inputs.mac_arm_url_override }}' - fi - fi - - if [[ -z ${WIN_ASSET_URL} || -z ${MAC_ASSET_URL} || -z ${MAC_ARM_ASSET_URL} ]]; then - echo "Missing at least one asset URL!" - exit 1 - fi - - # set env variables for subsequent steps - echo "type=${TYPE}" >> $GITHUB_OUTPUT - echo "branch=${BRANCH}" >> $GITHUB_OUTPUT - echo "desc=${DESC}" >> $GITHUB_OUTPUT - echo "win_url=${WIN_ASSET_URL}" >> $GITHUB_OUTPUT - echo "mac_intel_url=${MAC_ASSET_URL}" >> $GITHUB_OUTPUT - echo "mac_arm_url=${MAC_ARM_ASSET_URL}" >> $GITHUB_OUTPUT - - - name: Restore build cache - id: cache - uses: actions/cache@v3 - with: - path: ${{ github.workspace }}/steam/build - key: ${{ steps.build-info.outputs.branch }}-${{ steps.build-info.outputs.desc }} - # Using "restore-keys" will restore the most recent cache for the branch, even if the exact cache doesn't exist. - # This doesn't set cache-hit to true so it won't skip the upload for nightlies. - restore-keys: ${{ steps.build-info.outputs.branch }} - - - name: Determine if Steam upload should run - # If the nightly build has already been uploaded and thus a cache exists skip this and the following steps. - # Steam does not prevent us from uploading duplicate builds so this would just pollute the dashboard. - # This is a bit of a hack and can fail to work if our cache has been evicted or we somehow have no commits for 7 days, - # but it's better than nothing! - id: should-run - run: | - if [[ '${{ steps.build-info.outputs.type }}' == 'release' || '${{ steps.cache.outputs.cache-hit }}' != 'true' ]]; then - echo "result=true" >> $GITHUB_OUTPUT - else - echo "result=false" >> $GITHUB_OUTPUT - fi - - - name: Download and prepare builds - if: steps.should-run.outputs.result == 'true' - run: | - echo "::group::Download Windows build" - if [[ '${{ steps.build-info.outputs.win_url }}' == *'api.github.com'* ]]; then - curl -L -H 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' '${{ steps.build-info.outputs.win_url }}' -o windows.zip - else - curl -L '${{ steps.build-info.outputs.win_url }}' -o windows.zip - fi - echo "::endgroup::" - - echo "::group::Download Mac builds" - if [[ '${{ steps.build-info.outputs.mac_intel_url }}' == *'api.github.com'* ]]; then - curl -L -H 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' '${{ steps.build-info.outputs.mac_intel_url }}' -o mac_x86.dmg.zip - else - curl -L '${{ steps.build-info.outputs.mac_intel_url }}' -o mac_x86.dmg - fi - - if [[ '${{ steps.build-info.outputs.mac_arm_url }}' == *'api.github.com'* ]]; then - curl -L -H 'Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' '${{ steps.build-info.outputs.mac_arm_url }}' -o mac_arm64.dmg.zip - else - curl -L '${{ steps.build-info.outputs.mac_arm_url }}' -o mac_arm64.dmg - fi - echo "::endgroup::" - - mkdir -p steam && cd steam - - echo "::group::Extract and prepare Win64" - mkdir steam-windows - ( - cd steam-windows - unzip ../../windows.zip - # CI builds can be double-zipped - if compgen -G "*.zip" > /dev/null; then - unzip *.zip - rm *.zip - fi - # copy install scripts and create sentinel file - cp -r ../../source/CI/steam/scripts_windows scripts - touch disable_updater - ) - echo "::endgroup::" - - echo "::group::Extract macOS (x86)" - mkdir -p steam-macos/x86 - # CI builds are zipped - if [[ -f ../mac_x86.dmg.zip ]]; then - unzip ../mac_x86.dmg.zip - # 7-Zip will have an exit code of 2 due to the "unsafe" 'Applications' symlink. - # GitHub treats this as a failure so ignore non-zero exit codes here. - 7zz x *.dmg -otmp_x86 || true - rm *.dmg - else - 7zz x ../mac_x86.dmg -otmp_x86 || true - fi - - if [ -d tmp_x86/OBS.app ]; then - mv tmp_x86/OBS.app steam-macos/x86 - else - mv tmp_x86/*/OBS.app steam-macos/x86 - fi - echo "::endgroup::" - - echo "::group::Extract and prepare macOS (arm64)" - mkdir -p steam-macos/arm64 - if [[ -f ../mac_arm64.dmg.zip ]]; then - unzip ../mac_arm64.dmg.zip - 7zz x *.dmg -otmp_arm64 || true - rm *.dmg - else - 7zz x ../mac_arm64.dmg -otmp_arm64 || true - fi - - if [ -d tmp_arm64/OBS.app ]; then - mv tmp_arm64/OBS.app steam-macos/arm64 - else - mv tmp_arm64/*/OBS.app steam-macos/arm64 - fi - - cp ../source/CI/steam/scripts_macos/launch.sh steam-macos/launch.sh - echo "::endgroup::" - - - name: Setup steamcmd - if: steps.should-run.outputs.result == 'true' - uses: CyberAndrii/setup-steamcmd@e19cd1516315ce46dbfffa47193f92fe42d1419e - - - name: Generate Steam auth code - if: steps.should-run.outputs.result == 'true' - id: steam-totp - uses: CyberAndrii/steam-totp@0fc9e59dc5bbf4368d23d5a33956f104248da31a - with: - shared_secret: ${{ secrets.STEAM_SHARED_SECRET }} - - - name: Upload to Steam - if: steps.should-run.outputs.result == 'true' - run: | - cd steam - echo "::group::Prepare Steam build script" - # The description in Steamworks for the build will be "github_-", e.g. "github_nightly-gaa73de952" - sed 's/@@DESC@@/${{ steps.build-info.outputs.branch }}-${{ steps.build-info.outputs.desc }}/;s/@@BRANCH@@/${{ steps.build-info.outputs.branch }}/' ../source/CI/steam/obs_build.vdf > build.vdf - echo "Generated file:" - cat build.vdf - echo "::endgroup::" - echo "::group::Upload to Steam" - steamcmd +login '${{ secrets.STEAM_USER }}' '${{ secrets.STEAM_PASSWORD }}' '${{ steps.steam-totp.outputs.code }}' +run_app_build "$(pwd)/build.vdf" +quit - echo "::endgroup::" - - - name: Upload Steam build logs - if: steps.should-run.outputs.result == 'true' - uses: actions/upload-artifact@v3 - with: - name: steam-build-logs - path: ${{ github.workspace }}/steam/build/*.log diff --git a/CI/linux/02_build_obs.sh b/CI/linux/02_build_obs.sh index 8c6df39b3..2e5d6f343 100755 --- a/CI/linux/02_build_obs.sh +++ b/CI/linux/02_build_obs.sh @@ -98,7 +98,7 @@ _configure_obs() { -DUSE_LIBC++=ON \ -Dlibwebrtc_DIR=${libwebrtc_dir} \ -DOBS_VERSION_OVERRIDE=${OBS_VERSION} \ - -DCPACK_DEBIAN_FILE_NAME="obs-webrtc${NDI_PLUGIN}-${OBS_VERSION}-linux-${UBUNTU_VERSION}.deb" \ + -DCPACK_DEBIAN_FILE_NAME="obs-webrtc${NDI_PLUGIN}-${OBS_VERSION}-${UBUNTU_VERSION}.deb" \ -DCPACK_DEBIAN_PACKAGE_MAINTAINER="CoSMo Software" \ -DCPACK_DEBIAN_PACKAGE_NAME="obs" \ -DCPACK_DEBIAN_PACKAGE_VERSION=${OBS_VERSION} \ diff --git a/CI/linux/03_package_obs.sh b/CI/linux/03_package_obs.sh index d6ffd779f..c87ff2d7e 100755 --- a/CI/linux/03_package_obs.sh +++ b/CI/linux/03_package_obs.sh @@ -20,16 +20,17 @@ package_obs() { step "Package OBS..." cmake --build ${BUILD_DIR} -t package - DEB_NAME=$(find ${BUILD_DIR} -maxdepth 1 -type f -name "obs*.deb" | sort -rn | head -1) - - if [ "${DEB_NAME}" ]; then - if [ ! -d package_${VENDOR_NAME} ]; then - mkdir package_${VENDOR_NAME} - fi - mv ${DEB_NAME} package_${VENDOR_NAME} - else - error "ERROR No suitable OBS debian package generated" - fi + # DEB_NAME=$(find ${BUILD_DIR} -maxdepth 1 -name "obs-webrtc*.deb" | sort -rn | head -1) + + # Deactivated - we have one vendor atm + # if [ "${DEB_NAME}" ]; then + # if [ ! -d package_${VENDOR_NAME} ]; then + # mkdir package_${VENDOR_NAME} + # fi + # mv ${DEB_NAME} package_${VENDOR_NAME} + # else + # error "ERROR No suitable OBS debian package generated" + # fi } package-obs-standalone() { @@ -48,7 +49,6 @@ package-obs-standalone() { GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) GIT_HASH=$(git rev-parse --short=9 HEAD) GIT_TAG=$(git describe --tags --abbrev=0) - UBUNTU_VERSION=$(lsb_release -sr) if [ "${BUILD_FOR_DISTRIBUTION}" = "true" ]; then VERSION_STRING="${GIT_TAG}" @@ -62,7 +62,7 @@ package-obs-standalone() { NDI_PLUGIN="" fi - FILE_NAME="obs-webrtc${NDI_PLUGIN}-${VERSION_STRING}-ubuntu-${UBUNTU_VERSION}.deb" + FILE_NAME="obs-webrtc${NDI_PLUGIN}-${VERSION_STRING}-${UBUNTU_VERSION}.deb" package_obs } diff --git a/CI/macos/01_install_dependencies.sh b/CI/macos/01_install_dependencies.sh index a59d30e01..b61f8844b 100755 --- a/CI/macos/01_install_dependencies.sh +++ b/CI/macos/01_install_dependencies.sh @@ -138,20 +138,23 @@ install_libwebrtc() { status "libWebRTC-${1}-${LIBWEBRTC_ARCH}-Release-H264-OpenSSL_1_1_1n.dmg" - if [ -d ${DEPS_BUILD_DIR}/libwebrtc_${ARCH} ]; then - ## libwebrtc has already been retrieved and installed - return + ensure_dir ${DEPS_BUILD_DIR} && pwd && ls -la + + if [[ -d libwebrtc_${ARCH} ]]; then + echo "libwebrtc_${ARCH} already exists." + return fi - ensure_dir ${DEPS_BUILD_DIR} - pwd - mv ../s/libWebRTC-${1}-${LIBWEBRTC_ARCH}-Release-H264-OpenSSL_1_1_1n.dmg libWebRTC_${ARCH}.dmg + + rm -rf libWebRTC_${ARCH}.dmg libWebRTC_${ARCH}.cdr || echo "No libWebRTC img in deps dir." && echo "Old libWebRTC img was removed from deps dir." + + mv ${GITHUB_WORKSPACE}/libWebRTC-${1}-${LIBWEBRTC_ARCH}-Release-H264-OpenSSL_1_1_1n.dmg libWebRTC_${ARCH}.dmg step "Bypass the EULA by converting the DMG download to a CDR image" - hdiutil convert -quiet libWebRTC_${ARCH}.dmg -format UDTO -o libWebRTC_${ARCH} + hdiutil convert libWebRTC_${ARCH}.dmg -format UDTO -o libWebRTC_${ARCH} step "Mount the CDR image" hdiutil attach -quiet -nobrowse -noverify libWebRTC_${ARCH}.cdr step "Copy to destination..." mkdir ./libwebrtc_${ARCH} - cp -r /Volumes/libWebRTC-${1}-${LIBWEBRTC_ARCH}-Release-H264-OpenSSL_1_1_1n/libwebrtc/* ./libwebrtc_${ARCH} + cp -r /Volumes/libWebRTC-${1}-${LIBWEBRTC_ARCH}-Release-H264-OpenSSL_1_1_1n/libwebrtc/* ./libwebrtc_${ARCH} && umount /Volumes/libWebRTC-${1}-${LIBWEBRTC_ARCH}-Release-H264-OpenSSL_1_1_1n } install_dependencies() { @@ -180,8 +183,7 @@ install_dependencies() { install-dependencies-standalone() { CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)" PRODUCT_NAME="OBS-WebRTC" - DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies_${ARCH}" - if [ -d "${DEPS_BUILD_DIR}" ]; then + if [[ -d "${DEPS_BUILD_DIR}" && $RESTORED_CEF != 'true' && $RESTORED_VLC != 'true' && $RESTORED_SPARKLE != 'true' ]]; then rm -rf ${DEPS_BUILD_DIR} fi source "${CHECKOUT_DIR}/CI/include/build_support.sh" diff --git a/CI/macos/02_build_obs.sh b/CI/macos/02_build_obs.sh index ee7fc65b7..7a869850e 100755 --- a/CI/macos/02_build_obs.sh +++ b/CI/macos/02_build_obs.sh @@ -66,7 +66,8 @@ _configure_obs() { fi if [ "${CI}" -a "${ARCH}" = "x86_64" ]; then - UNITTEST_OPTIONS="-DENABLE_UNIT_TESTS=ON" + UNITTEST_OPTIONS="-DENABLE_UNIT_TESTS=OFF" + echo "WARNING: UNIT_TESTS (CMOCKA) DISABLED" fi if [ "${VENDOR}" == "Millicast" ] diff --git a/CI/windows/01_install_dependencies.ps1 b/CI/windows/01_install_dependencies.ps1 index 8102497ca..c78c589a6 100644 --- a/CI/windows/01_install_dependencies.ps1 +++ b/CI/windows/01_install_dependencies.ps1 @@ -123,10 +123,12 @@ function Install-libwebrtc { ) Write-Status "Setup for dependency libwebrtc v${Version}" + Write-Status "DepsBuildDir: ${DepsBuildDir}" + Ensure-Directory $DepsBuildDir Write-Step "Unpack..." - & "..\s\libWebRTC-${Version}-x64-Mt-Release-H264-OpenSSL_1_1_1n.exe" /S /SD + & "${CheckoutDir}\libWebRTC-${Version}-x64-Mt-Release-H264-OpenSSL_1_1_1n.exe" /S /SD } function Install-openssl { diff --git a/CI/windows/02_build_obs.ps1 b/CI/windows/02_build_obs.ps1 index 57ffddd92..86e38d5eb 100644 --- a/CI/windows/02_build_obs.ps1 +++ b/CI/windows/02_build_obs.ps1 @@ -116,7 +116,7 @@ function Build-OBS-Standalone { $CheckoutDir = Resolve-Path -Path "$PSScriptRoot\..\.." $DepsBuildDir = "${CheckoutDir}/../obs-build-dependencies" - $ObsBuildDir = "${CheckoutDir}/../obs-studio" + $ObsBuildDir = "${CheckoutDir}" . ${CheckoutDir}/CI/include/build_support_windows.ps1 diff --git a/CI/windows/03_package_obs.ps1 b/CI/windows/03_package_obs.ps1 index 51f62e48f..5077fc8bb 100644 --- a/CI/windows/03_package_obs.ps1 +++ b/CI/windows/03_package_obs.ps1 @@ -70,10 +70,10 @@ function Package-OBS { } elseif ($BuildArch -eq "x64") { Write-Step "Install 64-bit OBS..." - Invoke-Expression "cmake --build `"${BuildDirectory}64`" --config ${BuildConfiguration} -t install" + Invoke-Expression "cmake --build `"${BuildDirectory}64_${Vendor}`" --config ${BuildConfiguration} -t install" $CompressVars = @{ - Path = "${CheckoutDir}/build64/install/bin", "${CheckoutDir}/build64/install/data", "${CheckoutDir}/build64/install/obs-plugins" + Path = "${BuildDirectory}64_${Vendor}/install/bin", "${BuildDirectory}64_${Vendor}/install/data", "${BuildDirectory}64_${Vendor}/install/obs-plugins" CompressionLevel = "Optimal" DestinationPath = "${FileName}-x64.zip" } diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 4705dfd8b..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,553 +0,0 @@ -# https://aka.ms/yaml - -variables: - - group: obs-pipeline -# new variables OBS 28 - - name: CEF_BUILD_VERSION_MAC - value: '5060' - - name: CEF_HASH_MAC_X86_64 - value: '88b950aa0bfc001061c35e7f1f3fefba856a6afb35e38b2b7b42ddd8dd239182' - - name: CEF_HASH_MAC_ARM64 - value: '98679b92eea6ea9959ac5aa54f46ca60681d8a86c768c35f496dbdd409bf0642' - - name: CEF_BUILD_VERSION_LINUX - value: '5060' - - name: CEF_BUILD_VERSION_WIN - value: '5060' - - name: QT_VERSION_MAC - value: '6.3.1' - - name: QT_HASH_MAC_X86_64 - value: 'a83f72a11023b03b6cb2dc365f0a66ad9df31163bbb4fe2df32d601856a9fad3' - - name: QT_HASH_MAC_ARM64 - value: '2f30af90c049670a5660656adbb440668aa1b0567f75a5f29e1def9108928403' - - name: QT_HASH_MAC_UNIVERSAL - value: '252e6684f43ab9c6f262c73af739e2296ce391b998da2c4ee04c254aaa07db18' - - name: QT_VERSION_WIN - value: '6.3.1' - - name: DEPS_VERSION_MAC - value: '2022-08-02' - - name: DEPS_HASH_MAC_X86_64 - value: '7637e52305e6fc53014b5aabd583f1a4490b1d97450420e977cae9a336a29525' - - name: DEPS_HASH_MAC_ARM64 - value: '755e0fa69b17a3ae444e1befa9d91d77e3cafe628fbd1c6333686091826595cd' - - name: DEPS_VERSION_WIN - value: '2022-08-02' - - name: VLC_VERSION_MAC - value: '3.0.8' - - name: VLC_HASH_MAC - value: 'e0149ef4a20a19b9ecd87309c2d27787ee3f47dfd47c6639644bc1f6fd95bdf6' - - name: VLC_VERSION_WIN - value: '3.0.0-git' -# older variables - - name: FTP_PATH_PREFIX - value: $(webrtc_path_prefix) - - name: FTP_LOGIN - value: $(ftpLudoLogin) - - name: FTP_PASSWORD - value: $(ftpLudoPassword) - - name: BUILD_TYPE - value: RelWithDebInfo - - name: LIBWEBRTC_VERSION - value: 112.0 - - name: LIBWEBRTC_RELEASE_TAG - value: 'm112-release' - - name: OBS_VERSION - value: 1.5.1-28.1.2-m112 -# for Mac code signing - - name: CODESIGN_TEAM_ID - value: $(apple_team_id) - - name: CODESIGN_IDENT - value: $(ludo_apple_developer_identity) - - name: WOWZA_CODESIGN_IDENT - value: $(wowza_apple_developer_identity) - - name: CODESIGN_IDENT_USER - value: $(ludo_apple_account_id) - - name: CODESIGN_IDENT_PASS - value: $(ludo_apple_developer_password) - - name: NOTARIZE_APP_SPECIFIC_PASSWORD - value: $(ludo_apple_app_specific_password) - -parameters: - - name: architectures - type: object - default: - - x86_64 -# - arm64 - - name: vendors - type: object - default: - - Millicast -# - PacPost -# - RemoteFilming -# - RemoteFilming-A -# - RemoteFilming-B -# - RemoteFilming-C -# - RemoteFilming-D -# - Wowza - - -jobs: -- job: PreprocessingBuild - pool: - vmImage: 'ubuntu-22.04' - steps: - - checkout: none - - bash: | - python3 -m pip install jwt requests - echo ${GH_APP_RELEASECREATOR_TOKEN_PYTHON_SCRIPT} | base64 -d > $(Pipeline.Workspace)/generate_gh_app_installation_token.py - echo ${GH_APP_RELEASECREATOR_PRIV_KEY} | base64 -d > $(Pipeline.Workspace)/gh_app_priv_key.pem - export PEM_FILE=$(Pipeline.Workspace)/gh_app_priv_key.pem - export GH_ACCESS_TOKEN_1H_EXPIRATION=$( python3 '$(Pipeline.Workspace)'/generate_gh_app_installation_token.py ) - rm $(Pipeline.Workspace)/gh_app_priv_key.pem $(Pipeline.Workspace)/generate_gh_app_installation_token.py - echo "##vso[task.setvariable variable=GH_ACCESS_TOKEN_1H_EXPIRATION;issecret=true;isoutput=true]${GH_ACCESS_TOKEN_1H_EXPIRATION}" - echo "GH_ACCESS_TOKEN_1H_EXPIRATION is ready." - env: - GH_APP_RELEASECREATOR_TOKEN_PYTHON_SCRIPT: $(gh_releasecreator_generate_at_script) - GH_APP_RELEASECREATOR_PRIV_KEY: $(gh_releasecreator_app_priv_key_2) - GH_APP_ID: $(gh_releasecreator_app_id) - GH_APP_INSTALLATION_ID: $(gh_releasecreator_app_installation_id) - name: accessToken - displayName: 'Generate GH App Access Token' - -- job: 'Build_macOS' - timeoutInMinutes: 800 - cancelTimeoutInMinutes: 800 - pool: - vmImage: 'macOS-12' - dependsOn: ['PreprocessingBuild'] - variables: - GH_ACCESS_TOKEN_1H_EXPIRATION: $[ dependencies.PreprocessingBuild.outputs['accessToken.GH_ACCESS_TOKEN_1H_EXPIRATION'] ] - LIBWEBRTC_ASSETS_PATTERN: "^libWebRTC-${{ variables.LIBWEBRTC_VERSION }}-.*64-Release-H264-OpenSSL_1_1_1.*.dmg.*" - steps: - - script: git submodule update --init --recursive - displayName: 'Checkout Submodules' - - bash: | - echo $(LIBWEBRTC_ASSETS_PATTERN) - export LIBWEBRTC_RELEASE_URL=$(curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/tags/${LIBWEBRTC_RELEASE_TAG} | jq .url | tr -d '"') - echo "LIBWEBRTC_RELEASE_URL: ${LIBWEBRTC_RELEASE_URL}" - curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" ${LIBWEBRTC_RELEASE_URL}/assets > assets.json - for asset_pair in $(cat assets.json | jq '.[] | (.id|tostring) + "|" + .name' | tr -d '"') - do - asset_pair=( ${asset_pair//|/ } ) - if [[ $(echo ${asset_pair[1]} | grep -e $(LIBWEBRTC_ASSETS_PATTERN)) ]]; then - echo "Downloading ${asset_pair[1]} from GitHub - GH_ASSET_ID: ${asset_pair[0]}..." - curl -L -H "Accept: application/octet-stream" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/assets/${asset_pair[0]} > $(System.DefaultWorkingDirectory)/${asset_pair[1]} - fi - done - rm assets.json - ls -la $(System.DefaultWorkingDirectory) - env: - LIBWEBRTC_RELEASE_TAG: ${{ variables.LIBWEBRTC_RELEASE_TAG }} - name: libWebRTCassets - displayName: 'Download libwebrtc release assets' - - ${{ each arch in parameters.architectures }}: - - script: TERM="" ./CI/macos/01_install_dependencies.sh --architecture ${{ arch }} - displayName: '${{ arch }} Install dependencies' - env: - CURRENT_ARCH: ${{ arch }} - MACOSX_DEPLOYMENT_TARGET_X86_64: '10.15' - MACOSX_DEPLOYMENT_TARGET_ARM64: '11.0' - SPARKLE_VERSION: '1.26.0' - SPARKLE_HASH: '8312cbf7528297a49f1b97692c33cb8d33254c396dc51be394e9484e4b6833a0' - - ${{ each vendor in parameters.vendors }}: - - ${{ if ne( vendor, 'Wowza') }}: - - task: InstallAppleCertificate@2 - displayName: '🔐 Install CoSMo Signing Certificate' - inputs: - certSecureFile: CertificatesCosmo.p12 - certPwd: $(certificatesCosmoPassword) - - ${{ if eq( vendor, 'Wowza') }}: - - task: InstallAppleCertificate@2 - displayName: '🔐 Install Wowza Signing Certificate' - inputs: - certSecureFile: wowza.p12 - certPwd: $(wowza_mac_certificate_password) - - script: git stash - displayName: git stash - - script: rm -rf plugins/obs-ndi - displayName: rm plugins/obs-ndi - - script: rm -rf plugins/obs-browser - displayName: rm plugins/obs-browser - - script: git submodule update --init --recursive - displayName: 'Checkout Submodules' - - ${{ each arch in parameters.architectures }}: - - ${{ if eq( vendor, 'Wowza') }}: - - bash: | - cp vendor_skins/Wowza/cmake/Modules/VersionConfig.cmake cmake/Modules/ - displayName: Wowza copy file cmake/Modules/VersionConfig.cmake - # Generate OBS without obs-ndi plugin - - script: TERM="" ./CI/macos/02_build_obs.sh --codesign --build-dir build_${{ vendor }}_${{ arch }} --architecture ${{ arch }} --vendor ${{ vendor }} - displayName: '${{ vendor }} ${{ arch }} Build OBS' - env: - CURRENT_ARCH: ${{ arch }} - CODESIGN_TEAM_ID: $(apple_team_id) - CODESIGN_IDENT: $(apple_team_id) - WOWZA_CODESIGN_IDENT: $(wowza_apple_developer_identity) - CODESIGN_IDENT_USER: $(sapi_apple_account_id) - NOTARIZE_APP_SPECIFIC_PASSWORD: $(sapi_apple_app_specific_password) - - script: TERM="" ./CI/macos/03_package_obs.sh --codesign --notarize --build-dir build_${{ vendor }}_${{ arch }} --architecture ${{ arch }} --vendor ${{ vendor }} - displayName: '${{ vendor }} ${{ arch }} Package, sign, notarize' - env: - CURRENT_ARCH: ${{ arch }} - CODESIGN_TEAM_ID: $(apple_team_id) - CODESIGN_IDENT: $(apple_team_id) - WOWZA_CODESIGN_IDENT: $(wowza_apple_developer_identity) - CODESIGN_IDENT_USER: $(sapi_apple_account_id) - NOTARIZE_APP_SPECIFIC_PASSWORD: $(sapi_apple_app_specific_password) - # Generate OBS with obs-ndi plugin - - script: TERM="" ./CI/macos/02_build_obs.sh --codesign --build-dir build_${{ vendor }}_${{ arch }} --architecture ${{ arch }} --vendor ${{ vendor }} --ndi - displayName: '${{ vendor }} ${{ arch }} Build OBS + plugin obs-ndi' - env: - CURRENT_ARCH: ${{ arch }} - CODESIGN_TEAM_ID: $(apple_team_id) - CODESIGN_IDENT: $(apple_team_id) - WOWZA_CODESIGN_IDENT: $(wowza_apple_developer_identity) - CODESIGN_IDENT_USER: $(sapi_apple_account_id) - NOTARIZE_APP_SPECIFIC_PASSWORD: $(sapi_apple_app_specific_password) - - script: TERM="" ./CI/macos/03_package_obs.sh --codesign --notarize --build-dir build_${{ vendor }}_${{ arch }} --architecture ${{ arch }} --vendor ${{ vendor }} --ndi - displayName: '${{ vendor }} ${{ arch }} Package, sign, notarize' - env: - CURRENT_ARCH: ${{ arch }} - CODESIGN_TEAM_ID: $(apple_team_id) - CODESIGN_IDENT: $(apple_team_id) - WOWZA_CODESIGN_IDENT: $(wowza_apple_developer_identity) - CODESIGN_IDENT_USER: $(sapi_apple_account_id) - NOTARIZE_APP_SPECIFIC_PASSWORD: $(sapi_apple_app_specific_password) - - ${{ if eq( vendor, 'Millicast') }}: - - bash: | - ls -l build_${{ vendor }}_${{ arch }} - displayName: "List build_${{ vendor }}_${{ arch }} dir" - - bash: | - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "obs-webrtc-${OBS_VERSION}-macos-${{ arch }}.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "obs-webrtc-ndi-${OBS_VERSION}-macos-${{ arch }}.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - displayName: '${{ vendor }} ${{ arch }} Copy disk image' - - ${{ if eq( vendor, 'RemoteFilming') }}: - - bash: | - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "Remote-Filming-*.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - displayName: '${{ vendor }} ${{ arch }} Copy disk image' - - ${{ if eq( vendor, 'RemoteFilming-A') }}: - - bash: | - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "A-CAM-*.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - displayName: '${{ vendor }} ${{ arch }} Copy disk image' - - ${{ if eq( vendor, 'RemoteFilming-B') }}: - - bash: | - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "B-CAM-*.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - displayName: '${{ vendor }} ${{ arch }} Copy disk image' - - ${{ if eq( vendor, 'RemoteFilming-C') }}: - - bash: | - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "C-CAM-*.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - displayName: '${{ vendor }} ${{ arch }} Copy disk image' - - ${{ if eq( vendor, 'RemoteFilming-D') }}: - - bash: | - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "D-CAM-*.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - displayName: '${{ vendor }} ${{ arch }} Copy disk image' - - ${{ if eq( vendor, 'Wowza') }}: - - bash: | - ARTIFACT_NAME=$(basename $(/usr/bin/find build_${{ vendor }}_${{ arch }} -type f -name "Wowza-OBS-Real-Time-*-${{ arch }}.dmg" -depth 1 | head -1)) - mkdir -p ./nightly_${{ vendor }}_${{ arch }} - mv build_${{ vendor }}_${{ arch }}/${ARTIFACT_NAME} ./nightly_${{ vendor }}_${{ arch }} - displayName: '${{ vendor }} ${{ arch }} Copy disk image' - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: './nightly_${{ vendor }}_${{ arch }}' - artifactName: macbuild_${{ vendor }}_${{ arch }} - -- job: 'Build_Windows64' - timeoutInMinutes: 300 - cancelTimeoutInMinutes: 300 - pool: - vmImage: 'windows-2022' - dependsOn: ['PreprocessingBuild'] - variables: - GH_ACCESS_TOKEN_1H_EXPIRATION: $[ dependencies.PreprocessingBuild.outputs['accessToken.GH_ACCESS_TOKEN_1H_EXPIRATION'] ] - LIBWEBRTC_ASSETS_PATTERN: "^libWebRTC-${{ variables.LIBWEBRTC_VERSION }}-x64-Mt-Release-.*.exe.*" - steps: - - task: DotNetCoreCLI@2 - inputs: - command: 'custom' - custom: 'tool' - arguments: 'install --global azuresigntool' - displayName: Install AzureSignTool - - powershell: | - cmd.exe where type - $tmp_path = Join-Path -Path $(System.DefaultWorkingDirectory) -ChildPath assets.json - $env:LIBWEBRTC_RELEASE_URL = cmd.exe /c curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" "https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/tags/$env:LIBWEBRTC_RELEASE_TAG" | jq -r .url - Write-Host $env:LIBWEBRTC_RELEASE_URL - - cmd.exe /c curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" $env:LIBWEBRTC_RELEASE_URL/assets > assets.json - cmd.exe /c type .\assets.json | jq -r '.[] | (.id|tostring) + \"|\" + .name' > assets.txt - - Get-Content -Path .\assets.txt | ForEach-Object -Process { - $asset_pair = $_.Split("|") - if ( $asset_pair[1] -match "$(LIBWEBRTC_ASSETS_PATTERN)" ) { - $asset_path = Join-Path -Path $(System.DefaultWorkingDirectory) -ChildPath $asset_pair[1] - $asset_url = "https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/assets/" + $asset_pair[0] - Write-Host "Asset url:" $asset_url - Write-Host "Downloading " $asset_pair[1] " from GitHub - GH_ASSET_ID: " $asset_pair[0] "..." - cmd.exe /c curl -L -H "Accept: application/octet-stream" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" $asset_url --output $asset_path - } - } - Get-ChildItem $(System.DefaultWorkingDirectory) - Remove-Item -Path .\assets.json - Remove-Item -Path .\assets.txt - env: - LIBWEBRTC_RELEASE_TAG: ${{ variables.LIBWEBRTC_RELEASE_TAG }} - displayName: Download libwebrtc - - script: git submodule update --init --recursive - displayName: 'Checkout Submodules' - - powershell: ./CI/windows/01_install_dependencies.ps1 -BuildArch x64 - displayName: 'Install dependencies' - timeoutInMinutes: 200 - - ${{ each vendor in parameters.vendors }}: - - script: git stash - displayName: git stash - - script: rmdir /S /Q plugins\\obs-ndi - displayName: rmdir plugins/obs-ndi - - script: rmdir /S /Q plugins\\obs-browser - displayName: rmdir plugins/obs-browser - - script: git submodule update --init --recursive - displayName: 'Checkout Submodules' - - ${{ if eq( vendor, 'Wowza') }}: - - bash: | - cp vendor_skins/Wowza/cmake/Modules/VersionConfig.cmake cmake/Modules/ - displayName: Wowza copy file cmake/Modules/VersionConfig.cmake - # Generate OBS without obs-ndi plugin - - powershell: ./CI/windows/02_build_obs.ps1 -BuildArch x64 -Vendor ${{ vendor }} - displayName: '${{ vendor }} Build OBS' - env: - OBS_VERSION: $(OBS_VERSION) - CMAKE_GENERATOR: 'Visual Studio 17 2022' - CMAKE_SYSTEM_VERSION: '10.0.18363.657' - VIRTUALCAM-GUID: 'A3FCE0F5-3493-419F-958A-ABA1250EC20B' - # Generate OBS with obs-ndi plugin - - powershell: ./CI/windows/02_build_obs.ps1 -BuildArch x64 -Vendor ${{ vendor }} -Ndi ON - displayName: '${{ vendor }} Build OBS + plugin obs-ndi' - env: - OBS_VERSION: $(OBS_VERSION) - CMAKE_GENERATOR: 'Visual Studio 17 2022' - CMAKE_SYSTEM_VERSION: '10.0.18363.657' - VIRTUALCAM-GUID: 'A3FCE0F5-3493-419F-958A-ABA1250EC20B' - - ${{ if eq( vendor, 'Millicast') }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build64_${{ vendor }}/UI/$(BUILD_TYPE)/obs64.exe - displayName: 'Sign obs64.exe with global AzureSignTool' - - ${{ if or( eq( vendor, 'RemoteFilming'), eq( vendor, 'RemoteFilming-A'), eq( vendor, 'RemoteFilming-B'), eq( vendor, 'RemoteFilming-C'), eq( vendor, 'RemoteFilming-D') ) }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build64_${{ vendor }}/UI/$(BUILD_TYPE)/obs64.exe - displayName: 'Sign obs64.exe with global AzureSignTool' - # - ${{ if eq( vendor, 'Wowza') }}: - # - task: CmdLine@2 - # inputs: - # script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WOWZA_SIGNING_CLIENT_SECRET)" -kvc "$(WOWZA_SIGNING_CERTIFICATE_NAME)" -td sha256 -v ./build64_${{ vendor }}/UI/$(BUILD_TYPE)/obs64.exe - # displayName: 'Sign obs64.exe with global AzureSignTool' - - script: ./CI/windows/before-deploy-win.cmd ${{ vendor }} - displayName: '${{ vendor }} Before deploy' - env: - BUILD_TYPE: $(BUILD_TYPE) - - ${{ if eq( vendor, 'Millicast') }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build_${{ vendor }}/obs-webrtc-x64-$(OBS_VERSION).exe - displayName: 'Sign build_${{ vendor }} with global AzureSignTool' - - ${{ if eq( vendor, 'RemoteFilming') }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build_${{ vendor }}/remote-filming-x64-$(OBS_VERSION).exe - displayName: 'Sign build_${{ vendor }} with global AzureSignTool' - - ${{ if eq( vendor, 'RemoteFilming-A') }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build_${{ vendor }}/remote-filming-A-x64-$(OBS_VERSION).exe - displayName: 'Sign build_${{ vendor }} with global AzureSignTool' - - ${{ if eq( vendor, 'RemoteFilming-B') }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build_${{ vendor }}/remote-filming-B-x64-$(OBS_VERSION).exe - displayName: 'Sign build_${{ vendor }} with global AzureSignTool' - - ${{ if eq( vendor, 'RemoteFilming-C') }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build_${{ vendor }}/remote-filming-C-x64-$(OBS_VERSION).exe - displayName: 'Sign build_${{ vendor }} with global AzureSignTool' - - ${{ if eq( vendor, 'RemoteFilming-D') }}: - - task: CmdLine@2 - inputs: - script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WINDOWS_SIGNING_CLIENT_SECRET)" -kvc "$(WINDOWS_SIGNING_CERTIFICATE_NAME)" -tr "http://timestamp.comodoca.com" -td sha256 -v ./build_${{ vendor }}/remote-filming-D-x64-$(OBS_VERSION).exe - displayName: 'Sign build_${{ vendor }} with global AzureSignTool' - # - ${{ if eq( vendor, 'Wowza') }}: - # - task: CmdLine@2 - # inputs: - # script: AzureSignTool sign -kvt "$(WINDOWS_SIGNING_TENANT_ID)" -kvu "$(WINDOWS_SIGNING_VAULT_URL)" -kvi "$(WINDOWS_SIGNING_CLIENT_ID)" -kvs "$(WOWZA_SIGNING_CLIENT_SECRET)" -kvc "$(WOWZA_SIGNING_CERTIFICATE_NAME)" -td sha256 -v ./build_${{ vendor }}/wowza-obs-x64-$(OBS_VERSION).exe - # displayName: 'Sign build_${{ vendor }} with global AzureSignTool' - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: './build_${{ vendor }}' - artifactName: winbuild_${{ vendor }} - -- job: 'Build_Ubuntu_20_04' - pool: - vmImage: 'ubuntu-20.04' - dependsOn: PreprocessingBuild - variables: - GH_ACCESS_TOKEN_1H_EXPIRATION: $[ dependencies.PreprocessingBuild.outputs['accessToken.GH_ACCESS_TOKEN_1H_EXPIRATION'] ] - LIBWEBRTC_ASSETS_PATTERN: "^libWebRTC-${{ variables.LIBWEBRTC_VERSION }}-.*64-Release-.*.sh.*" - steps: - - bash: | - export LIBWEBRTC_RELEASE_URL=$(curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/tags/${LIBWEBRTC_RELEASE_TAG} | jq .url | tr -d '"') - echo "LIBWEBRTC_RELEASE_URL: ${LIBWEBRTC_RELEASE_URL}" - curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" ${LIBWEBRTC_RELEASE_URL}/assets > assets.json - for asset_pair in $(cat assets.json | jq '.[] | (.id|tostring) + "|" + .name' | tr -d '"') - do - asset_pair=( ${asset_pair//|/ } ) - if [[ $(echo ${asset_pair[1]} | grep -e $(LIBWEBRTC_ASSETS_PATTERN)) ]]; then - echo "Downloading ${asset_pair[1]} from GitHub - GH_ASSET_ID: ${asset_pair[0]}..." - curl -L -H "Accept: application/octet-stream" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/assets/${asset_pair[0]} > $(System.DefaultWorkingDirectory)/${asset_pair[1]} - fi - done - rm assets.json - ls -la $(System.DefaultWorkingDirectory) - env: - LIBWEBRTC_RELEASE_TAG: ${{ variables.LIBWEBRTC_RELEASE_TAG }} - name: libWebRTCassets - displayName: 'Download libwebrtc release assets' - - - bash: | - git submodule update --init --recursive - ./CI/linux/01_install_dependencies.sh --disable-pipewire - displayName: 'checkout and dependencies' - - ${{ each vendor in parameters.vendors }}: - - bash: | - set -e - git stash - rm -rf plugins/obs-browser - rm -rf plugins/obs-ndi - git submodule update --init --recursive - displayName: 'git stash' - - ${{ if eq( vendor, 'Wowza') }}: - - bash: cp vendor_skins/Wowza/cmake/Modules/VersionConfig.cmake cmake/Modules/ - displayName: copy Wowza VersionConfig.cmake - - bash: | - set -e - export CC=clang - export CXX=clang++ - ./CI/linux/02_build_obs.sh --disable-pipewire --vendor ${{ vendor }} - ./CI/linux/03_package_obs.sh --vendor ${{ vendor }} - cd build - cmake .. -DCMAKE_INSTALL_PREFIX=../install - cmake --install . - cd .. - pushd plugins/obs-ndi - mkdir BUILD - cd BUILD - cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLINUX_PORTABLE=OFF -DUBUNTU_VERSION=2004 - make -j4 - cpack - cd ../release - mv *.deb ../../../package_${{ vendor }} - popd - cd build - rm CMakeCache.txt - cd .. - ./CI/linux/02_build_obs.sh --disable-pipewire --vendor ${{ vendor }} --ndi - ./CI/linux/03_package_obs.sh --vendor ${{ vendor }} - displayName: '${{ vendor }} cmake, build, package' - env: - OBS_VERSION: "$(OBS_VERSION)_2004" - UBUNTU_VERSION: "2004" - CI_BUILD_TYPE: $(BUILD_TYPE) - PACKAGE_DEPENDENCIES: - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: './package_${{ vendor }}' - artifactName: 'debbuild_2004_${{ vendor }}' - -- job: 'Build_Ubuntu_22_04' - pool: - vmImage: 'ubuntu-22.04' - dependsOn: PreprocessingBuild - variables: - GH_ACCESS_TOKEN_1H_EXPIRATION: $[ dependencies.PreprocessingBuild.outputs['accessToken.GH_ACCESS_TOKEN_1H_EXPIRATION'] ] - LIBWEBRTC_ASSETS_PATTERN: "^libWebRTC-${{ variables.LIBWEBRTC_VERSION }}-.*64-Release-.*.sh.*" - steps: - - bash: | - export LIBWEBRTC_RELEASE_URL=$(curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/tags/${LIBWEBRTC_RELEASE_TAG} | jq .url | tr -d '"') - echo "LIBWEBRTC_RELEASE_URL: ${LIBWEBRTC_RELEASE_URL}" - curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" ${LIBWEBRTC_RELEASE_URL}/assets > assets.json - for asset_pair in $(cat assets.json | jq '.[] | (.id|tostring) + "|" + .name' | tr -d '"') - do - asset_pair=( ${asset_pair//|/ } ) - if [[ $(echo ${asset_pair[1]} | grep -e $(LIBWEBRTC_ASSETS_PATTERN)) ]]; then - echo "Downloading ${asset_pair[1]} from GitHub - GH_ASSET_ID: ${asset_pair[0]}..." - curl -L -H "Accept: application/octet-stream" -H "Authorization: Bearer $(GH_ACCESS_TOKEN_1H_EXPIRATION)" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/CoSMoSoftware/libwebrtc-cmake/releases/assets/${asset_pair[0]} > $(System.DefaultWorkingDirectory)/${asset_pair[1]} - fi - done - rm assets.json - ls -la $(System.DefaultWorkingDirectory) - env: - LIBWEBRTC_RELEASE_TAG: ${{ variables.LIBWEBRTC_RELEASE_TAG }} - name: libWebRTCassets - displayName: 'Download libwebrtc release assets' - - - bash: | - git submodule update --init --recursive - ./CI/linux/01_install_dependencies.sh --disable-pipewire - displayName: 'checkout and dependencies' - - ${{ each vendor in parameters.vendors }}: - - bash: | - set -e - git stash - rm -rf plugins/obs-browser - rm -rf plugins/obs-ndi - git submodule update --init --recursive - displayName: 'git stash' - - ${{ if eq( vendor, 'Wowza') }}: - - bash: cp vendor_skins/Wowza/cmake/Modules/VersionConfig.cmake cmake/Modules/ - displayName: copy Wowza VersionConfig.cmake - - bash: | - export CC=clang - export CXX=clang++ - ./CI/linux/02_build_obs.sh --disable-pipewire --vendor ${{ vendor }} - ./CI/linux/03_package_obs.sh --vendor ${{ vendor }} - cd build - cmake .. -DCMAKE_INSTALL_PREFIX=../install - cmake --install . - cd .. - pushd plugins/obs-ndi - mkdir BUILD - cd BUILD - cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLINUX_PORTABLE=OFF -DUBUNTU_VERSION=2204 - make -j4 - cpack - cd ../release - mv *.deb ../../../package_${{ vendor }} - popd - cd build - rm CMakeCache.txt - cd .. - ./CI/linux/02_build_obs.sh --disable-pipewire --vendor ${{ vendor }} --ndi - ./CI/linux/03_package_obs.sh --vendor ${{ vendor }} - displayName: '${{ vendor }} cmake, build, package' - env: - OBS_VERSION: "$(OBS_VERSION)_2204" - UBUNTU_VERSION: "2204" - CI_BUILD_TYPE: $(BUILD_TYPE) - PACKAGE_DEPENDENCIES: "qt6-wayland" - - task: PublishBuildArtifacts@1 - inputs: - pathtoPublish: './package_${{ vendor }}' - artifactName: 'debbuild_2204_${{ vendor }}' diff --git a/cmake/Modules/FindLibVLC.cmake b/cmake/Modules/FindLibVLC.cmake index 38791cf00..33adb2097 100644 --- a/cmake/Modules/FindLibVLC.cmake +++ b/cmake/Modules/FindLibVLC.cmake @@ -14,6 +14,8 @@ else() set(_lib_suffix 32) endif() +message(STATUS "HERE IS THIS ${CMAKE_SOURCE_DIR}/${VLC_PATH}") + find_path( VLC_INCLUDE_DIR NAMES libvlc.h diff --git a/test/cmocka/CMakeLists.txt b/test/cmocka/CMakeLists.txt index d31da02b3..5a3941647 100644 --- a/test/cmocka/CMakeLists.txt +++ b/test/cmocka/CMakeLists.txt @@ -1,6 +1,8 @@ project(obs-cmocka) -find_package(CMocka CONFIG REQUIRED) +find_package(CMocka CONFIG REQUIRED + PATHS /usr/local/opt/cmocka +) # Serializer test add_executable(test_serializer test_serializer.c)