github.yml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. name: VCMI
  2. on:
  3. push:
  4. branches:
  5. - features/*
  6. - beta
  7. - master
  8. pull_request:
  9. schedule:
  10. - cron: '0 2 * * *'
  11. workflow_dispatch:
  12. env:
  13. # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
  14. BUILD_TYPE: Release
  15. jobs:
  16. check_last_build:
  17. if: github.event.schedule != ''
  18. runs-on: ubuntu-latest
  19. outputs:
  20. skip_build: ${{ steps.check_if_built.outputs.skip_build }}
  21. defaults:
  22. run:
  23. shell: bash
  24. steps:
  25. - name: Get repo name
  26. id: get_repo_name
  27. run: echo "::set-output name=value::${GITHUB_REPOSITORY#*/}"
  28. - name: Get last successful build for ${{ github.sha }}
  29. uses: octokit/[email protected]
  30. id: get_last_scheduled_run
  31. with:
  32. route: GET /repos/{owner}/{repo}/actions/runs
  33. owner: ${{ github.repository_owner }}
  34. repo: ${{ steps.get_repo_name.outputs.value }}
  35. status: success
  36. per_page: 1
  37. head_sha: ${{ github.sha }}
  38. env:
  39. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  40. - name: Check if successful build of the current commit exists
  41. id: check_if_built
  42. run: |
  43. if [ ${{ fromJson(steps.get_last_scheduled_run.outputs.data).total_count }} -gt 0 ]; then
  44. echo '::set-output name=skip_build::1'
  45. else
  46. echo '::set-output name=skip_build::0'
  47. fi
  48. - name: Cancel current run
  49. if: steps.check_if_built.outputs.skip_build == 1
  50. uses: octokit/[email protected]
  51. with:
  52. route: POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel
  53. owner: ${{ github.repository_owner }}
  54. repo: ${{ steps.get_repo_name.outputs.value }}
  55. run_id: ${{ github.run_id }}
  56. env:
  57. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  58. - name: Wait for the run to be cancelled
  59. if: steps.check_if_built.outputs.skip_build == 1
  60. run: sleep 60
  61. build:
  62. needs: check_last_build
  63. if: always() && needs.check_last_build.skip_build != 1
  64. strategy:
  65. matrix:
  66. include:
  67. - platform: linux-qt6
  68. os: ubuntu-22.04
  69. test: 0
  70. preset: linux-clang-test
  71. - platform: linux
  72. os: ubuntu-20.04
  73. test: 0
  74. preset: linux-gcc-test
  75. - platform: linux
  76. os: ubuntu-20.04
  77. test: 0
  78. preset: linux-gcc-debug
  79. - platform: mac-intel
  80. os: macos-12
  81. test: 0
  82. pack: 1
  83. extension: dmg
  84. preset: macos-conan-ninja-release
  85. conan_profile: macos-intel
  86. conan_options: --options with_apple_system_libs=True
  87. artifact_platform: intel
  88. - platform: mac-arm
  89. os: macos-12
  90. test: 0
  91. pack: 1
  92. extension: dmg
  93. preset: macos-arm-conan-ninja-release
  94. conan_profile: macos-arm
  95. conan_options: --options with_apple_system_libs=True
  96. artifact_platform: arm
  97. - platform: ios
  98. os: macos-12
  99. test: 0
  100. pack: 1
  101. extension: ipa
  102. preset: ios-release-conan
  103. conan_profile: ios-arm64
  104. conan_options: --options with_apple_system_libs=True
  105. - platform: msvc
  106. os: windows-latest
  107. test: 0
  108. pack: 1
  109. extension: exe
  110. preset: windows-msvc-release
  111. - platform: mingw-ubuntu
  112. os: ubuntu-22.04
  113. test: 0
  114. pack: 1
  115. extension: exe
  116. cpack_args: -D CPACK_NSIS_EXECUTABLE=`which makensis`
  117. cmake_args: -G Ninja
  118. preset: windows-mingw-conan-linux
  119. conan_profile: mingw64-linux.jinja
  120. - platform: android-32
  121. os: ubuntu-22.04
  122. extension: apk
  123. preset: android-conan-ninja-release
  124. conan_profile: android-32
  125. conan_options: --conf tools.android:ndk_path=$ANDROID_NDK_ROOT
  126. artifact_platform: armeabi-v7a
  127. - platform: android-64
  128. os: ubuntu-22.04
  129. extension: apk
  130. preset: android-conan-ninja-release
  131. conan_profile: android-64
  132. conan_options: --conf tools.android:ndk_path=$ANDROID_NDK_ROOT
  133. artifact_platform: arm64-v8a
  134. runs-on: ${{ matrix.os }}
  135. defaults:
  136. run:
  137. shell: bash
  138. steps:
  139. - uses: actions/checkout@v3
  140. with:
  141. submodules: recursive
  142. - name: Validate JSON
  143. run: |
  144. pip install jstyleson
  145. python3 .github/validate_json.py
  146. - name: Dependencies
  147. run: source '${{github.workspace}}/CI/${{matrix.platform}}/before_install.sh'
  148. env:
  149. VCMI_BUILD_PLATFORM: x64
  150. - uses: actions/setup-python@v4
  151. if: "${{ matrix.conan_profile != '' }}"
  152. with:
  153. python-version: '3.10'
  154. - name: Conan setup
  155. if: "${{ matrix.conan_profile != '' }}"
  156. run: |
  157. pip3 install 'conan<2.0'
  158. conan profile new default --detect
  159. conan install . \
  160. --install-folder=conan-generated \
  161. --no-imports \
  162. --build=never \
  163. --profile:build=default \
  164. --profile:host=CI/conan/${{ matrix.conan_profile }} \
  165. ${{ matrix.conan_options }}
  166. env:
  167. GENERATE_ONLY_BUILT_CONFIG: 1
  168. - name: Git branch name
  169. id: git-branch-name
  170. uses: EthanSK/git-branch-name-action@v1
  171. - name: Build Number
  172. run: |
  173. source '${{github.workspace}}/CI/get_package_name.sh'
  174. if [ '${{ matrix.artifact_platform }}' ]; then
  175. VCMI_PACKAGE_FILE_NAME+="-${{ matrix.artifact_platform }}"
  176. fi
  177. echo VCMI_PACKAGE_FILE_NAME="$VCMI_PACKAGE_FILE_NAME" >> $GITHUB_ENV
  178. echo VCMI_PACKAGE_NAME_SUFFIX="$VCMI_PACKAGE_NAME_SUFFIX" >> $GITHUB_ENV
  179. echo VCMI_PACKAGE_GITVERSION="$VCMI_PACKAGE_GITVERSION" >> $GITHUB_ENV
  180. env:
  181. PULL_REQUEST: ${{ github.event.pull_request.number }}
  182. - name: CMake Preset
  183. run: |
  184. cmake --preset ${{ matrix.preset }}
  185. - name: Build Preset
  186. run: |
  187. cmake --build --preset ${{matrix.preset}}
  188. - name: Test
  189. if: ${{ matrix.test == 1 }}
  190. run: |
  191. ctest --preset ${{matrix.preset}}
  192. - name: Pack
  193. id: cpack
  194. if: ${{ matrix.pack == 1 }}
  195. run: |
  196. cd '${{github.workspace}}/out/build/${{matrix.preset}}'
  197. CPACK_PATH=`which -a cpack | grep -m1 -v -i chocolatey`
  198. "$CPACK_PATH" -C ${{env.BUILD_TYPE}} ${{ matrix.cpack_args }}
  199. test -f '${{github.workspace}}/CI/${{matrix.platform}}/post_pack.sh' \
  200. && '${{github.workspace}}/CI/${{matrix.platform}}/post_pack.sh' '${{github.workspace}}' "$(ls '${{ env.VCMI_PACKAGE_FILE_NAME }}'.*)"
  201. rm -rf _CPack_Packages
  202. - name: Create android package
  203. if: ${{ startsWith(matrix.platform, 'android') }}
  204. run: |
  205. cd android
  206. ./gradlew assembleDaily --info
  207. echo ANDROID_APK_PATH="$(ls ${{ github.workspace }}/android/vcmi-app/build/outputs/apk/daily/*.${{ matrix.extension }})" >> $GITHUB_ENV
  208. - name: Additional logs
  209. if: ${{ failure() && steps.cpack.outcome == 'failure' && matrix.platform == 'msvc' }}
  210. run: |
  211. cat '${{github.workspace}}/out/build/${{matrix.preset}}/_CPack_Packages/win32/NSIS/project.nsi'
  212. cat '${{github.workspace}}/out/build/${{matrix.preset}}/_CPack_Packages/win32/NSIS/NSISOutput.log'
  213. - name: Artifacts
  214. if: ${{ matrix.pack == 1 }}
  215. uses: actions/upload-artifact@v3
  216. with:
  217. name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }}
  218. path: |
  219. ${{github.workspace}}/out/build/${{matrix.preset}}/${{ env.VCMI_PACKAGE_FILE_NAME }}.${{ matrix.extension }}
  220. - name: Android artifacts
  221. if: ${{ startsWith(matrix.platform, 'android') }}
  222. uses: actions/upload-artifact@v3
  223. with:
  224. name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }}
  225. path: |
  226. ${{ env.ANDROID_APK_PATH }}
  227. - name: Android JNI ${{matrix.platform}}
  228. if: ${{ startsWith(matrix.platform, 'android') && github.ref == 'refs/heads/master' }}
  229. uses: actions/upload-artifact@v3
  230. with:
  231. name: Android JNI ${{matrix.platform}}
  232. path: |
  233. ${{ github.workspace }}/android/vcmi-app/src/main/jniLibs
  234. - name: Upload build
  235. if: ${{ (matrix.pack == 1 || startsWith(matrix.platform, 'android')) && (github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/beta' || github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/features/')) && matrix.platform != 'msvc' }}
  236. continue-on-error: true
  237. run: |
  238. if cd '${{github.workspace}}/android/vcmi-app/build/outputs/apk/daily' ; then
  239. mv '${{ env.ANDROID_APK_PATH }}' "$VCMI_PACKAGE_FILE_NAME.${{ matrix.extension }}"
  240. else
  241. cd '${{github.workspace}}/out/build/${{matrix.preset}}'
  242. fi
  243. source '${{github.workspace}}/CI/upload_package.sh'
  244. env:
  245. DEPLOY_RSA: ${{ secrets.DEPLOY_RSA }}
  246. PACKAGE_EXTENSION: ${{ matrix.extension }}
  247. - uses: act10ns/slack@v1
  248. with:
  249. status: ${{ job.status }}
  250. channel: '#notifications'
  251. env:
  252. SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
  253. if: always()
  254. # copy-pasted mostly
  255. bundle_release:
  256. needs: build
  257. if: always() && github.ref == 'refs/heads/master'
  258. strategy:
  259. matrix:
  260. include:
  261. - platform: android-32
  262. os: ubuntu-22.04
  263. extension: aab
  264. preset: android-conan-ninja-release
  265. conan_profile: android-32
  266. conan_options: --conf tools.android:ndk_path=$ANDROID_NDK_ROOT
  267. artifact_platform: aab
  268. runs-on: ${{ matrix.os }}
  269. defaults:
  270. run:
  271. shell: bash
  272. steps:
  273. - uses: actions/checkout@v3
  274. with:
  275. submodules: recursive
  276. - name: Dependencies
  277. run: source '${{github.workspace}}/CI/${{matrix.platform}}/before_install.sh'
  278. env:
  279. VCMI_BUILD_PLATFORM: x64
  280. - uses: actions/setup-python@v4
  281. if: "${{ matrix.conan_profile != '' }}"
  282. with:
  283. python-version: '3.10'
  284. - name: Conan setup
  285. if: "${{ matrix.conan_profile != '' }}"
  286. run: |
  287. pip3 install 'conan<2.0'
  288. conan profile new default --detect
  289. conan install . \
  290. --install-folder=conan-generated \
  291. --no-imports \
  292. --build=never \
  293. --profile:build=default \
  294. --profile:host=CI/conan/${{ matrix.conan_profile }} \
  295. ${{ matrix.conan_options }}
  296. env:
  297. GENERATE_ONLY_BUILT_CONFIG: 1
  298. - name: Git branch name
  299. id: git-branch-name
  300. uses: EthanSK/git-branch-name-action@v1
  301. - name: Build Number
  302. run: |
  303. source '${{github.workspace}}/CI/get_package_name.sh'
  304. if [ '${{ matrix.artifact_platform }}' ]; then
  305. VCMI_PACKAGE_FILE_NAME+="-${{ matrix.artifact_platform }}"
  306. fi
  307. echo VCMI_PACKAGE_FILE_NAME="$VCMI_PACKAGE_FILE_NAME" >> $GITHUB_ENV
  308. echo VCMI_PACKAGE_NAME_SUFFIX="$VCMI_PACKAGE_NAME_SUFFIX" >> $GITHUB_ENV
  309. echo VCMI_PACKAGE_GITVERSION="$VCMI_PACKAGE_GITVERSION" >> $GITHUB_ENV
  310. env:
  311. PULL_REQUEST: ${{ github.event.pull_request.number }}
  312. - name: CMake Preset
  313. run: |
  314. cmake --preset ${{ matrix.preset }}
  315. - name: Build Preset
  316. run: |
  317. cmake --build --preset ${{matrix.preset}}
  318. - name: Download libs x64
  319. uses: actions/download-artifact@v3
  320. with:
  321. name: Android JNI android-64
  322. path: ${{ github.workspace }}/android/vcmi-app/src/main/jniLibs/
  323. - name: Create android package
  324. run: |
  325. cd android
  326. ./gradlew bundleRelease --info
  327. echo ANDROID_APK_PATH="$(ls ${{ github.workspace }}/android/vcmi-app/build/outputs/bundle/release/*.aab)" >> $GITHUB_ENV
  328. env:
  329. ANDROID_STORE_PASSWORD: ${{ secrets.ANDROID_STORE_PASSWORD }}
  330. ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
  331. - name: Android artifacts
  332. uses: actions/upload-artifact@v3
  333. with:
  334. name: ${{ env.VCMI_PACKAGE_FILE_NAME }}
  335. path: |
  336. ${{ env.ANDROID_APK_PATH }}
  337. - uses: act10ns/slack@v1
  338. with:
  339. status: ${{ job.status }}
  340. channel: '#notifications'
  341. env:
  342. SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
  343. if: always()