diff --git a/CI/macos/obs-websocket.pkgproj b/CI/macos/obs-websocket.pkgproj
index 0fd5758f..e3b175e4 100644
--- a/CI/macos/obs-websocket.pkgproj
+++ b/CI/macos/obs-websocket.pkgproj
@@ -514,7 +514,7 @@
CONCLUSION_ACTION
0
IDENTIFIER
- fr.palakis.obswebsocket
+ fr.palakis.obs-websocket
OVERWRITE_PERMISSIONS
VERSION
diff --git a/CI/package-macos.sh b/CI/package-macos.sh
index b269dc89..f309cf34 100755
--- a/CI/package-macos.sh
+++ b/CI/package-macos.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
set -e
@@ -12,30 +12,79 @@ fi
echo "[obs-websocket] Preparing package build"
export QT_CELLAR_PREFIX="$(/usr/bin/find /usr/local/Cellar/qt -d 1 | sort -t '.' -k 1,1n -k 2,2n -k 3,3n | tail -n 1)"
-export GIT_HASH=$(git rev-parse --short HEAD)
-export GIT_BRANCH_OR_TAG=$(git name-rev --name-only HEAD | awk -F/ '{print $NF}')
+GIT_HASH=$(git rev-parse --short HEAD)
+GIT_BRANCH_OR_TAG=$(git name-rev --name-only HEAD | awk -F/ '{print $NF}')
-export VERSION="$GIT_HASH-$GIT_BRANCH_OR_TAG"
-export LATEST_VERSION="$GIT_BRANCH_OR_TAG"
+VERSION="$GIT_HASH-$GIT_BRANCH_OR_TAG"
-export FILENAME="obs-websocket-$VERSION.pkg"
+FILENAME_UNSIGNED="obs-websocket-$VERSION-Unsigned.pkg"
+FILENAME="obs-websocket-$VERSION.pkg"
echo "[obs-websocket] Modifying obs-websocket.so"
install_name_tool \
-change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets \
- @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets \
+ @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets \
-change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui \
- @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui \
+ @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui \
-change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore \
- @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore \
+ @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore \
./build/obs-websocket.so
# Check if replacement worked
echo "[obs-websocket] Dependencies for obs-websocket"
otool -L ./build/obs-websocket.so
+if [[ "$RELEASE_MODE" == "True" ]]; then
+ echo "[obs-websocket] Signing plugin binary: obs-websocket.so"
+ codesign --sign "$CODE_SIGNING_IDENTITY" ./build/obs-websocket.so
+else
+ echo "[obs-websocket] Skipped plugin codesigning"
+fi
+
echo "[obs-websocket] Actual package build"
packagesbuild ./CI/macos/obs-websocket.pkgproj
echo "[obs-websocket] Renaming obs-websocket.pkg to $FILENAME"
-mv ./release/obs-websocket.pkg ./release/$FILENAME
+mv ./release/obs-websocket.pkg ./release/$FILENAME_UNSIGNED
+
+if [[ "$RELEASE_MODE" == "True" ]]; then
+ echo "[obs-websocket] Signing installer: $FILENAME"
+ productsign \
+ --sign "$INSTALLER_SIGNING_IDENTITY" \
+ ./release/$FILENAME_UNSIGNED \
+ ./release/$FILENAME
+ rm ./release/$FILENAME_UNSIGNED
+
+ echo "[obs-websocket] Submitting installer $FILENAME for notarization"
+ zip -r ./release/$FILENAME.zip ./release/$FILENAME
+ UPLOAD_RESULT=$(xcrun altool \
+ --notarize-app \
+ --primary-bundle-id "fr.palakis.obs-websocket" \
+ --username "$AC_USERNAME" \
+ --password "$AC_PASSWORD" \
+ --asc-provider "$AC_PROVIDER_SHORTNAME" \
+ --file "./release/$FILENAME.zip")
+ rm ./release/$FILENAME.zip
+
+ REQUEST_UUID=$(echo $UPLOAD_RESULT | awk -F ' = ' '/RequestUUID/ {print $2}')
+ echo "Request UUID: $REQUEST_UUID"
+
+ echo "[obs-websocket] Wait for notarization result"
+ # Pieces of code borrowed from rednoah/notarized-app
+ while sleep 30 && date; do
+ CHECK_RESULT=$(xcrun altool \
+ --notarization-info "$REQUEST_UUID" \
+ --username "$AC_USERNAME" \
+ --password "$AC_PASSWORD" \
+ --asc-provider "$AC_PROVIDER_SHORTNAME")
+ echo $CHECK_RESULT
+
+ if ! grep -q "Status: in progress" <<< "$CHECK_RESULT"; then
+ echo "[obs-websocket] Staple ticket to installer: $FILENAME"
+ xcrun stapler staple ./release/$FILENAME
+ break
+ fi
+ done
+else
+ echo "[obs-websocket] Skipped installer codesigning and notarization"
+fi
\ No newline at end of file
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 11c09166..0f3f10b9 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -1,3 +1,14 @@
+variables:
+ isReleaseMode: ${{ startsWith(variables['Build.SourceBranch'], 'refs/tags/') }}
+
+trigger:
+ branches:
+ include:
+ - master
+ tags:
+ include:
+ - '*'
+
jobs:
- job: 'GenerateDocs'
condition: |
@@ -149,8 +160,22 @@ jobs:
- script: ./CI/build-macos.sh
displayName: 'Build obs-websocket'
+ - task: InstallAppleCertificate@1
+ displayName: 'Install release signing certificates'
+ condition: eq(variables['isReleaseMode'], true)
+ inputs:
+ certSecureFile: 'Certificates.p12'
+ certPwd: $(secrets.macOS.certificatesImportPassword)
+
- script: ./CI/package-macos.sh
displayName: 'Package obs-websocket'
+ env:
+ RELEASE_MODE: $(isReleaseMode)
+ CODE_SIGNING_IDENTITY: $(secrets.macOS.codeSigningIdentity)
+ INSTALLER_SIGNING_IDENTITY: $(secrets.macOS.installerSigningIdentity)
+ AC_USERNAME: $(secrets.macOS.notarization.username)
+ AC_PASSWORD: $(secrets.macOS.notarization.password)
+ AC_PROVIDER_SHORTNAME: $(secrets.macOS.notarization.providerShortName)
- task: PublishBuildArtifacts@1
inputs: