build-project.yaml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. name: Build Project
  2. on:
  3. workflow_call:
  4. jobs:
  5. check-event:
  6. name: Event Data 🔎
  7. runs-on: ubuntu-24.04
  8. defaults:
  9. run:
  10. shell: bash
  11. outputs:
  12. package: ${{ steps.setup.outputs.package }}
  13. codesign: ${{ steps.setup.outputs.codesign }}
  14. notarize: ${{ steps.setup.outputs.notarize }}
  15. config: ${{ steps.setup.outputs.config }}
  16. commitHash: ${{ steps.setup.outputs.commitHash }}
  17. steps:
  18. - uses: actions/checkout@v4
  19. with:
  20. fetch-depth: 0
  21. - name: Check Event Data ☑️
  22. id: setup
  23. env:
  24. GH_TOKEN: ${{ github.token }}
  25. run: |
  26. : Check Event Data ☑️
  27. if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
  28. case "${GITHUB_EVENT_NAME}" in
  29. pull_request)
  30. config_data=('codesign:false' 'notarize:false' 'package:false' 'config:RelWithDebInfo')
  31. if gh pr view ${{ github.event.number }} --json labels \
  32. | jq -e -r '.labels[] | select(.name == "Seeking Testers")' > /dev/null; then
  33. config_data[0]='codesign:true'
  34. config_data[2]='package:true'
  35. fi
  36. ;;
  37. push)
  38. config_data=('codesign:true' 'notarize:false' 'package:true' 'config:RelWithDebInfo')
  39. if [[ ${GITHUB_REF_NAME} =~ [0-9]+.[0-9]+.[0-9]+(-(rc|beta).+)? ]]; then
  40. config_data[1]='notarize:true'
  41. config_data[3]='config:Release'
  42. fi
  43. ;;
  44. workflow_dispatch)
  45. config_data=('codesign:true' 'notarize:false' 'package:false' 'config:RelWithDebInfo')
  46. ;;
  47. schedule)
  48. config_data=('codesign:true' 'notarize:false' 'package:true' 'config:RelWithDebInfo')
  49. ;;
  50. *) ;;
  51. esac
  52. for config in "${config_data[@]}"; do
  53. IFS=':' read -r key value <<< "${config}"
  54. echo "${key}=${value}" >> $GITHUB_OUTPUT
  55. done
  56. echo "commitHash=${GITHUB_SHA:0:9}" >> $GITHUB_OUTPUT
  57. macos-build:
  58. name: macOS 🍏
  59. runs-on: macos-15
  60. needs: check-event
  61. strategy:
  62. fail-fast: false
  63. matrix:
  64. target: [arm64, x86_64]
  65. defaults:
  66. run:
  67. shell: zsh --no-rcs --errexit --pipefail {0}
  68. steps:
  69. - uses: actions/checkout@v4
  70. with:
  71. submodules: recursive
  72. fetch-depth: 0
  73. - name: Set Up Environment 🔧
  74. id: setup
  75. run: |
  76. : Set Up Environment 🔧
  77. if (( ${+RUNNER_DEBUG} )) setopt XTRACE
  78. print '::group::Enable Xcode 16.4'
  79. sudo xcode-select --switch /Applications/Xcode_16.4.app/Contents/Developer
  80. print '::endgroup::'
  81. print '::group::Clean Homebrew Environment'
  82. local -a unwanted_formulas=()
  83. local -a remove_formulas=()
  84. for formula (${unwanted_formulas}) {
  85. if [[ -d ${HOMEBREW_PREFIX}/Cellar/${formula} ]] remove_formulas+=(${formula})
  86. }
  87. if (( #remove_formulas )) brew uninstall --ignore-dependencies ${remove_formulas}
  88. print '::endgroup::'
  89. local -A arch_names=(x86_64 intel arm64 apple)
  90. print "cpuName=${arch_names[${{ matrix.target }}]}" >> $GITHUB_OUTPUT
  91. - uses: actions/cache/restore@v4
  92. id: ccache-cache
  93. with:
  94. path: ${{ github.workspace }}/.ccache
  95. key: ${{ runner.os }}-ccache-${{ matrix.target }}-${{ needs.check-event.outputs.config }}
  96. restore-keys: |
  97. ${{ runner.os }}-ccache-${{ matrix.target }}-
  98. - name: Set Up Code Signing 🔑
  99. uses: ./.github/actions/setup-macos-codesigning
  100. if: fromJSON(needs.check-event.outputs.codesign)
  101. id: codesign
  102. with:
  103. codesignIdentity: ${{ secrets.MACOS_SIGNING_IDENTITY }}
  104. codesignCertificate: ${{ secrets.MACOS_SIGNING_CERT }}
  105. certificatePassword: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }}
  106. keychainPassword: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }}
  107. provisioningProfile: ${{ secrets.MACOS_SIGNING_PROVISIONING_PROFILE }}
  108. notarizationUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
  109. notarizationPassword: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}
  110. - name: Build OBS Studio 🧱
  111. uses: ./.github/actions/build-obs
  112. env:
  113. TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
  114. TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
  115. RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
  116. RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
  117. YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
  118. YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
  119. YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
  120. YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
  121. with:
  122. target: ${{ matrix.target }}
  123. config: ${{ needs.check-event.outputs.config }}
  124. codesign: ${{ fromJSON(needs.check-event.outputs.codesign) }}
  125. codesignIdent: ${{ steps.codesign.outputs.codesignIdent }}
  126. codesignTeam: ${{ steps.codesign.outputs.codesignTeam }}
  127. provisioningProfileUUID: ${{ steps.codesign.outputs.provisioningProfileUUID }}
  128. - name: Package OBS Studio 📀
  129. uses: ./.github/actions/package-obs
  130. with:
  131. target: ${{ matrix.target }}
  132. config: ${{ needs.check-event.outputs.config }}
  133. package: ${{ fromJSON(needs.check-event.outputs.package) }}
  134. codesign: ${{ fromJSON(needs.check-event.outputs.codesign) && fromJSON(steps.codesign.outputs.haveCodesignIdent) }}
  135. codesignIdent: ${{ steps.codesign.outputs.codesignIdent }}
  136. notarize: ${{ fromJSON(needs.check-event.outputs.notarize) && fromJSON(steps.codesign.outputs.haveNotarizationUser) }}
  137. codesignUser: ${{ secrets.MACOS_NOTARIZATION_USERNAME }}
  138. codesignPass: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }}
  139. - name: Upload Artifacts 📡
  140. uses: actions/upload-artifact@v4
  141. with:
  142. name: obs-studio-macos-${{ matrix.target }}-${{ needs.check-event.outputs.commitHash }}
  143. path: ${{ github.workspace }}/build_macos/obs-studio-*-macos-${{ steps.setup.outputs.cpuName }}.*
  144. - name: Upload Debug Symbol Artifacts 🪲
  145. uses: actions/upload-artifact@v4
  146. if: ${{ needs.check-event.outputs.config == 'Release' }}
  147. with:
  148. name: obs-studio-macos-${{ matrix.target }}-${{ needs.check-event.outputs.commitHash }}-dSYMs
  149. path: ${{ github.workspace }}/build_macos/obs-studio-*-macos-${{ steps.setup.outputs.cpuName }}-dSYMs.tar.xz
  150. - uses: actions/cache/save@v4
  151. if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true'
  152. with:
  153. path: ${{ github.workspace }}/.ccache
  154. key: ${{ runner.os }}-ccache-${{ matrix.target }}-${{ needs.check-event.outputs.config }}
  155. ubuntu-build:
  156. name: Ubuntu 🐧
  157. strategy:
  158. matrix:
  159. os: [ubuntu-24.04]
  160. runs-on: ${{ matrix.os }}
  161. needs: check-event
  162. defaults:
  163. run:
  164. shell: bash
  165. steps:
  166. - uses: actions/checkout@v4
  167. with:
  168. submodules: recursive
  169. fetch-depth: 0
  170. - uses: actions/cache/restore@v4
  171. id: ccache-cache
  172. with:
  173. path: ${{ github.workspace }}/.ccache
  174. key: ${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
  175. restore-keys: |
  176. ${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-
  177. - name: Build OBS Studio 🧱
  178. uses: ./.github/actions/build-obs
  179. env:
  180. TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
  181. TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
  182. RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
  183. RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
  184. YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
  185. YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
  186. YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
  187. YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
  188. with:
  189. target: x86_64
  190. config: ${{ needs.check-event.outputs.config }}
  191. - name: Package OBS Studio 📀
  192. uses: ./.github/actions/package-obs
  193. with:
  194. target: x86_64
  195. config: ${{ needs.check-event.outputs.config }}
  196. package: ${{ fromJSON(needs.check-event.outputs.package) }}
  197. - name: Upload Source Tarball 🗜️
  198. uses: actions/upload-artifact@v4
  199. with:
  200. name: obs-studio-${{ matrix.os }}-sources-${{ needs.check-event.outputs.commitHash }}
  201. path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-sources.*
  202. - name: Upload Artifacts 📡
  203. uses: actions/upload-artifact@v4
  204. with:
  205. name: obs-studio-${{ matrix.os }}-x86_64-${{ needs.check-event.outputs.commitHash }}
  206. path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-x86_64-ubuntu-gnu.*
  207. - name: Upload Debug Symbol Artifacts 🪲
  208. uses: actions/upload-artifact@v4
  209. if: ${{ fromJSON(needs.check-event.outputs.package) }}
  210. with:
  211. name: obs-studio-${{ matrix.os }}-x86_64-${{ needs.check-event.outputs.commitHash }}-dbgsym
  212. path: ${{ github.workspace }}/build_ubuntu/obs-studio-*-x86_64-ubuntu-gnu-dbgsym.ddeb
  213. - uses: actions/cache/save@v4
  214. if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true'
  215. with:
  216. path: ${{ github.workspace }}/.ccache
  217. key: ${{ runner.os }}-${{ matrix.os }}-ccache-x86_64-${{ needs.check-event.outputs.config }}
  218. flatpak-build:
  219. name: Flatpak 📦
  220. runs-on: ubuntu-24.04
  221. needs: check-event
  222. defaults:
  223. run:
  224. shell: bash
  225. env:
  226. FLATPAK_BUILD_SHARE_PATH: flatpak_app/files/share
  227. container:
  228. image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8
  229. options: --privileged
  230. steps:
  231. - uses: actions/checkout@v4
  232. with:
  233. submodules: recursive
  234. fetch-depth: 0
  235. set-safe-directory: ${{ env.GITHUB_WORKSPACE }}
  236. - name: Set Up Environment 🔧
  237. id: setup
  238. env:
  239. GH_TOKEN: ${{ github.token }}
  240. run: |
  241. : Set Up Environment 🔧
  242. if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
  243. git config --global --add safe.directory "${GITHUB_WORKSPACE}"
  244. cache_key='flatpak-builder-${{ hashFiles('build-aux/**/*.json') }}'
  245. cache_ref='master'
  246. read -r id key size unit created accessed <<< \
  247. "$(gh cache list --ref "refs/heads/${cache_ref}" --key "${cache_key}-x86_64" | head -1)"
  248. if [[ "${key}" ]]; then
  249. echo "cacheHit=true" >> $GITHUB_OUTPUT
  250. else
  251. echo "cacheHit=false" >> $GITHUB_OUTPUT
  252. fi
  253. echo "cacheKey=${cache_key}" >> $GITHUB_OUTPUT
  254. - name: Validate Flatpak manifest
  255. uses: ./.github/actions/flatpak-builder-lint
  256. with:
  257. artifact: manifest
  258. path: build-aux/com.obsproject.Studio.json
  259. - name: Build Flatpak Manifest 🧾
  260. uses: flatpak/flatpak-github-actions/flatpak-builder@b8a638469ea7ec62844d7b6e487b697e6f249576
  261. with:
  262. build-bundle: ${{ fromJSON(needs.check-event.outputs.package) }}
  263. bundle: obs-studio-flatpak-${{ needs.check-event.outputs.commitHash }}.flatpak
  264. manifest-path: ${{ github.workspace }}/build-aux/com.obsproject.Studio.json
  265. cache: ${{ fromJSON(steps.setup.outputs.cacheHit) || (github.event_name == 'push' && github.ref_name == 'master')}}
  266. restore-cache: ${{ fromJSON(steps.setup.outputs.cacheHit) }}
  267. cache-key: ${{ steps.setup.outputs.cacheKey }}
  268. mirror-screenshots-url: https://dl.flathub.org/media
  269. - name: Validate AppStream
  270. uses: ./.github/actions/flatpak-builder-lint
  271. with:
  272. artifact: appstream
  273. path: ${{ env.FLATPAK_BUILD_SHARE_PATH }}/metainfo/com.obsproject.Studio.metainfo.xml
  274. - name: Verify Icon and Metadata in app-info
  275. working-directory: ${{ env.FLATPAK_BUILD_SHARE_PATH }}
  276. run: |
  277. : Verify Icon and Metadata in app-info
  278. test -f app-info/icons/flatpak/128x128/com.obsproject.Studio.png || { echo "::error::Missing 128x128 icon in app-info"; exit 1; }
  279. test -f app-info/xmls/com.obsproject.Studio.xml.gz || { echo "::error::Missing com.obsproject.Studio.xml.gz in app-info"; exit 1; }
  280. - name: Validate build directory
  281. uses: ./.github/actions/flatpak-builder-lint
  282. with:
  283. artifact: builddir
  284. path: flatpak_app
  285. - name: Validate repository
  286. uses: ./.github/actions/flatpak-builder-lint
  287. with:
  288. artifact: repo
  289. path: repo
  290. windows-build:
  291. name: Windows 🪟
  292. strategy:
  293. matrix:
  294. architecture: [x64, arm64]
  295. runs-on: windows-2022
  296. needs: check-event
  297. defaults:
  298. run:
  299. shell: pwsh
  300. steps:
  301. - uses: actions/checkout@v4
  302. with:
  303. submodules: recursive
  304. fetch-depth: 0
  305. - name: Build OBS Studio 🧱
  306. uses: ./.github/actions/build-obs
  307. env:
  308. TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
  309. TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
  310. RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
  311. RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
  312. YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
  313. YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
  314. YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
  315. YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
  316. GPU_PRIORITY_VAL: ${{ secrets.GPU_PRIORITY_VAL }}
  317. with:
  318. target: ${{ matrix.architecture }}
  319. config: ${{ needs.check-event.outputs.config }}
  320. - name: Package OBS Studio 📀
  321. uses: ./.github/actions/package-obs
  322. with:
  323. target: ${{ matrix.architecture }}
  324. config: ${{ needs.check-event.outputs.config }}
  325. package: ${{ fromJSON(needs.check-event.outputs.package) }}
  326. - name: Upload Artifacts 📡
  327. uses: actions/upload-artifact@v4
  328. with:
  329. name: obs-studio-windows-${{ matrix.architecture }}-${{ needs.check-event.outputs.commitHash }}
  330. path: ${{ github.workspace }}/build_${{ matrix.architecture }}/obs-studio-*-windows-${{ matrix.architecture }}.zip