publish.yaml 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. name: Publish
  2. run-name: Publish Repository Actions 🛫
  3. on:
  4. release:
  5. types:
  6. - published
  7. branches:
  8. - master
  9. - 'release/**'
  10. permissions:
  11. contents: read
  12. concurrency:
  13. group: '${{ github.workflow }} @ ${{ github.head_ref || github.ref }}'
  14. cancel-in-progress: true
  15. jobs:
  16. check-tag:
  17. name: Check Release Tag
  18. if: github.repository_owner == 'obsproject'
  19. runs-on: ubuntu-24.04
  20. outputs:
  21. validTag: ${{ steps.check.outputs.validTag }}
  22. flatpakMatrix: ${{ steps.check.outputs.flatpakMatrix }}
  23. updateChannel: ${{ steps.check.outputs.updateChannel }}
  24. steps:
  25. - uses: actions/checkout@v4
  26. with:
  27. submodules: recursive
  28. fetch-depth: 0
  29. set-safe-directory: ${{ env.GITHUB_WORKSPACE }}
  30. - name: Check Release Tag ☑️
  31. id: check
  32. env:
  33. GH_TOKEN: ${{ github.token }}
  34. run: |
  35. : Check Release Tag ☑️
  36. if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
  37. shopt -s extglob
  38. case "${GITHUB_REF_NAME}" in
  39. +([0-9]).+([0-9]).+([0-9]) )
  40. lastPreRelease="$(gh release list --exclude-drafts --limit 10 --json "publishedAt,tagName,isPrerelease" \
  41. --jq '[.[] | select(.isPrerelease == true)] | first | .tagName')"
  42. currentRelease="${GITHUB_REF_NAME}"
  43. isPreReleaseAhead=false
  44. printf '%s\n%s\n' "${currentRelease}" "${lastPreRelease}" | sort --version-sort --reverse --check=quiet &&
  45. isPreReleaseAhead=false || isPreReleaseAhead=true
  46. # Edge case: Sort considers the non-suffixed version older than a suffixed one
  47. if ${isPreReleaseAhead} && [[ "${currentRelease}" == "${lastPreRelease//-*}" ]]; then
  48. isPreReleaseAhead=false
  49. fi
  50. echo 'validTag=true' >> $GITHUB_OUTPUT
  51. if ! ${isPreReleaseAhead}; then
  52. echo 'flatpakMatrix=["beta", "stable"]' >> $GITHUB_OUTPUT
  53. else
  54. echo 'flatpakMatrix=["stable"]' >> $GITHUB_OUTPUT
  55. fi
  56. echo 'updateChannel=stable' >> $GITHUB_OUTPUT
  57. ;;
  58. +([0-9]).+([0-9]).+([0-9])-@(beta|rc)*([0-9]) )
  59. echo 'validTag=true' >> $GITHUB_OUTPUT
  60. echo 'flatpakMatrix=["beta"]' >> $GITHUB_OUTPUT
  61. echo 'updateChannel=beta' >> $GITHUB_OUTPUT
  62. ;;
  63. *) echo 'validTag=false' >> $GITHUB_OUTPUT ;;
  64. esac
  65. flatpak-publish:
  66. name: Flathub 📦
  67. needs: check-tag
  68. if: github.repository_owner == 'obsproject' && fromJSON(needs.check-tag.outputs.validTag)
  69. runs-on: ubuntu-24.04
  70. defaults:
  71. run:
  72. shell: bash
  73. env:
  74. FLATPAK_BUILD_SHARE_PATH: flatpak_app/files/share
  75. TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }}
  76. TWITCH_HASH: ${{ secrets.TWITCH_HASH }}
  77. RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }}
  78. RESTREAM_HASH: ${{ secrets.RESTREAM_HASH }}
  79. YOUTUBE_CLIENTID: ${{ secrets.YOUTUBE_CLIENTID }}
  80. YOUTUBE_CLIENTID_HASH: ${{ secrets.YOUTUBE_CLIENTID_HASH }}
  81. YOUTUBE_SECRET: ${{ secrets.YOUTUBE_SECRET }}
  82. YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }}
  83. container:
  84. image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8
  85. options: --privileged
  86. strategy:
  87. matrix:
  88. branch: ${{ fromJSON(needs.check-tag.outputs.flatpakMatrix) }}
  89. steps:
  90. - uses: actions/checkout@v4
  91. with:
  92. submodules: recursive
  93. fetch-depth: 0
  94. set-safe-directory: ${{ env.GITHUB_WORKSPACE }}
  95. - name: Set Up Environment 🔧
  96. id: setup
  97. env:
  98. GH_TOKEN: ${{ github.token }}
  99. run: |
  100. : Set Up Environment 🔧
  101. if [[ "${RUNNER_DEBUG}" ]]; then set -x; fi
  102. git config --global --add safe.directory "${GITHUB_WORKSPACE}"
  103. cache_key='flatpak-builder-${{ hashFiles('build-aux/**/*.json') }}'
  104. cache_ref='master'
  105. read -r id key size unit created accessed <<< \
  106. "$(gh cache list --ref "refs/heads/${cache_ref}" --key "${cache_key}-x86_64" | head -1)"
  107. if [[ "${key}" ]]; then
  108. echo "cacheHit=true" >> $GITHUB_OUTPUT
  109. else
  110. echo "cacheHit=false" >> $GITHUB_OUTPUT
  111. fi
  112. echo "cacheKey=${cache_key}" >> $GITHUB_OUTPUT
  113. echo "commitHash=${GITHUB_SHA:0:9}" >> $GITHUB_OUTPUT
  114. - name: Validate Flatpak manifest
  115. uses: ./.github/actions/flatpak-builder-lint
  116. with:
  117. artifact: manifest
  118. path: build-aux/com.obsproject.Studio.json
  119. - name: Build Flatpak Manifest
  120. uses: flatpak/flatpak-github-actions/flatpak-builder@b8a638469ea7ec62844d7b6e487b697e6f249576
  121. with:
  122. build-bundle: false
  123. manifest-path: ${{ github.workspace }}/build-aux/com.obsproject.Studio.json
  124. cache: ${{ fromJSON(steps.setup.outputs.cacheHit) }}
  125. cache-key: ${{ steps.setup.outputs.cacheKey }}
  126. mirror-screenshots-url: https://dl.flathub.org/media
  127. branch: ${{ matrix.branch }}
  128. - name: Validate AppStream
  129. uses: ./.github/actions/flatpak-builder-lint
  130. with:
  131. artifact: appstream
  132. path: ${{ env.FLATPAK_BUILD_SHARE_PATH }}/metainfo/com.obsproject.Studio.metainfo.xml
  133. - name: Verify Icon and Metadata in app-info
  134. working-directory: ${{ env.FLATPAK_BUILD_SHARE_PATH }}
  135. run: |
  136. : Verify Icon and Metadata in app-info
  137. test -f app-info/icons/flatpak/128x128/com.obsproject.Studio.png || { echo "::error::Missing 128x128 icon in app-info"; exit 1; }
  138. test -f app-info/xmls/com.obsproject.Studio.xml.gz || { echo "::error::Missing com.obsproject.Studio.xml.gz in app-info"; exit 1; }
  139. - name: Validate build directory
  140. uses: ./.github/actions/flatpak-builder-lint
  141. with:
  142. artifact: builddir
  143. path: flatpak_app
  144. - name: Validate repository
  145. uses: ./.github/actions/flatpak-builder-lint
  146. with:
  147. artifact: repo
  148. path: repo
  149. - name: Publish to Flathub Beta
  150. uses: flatpak/flatpak-github-actions/flat-manager@b8a638469ea7ec62844d7b6e487b697e6f249576
  151. if: ${{ matrix.branch == 'beta' }}
  152. with:
  153. flat-manager-url: https://hub.flathub.org/
  154. repository: beta
  155. token: ${{ secrets.FLATHUB_BETA_TOKEN }}
  156. build-log-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
  157. - name: Publish to Flathub
  158. uses: flatpak/flatpak-github-actions/flat-manager@b8a638469ea7ec62844d7b6e487b697e6f249576
  159. if: ${{ matrix.branch == 'stable' }}
  160. with:
  161. flat-manager-url: https://hub.flathub.org/
  162. repository: stable
  163. token: ${{ secrets.FLATHUB_TOKEN }}
  164. build-log-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
  165. steam-upload:
  166. name: Upload Steam Builds 🚂
  167. needs: check-tag
  168. if: github.repository_owner == 'obsproject' && fromJSON(needs.check-tag.outputs.validTag)
  169. runs-on: macos-15
  170. steps:
  171. - uses: actions/checkout@v4
  172. - uses: ./.github/actions/steam-upload
  173. with:
  174. steamSecret: ${{ secrets.STEAM_SHARED_SECRET }}
  175. steamUser: ${{ secrets.STEAM_USER }}
  176. steamPassword: ${{ secrets.STEAM_PASSWORD }}
  177. workflowSecret: ${{ github.token }}
  178. tagName: ${{ github.ref_name }}
  179. preview: false
  180. windows-patches:
  181. name: Create Windows Patches 🩹
  182. needs: check-tag
  183. if: github.repository_owner == 'obsproject' && fromJSON(needs.check-tag.outputs.validTag)
  184. runs-on: windows-2022
  185. steps:
  186. - uses: actions/checkout@v4
  187. - uses: ./.github/actions/windows-patches
  188. with:
  189. tagName: ${{ github.ref_name }}
  190. workflowSecret: ${{ github.token }}
  191. channel: ${{ needs.check-tag.outputs.updateChannel }}
  192. gcsAccessKeyId: ${{ secrets.GCS_ACCESS_KEY_ID }}
  193. gcsAccessKeySecret: ${{ secrets.GCS_ACCESS_KEY_SECRET }}