name: Plugin Build on: push: paths-ignore: - '**.md' branches: - master - main tags: - '*' pull_request: paths-ignore: - '**.md' branches: - master - main env: PLUGIN_NAME: 'obs-plugintemplate' jobs: clang_check: name: 01 - Code Format Check runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - name: Install clang-format run: sudo apt-get install -y clang-format-13 - name: Run clang-format run: ./.github/scripts/check-format.sh && ./.github/scripts/check-changes.sh - name: Install cmake-format run: sudo pip install cmakelang - name: Run cmake-format run: ./.github/scripts/check-cmake.sh macos_build: name: 02 - macOS runs-on: macos-12 strategy: fail-fast: true matrix: arch: [x86_64, arm64, universal] if: always() needs: [clang_check] outputs: commitHash: ${{ steps.setup.outputs.commitHash }} env: CODESIGN_IDENT: '-' CODESIGN_IDENT_INSTALLER: '' MACOSX_DEPLOYMENT_TARGET: '10.15' defaults: run: shell: zsh {0} steps: - name: Checkout uses: actions/checkout@v3 with: path: plugin submodules: recursive - name: Checkout obs-studio uses: actions/checkout@v3 with: repository: 'obsproject/obs-studio' path: obs-studio fetch-depth: 0 submodules: recursive - name: Setup Environment id: setup working-directory: ${{ github.workspace }}/plugin run: | ## SETUP ENVIRONMENT SCRIPT print '::group::Clean Homebrew Environment' typeset -a to_remove=() for formula (speexdsp curl php) { if [[ -d ${HOMEBREW_PREFIX}/opt/${formula} ]] to_remove+=(${formula}) } if (( #to_remove > 0 )) brew uninstall --ignore-dependencies ${to_remove} print '::endgroup::' print '::group::Set up code signing' if [[ '${{ secrets.MACOS_SIGNING_APPLICATION_IDENTITY }}' != '' && \ '${{ secrets.MACOS_SIGNING_INSTALLER_IDENTITY }}' != '' && \ '${{ secrets.MACOS_SIGNING_CERT }}' != '' ]] { print '::set-output name=haveCodesignIdent::true' } else { print '::set-output name=haveCodesignIdent::false' } if [[ '${{ secrets.MACOS_NOTARIZATION_USERNAME }}' != '' && \ '${{ secrets.MACOS_NOTARIZATION_PASSWORD }}' != '' ]] { print '::set-output name=haveNotarizationUser::true' } else { print '::set-output name=haveNotarizationUser::false' } print '::endgroup::' print "::set-output name=ccacheDate::$(date +"%Y-%m-%d")" print "::set-output name=commitHash::${"$(git rev-parse HEAD)"[0,9]}" - name: Restore Compilation Cache id: ccache-cache uses: actions/cache@v3 with: path: ${{ github.workspace }}/.ccache key: macos-${{ matrix.arch }}-ccache-plugin-${{ steps.setup.outputs.ccacheDate }} restore-keys: | macos-${{ matrix.arch }}-ccache-plugin- - name: Check for GitHub Labels id: seekingTesters if: ${{ github.event_name == 'pull_request' }} run: | if [[ -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')" ]] { print '::set-output name=found::true' } else { print '::set-output name=found::false' } - name: Install Apple Developer Certificate if: ${{ github.event_name != 'pull_request' && steps.setup.outputs.haveCodesignIdent == 'true' }} uses: apple-actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071 with: keychain-password: ${{ github.run_id }} p12-file-base64: ${{ secrets.MACOS_SIGNING_CERT }} p12-password: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }} - name: Set Signing Identity if: ${{ github.event_name != 'pull_request' && steps.setup.outputs.haveCodesignIdent == 'true' }} run: | print "CODESIGN_IDENT=${{ secrets.MACOS_SIGNING_APPLICATION_IDENTITY }}" >> $GITHUB_ENV print "CODESIGN_IDENT_INSTALLER=${{ secrets.MACOS_SIGNING_INSTALLER_IDENTITY }}" >> $GITHUB_ENV - name: Build Plugin uses: ./plugin/.github/actions/build-plugin with: workingDirectory: ${{ github.workspace }}/plugin target: ${{ matrix.arch }} config: RelWithDebInfo codesign: 'true' codesignIdent: ${{ env.CODESIGN_IDENT }} - name: Package Plugin uses: ./plugin/.github/actions/package-plugin with: workingDirectory: ${{ github.workspace }}/plugin target: ${{ matrix.arch }} config: RelWithDebInfo codesign: ${{ github.event_name != 'pull_request' && steps.setup.outputs.haveCodesignIdent == 'true' }} notarize: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && steps.setup.outputs.haveNotarizationUser == 'true' }} codesignIdent: ${{ env.CODESIGN_IDENT }} installerIdent: ${{ env.CODESIGN_IDENT_INSTALLER }} codesignUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }} codesignPass: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }} - name: Upload Build Artifact if: ${{ success() && (github.event_name != 'pull_request' || steps.seekingTesters.outputs.found == 'true') }} uses: actions/upload-artifact@v3 with: name: ${{ env.PLUGIN_NAME }}-macos-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }} path: ${{ github.workspace }}/plugin/release/${{ env.PLUGIN_NAME }}-*-macos-${{ matrix.arch }}.pkg linux_build: name: 02 - Linux runs-on: ubuntu-22.04 strategy: fail-fast: true matrix: arch: [x86_64] if: always() needs: [clang_check] outputs: commitHash: ${{ steps.setup.outputs.commitHash }} defaults: run: shell: bash steps: - name: Checkout uses: actions/checkout@v3 with: path: plugin submodules: recursive - name: Checkout obs-studio uses: actions/checkout@v3 with: repository: 'obsproject/obs-studio' path: obs-studio fetch-depth: 0 submodules: recursive - name: Setup Environment working-directory: ${{ github.workspace }}/plugin id: setup run: | ## SETUP ENVIRONMENT SCRIPT echo "::set-output name=ccacheDate::$(date +"%Y-%m-%d")" echo "::set-output name=commitHash::$(git rev-parse HEAD | cut -c1-9)" - name: Restore Compilation Cache id: ccache-cache uses: actions/cache@v3 with: path: ${{ github.workspace }}/.ccache key: linux-${{ matrix.arch }}-ccache-plugin-${{ steps.setup.outputs.ccacheDate }} restore-keys: | linux-${{ matrix.arch }}-ccache-plugin- - name: Check for GitHub Labels id: seekingTesters if: ${{ github.event_name == 'pull_request' }} run: | ## GITHUB LABEL SCRIPT if [[ -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')" ]]; then echo '::set-output name=found::true' else echo '::set-output name=found::false' fi - name: Build Plugin uses: ./plugin/.github/actions/build-plugin with: workingDirectory: ${{ github.workspace }}/plugin target: ${{ matrix.arch }} config: RelWithDebInfo - name: Package Plugin uses: ./plugin/.github/actions/package-plugin with: workingDirectory: ${{ github.workspace }}/plugin target: ${{ matrix.arch }} config: RelWithDebInfo - name: Upload Build Artifact if: ${{ success() && (github.event_name != 'pull_request' || steps.seekingTesters.outputs.found == 'true') }} uses: actions/upload-artifact@v3 with: name: ${{ env.PLUGIN_NAME }}-linux-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }} path: ${{ github.workspace }}/plugin/release/${{ env.PLUGIN_NAME }}-*-linux-${{ matrix.arch }}.* windows_build: name: 02 - Windows runs-on: windows-2022 strategy: fail-fast: true matrix: arch: [x64] if: always() needs: [clang_check] outputs: commitHash: ${{ steps.setup.outputs.commitHash }} defaults: run: shell: pwsh steps: - name: Checkout uses: actions/checkout@v3 with: path: plugin submodules: recursive - name: Checkout obs-studio uses: actions/checkout@v3 with: repository: 'obsproject/obs-studio' path: obs-studio fetch-depth: 0 submodules: recursive - name: Setup Environment working-directory: ${{ github.workspace }}/plugin id: setup run: | ## SETUP ENVIRONMENT SCRIPT $CommitHash = (git rev-parse HEAD)[0..8] -join '' Write-Output "::set-output name=commitHash::${CommitHash}" - name: Check for GitHub Labels id: seekingTesters working-directory: ${{ github.workspace }}/plugin if: ${{ github.event_name == 'pull_request' }} run: | ## GITHUB LABEL SCRIPT $LabelFound = try { $Params = @{ Authentication = 'Bearer' Token = (ConvertTo-SecureString '${{ secrets.GITHUB_TOKEN }}' -AsPlainText) Uri = '${{ github.event.pull_request.url }}' UseBasicParsing = $true } (Invoke-RestMethod @Params).labels.name.contains('Seeking Testers') } catch { $false } Write-Output "::set-output name=found::$(([string]${LabelFound}).ToLower())" - name: Build Plugin uses: ./plugin/.github/actions/build-plugin with: workingDirectory: ${{ github.workspace }}/plugin target: ${{ matrix.arch }} config: RelWithDebInfo visualStudio: 'Visual Studio 17 2022' - name: Package Plugin uses: ./plugin/.github/actions/package-plugin with: workingDirectory: ${{ github.workspace }}/plugin target: ${{ matrix.arch }} config: RelWithDebInfo - name: Upload Build Artifact if: ${{ success() && (github.event_name != 'pull_request' || steps.seekingTesters.outputs.found == 'true') }} uses: actions/upload-artifact@v3 with: name: ${{ env.PLUGIN_NAME }}-windows-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }} path: ${{ github.workspace }}/plugin/release/${{ env.PLUGIN_NAME }}-*.zip - name: Package Plugin Installer if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} uses: ./plugin/.github/actions/package-plugin with: workingDirectory: ${{ github.workspace }}/plugin target: ${{ matrix.arch }} config: RelWithDebInfo createInstaller: true - name: Upload Installer Artifact if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} uses: actions/upload-artifact@v3 with: name: ${{ env.PLUGIN_NAME }}-windows-${{ matrix.arch }}-${{ steps.setup.outputs.commitHash }}-installer path: ${{ github.workspace }}/plugin/release/${{ env.PLUGIN_NAME }}-*.exe make-release: name: 03 - Create and upload release runs-on: ubuntu-22.04 if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') needs: [macos_build, linux_build, windows_build] defaults: run: shell: bash steps: - name: Get Metadata id: metadata run: | ## METADATA SCRIPT echo "::set-output name=version::${GITHUB_REF/refs\/tags\//}" - name: Download build artifacts uses: actions/download-artifact@v3 - name: Generate Checksums run: | ## CHECKSUM GENERATION SCRIPT shopt -s extglob echo "### Checksums" > ${{ github.workspace }}/CHECKSUMS.txt for file in ${{ github.workspace }}/**/@(*.pkg|*.exe|*.deb|*.zip); do echo " ${file##*/}: $(sha256sum "${file}" | cut -d " " -f 1)" >> ${{ github.workspace }}/CHECKSUMS.txt done - name: Create Release id: create_release uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5 with: draft: false prerelease: ${{ contains(steps.metadata.outputs.version, 'rc') || contains(steps.metadata.outputs.version, 'beta') }} tag_name: ${{ steps.metadata.outputs.version }} name: "${{ env.PLUGIN_NAME }} ${{ steps.metadata.outputs.version }}" body_path: ${{ github.workspace }}/CHECKSUMS.txt files: | ${{ github.workspace }}/**/*.zip ${{ github.workspace }}/**/*.exe ${{ github.workspace }}/**/*.deb ${{ github.workspace }}/**/*.pkg