build.yml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. name: Build
  2. on:
  3. push:
  4. paths-ignore:
  5. - 'docs/**'
  6. - 'mirai-console/docs/**'
  7. - '**/*.md'
  8. pull_request:
  9. paths-ignore:
  10. - 'docs/**'
  11. - 'mirai-console/docs/**'
  12. - '**/*.md'
  13. jobs:
  14. build-mirai-jvm:
  15. name: "JVM (${{ matrix.os }})"
  16. runs-on: ${{ matrix.os }}
  17. strategy:
  18. fail-fast: false
  19. matrix:
  20. os:
  21. # - windows-2022
  22. - windows-12
  23. env:
  24. gradleArgs: --scan "-Dmirai.target=jvm;android;!other" "-Pkotlin.compiler.execution.strategy=in-process" "-Dorg.gradle.jvmargs=-Xmx6000m" "-Dfile.encoding=UTF-8"
  25. isMac: ${{ startsWith(matrix.os, 'macos') }}
  26. isWindows: ${{ startsWith(matrix.os, 'windows') }}
  27. isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }}
  28. isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }}
  29. steps:
  30. - uses: actions/checkout@v2
  31. with:
  32. submodules: 'recursive'
  33. - uses: actions/setup-java@v2
  34. with:
  35. distribution: 'temurin'
  36. java-version: '17'
  37. - name: Setup Gradle
  38. uses: gradle/gradle-build-action@v2
  39. - if: ${{ env.isUnix == 'true' }}
  40. run: chmod -R 777 *
  41. - if: ${{ env.isWindows == 'true' }}
  42. name: Setup Memory Environment on Windows
  43. run: >
  44. wmic pagefileset where name="D:\\pagefile.sys" set InitialSize=1024,MaximumSize=18432 &
  45. net stop mongodb
  46. shell: cmd
  47. continue-on-error: true
  48. - name: Clean and download dependencies
  49. run: ./gradlew clean ${{ env.gradleArgs }}
  50. # Build modules separately to save memory
  51. - name: "Compile mirai-core-utils"
  52. run: ./gradlew :mirai-core-utils:compileKotlinJvm :mirai-core-utils:compileKotlinAndroid ${{ env.gradleArgs }}
  53. - name: "Test mirai-core-utils"
  54. run: ./gradlew :mirai-core-utils:jvmTest :mirai-core-utils:androidTest ${{ env.gradleArgs }}
  55. - name: "Check mirai-core-utils Android API Level"
  56. run: ./gradlew :mirai-core-utils:checkAndroidApiLevel ${{ env.gradleArgs }}
  57. - name: "Compile mirai-core-api"
  58. run: ./gradlew :mirai-core-api:compileKotlinJvm :mirai-core-api:compileKotlinAndroid ${{ env.gradleArgs }}
  59. - name: "Test mirai-core-api"
  60. run: ./gradlew :mirai-core-api:jvmTest :mirai-core-api:androidTest ${{ env.gradleArgs }}
  61. - name: "Check mirai-core-api JVM ABI"
  62. run: ./gradlew :mirai-core-api:apiCheckAll ${{ env.gradleArgs }}
  63. - name: "Check mirai-core-api Android API Level"
  64. run: ./gradlew :mirai-core-api:checkAndroidApiLevel ${{ env.gradleArgs }}
  65. - name: "Compile mirai-core"
  66. run: ./gradlew :mirai-core:compileKotlinJvm :mirai-core:compileKotlinAndroid ${{ env.gradleArgs }}
  67. - name: "Test mirai-core"
  68. run: ./gradlew :mirai-core:jvmTest :mirai-core:androidTest ${{ env.gradleArgs }}
  69. - name: "Check mirai-core Android API Level"
  70. run: ./gradlew :mirai-core:checkAndroidApiLevel ${{ env.gradleArgs }}
  71. - name: Upload mirai-core-utils
  72. uses: actions/upload-artifact@v3
  73. with:
  74. name: mirai-core-utils
  75. path: mirai-core-utils/build/libs
  76. - name: Upload mirai-core-api
  77. uses: actions/upload-artifact@v3
  78. with:
  79. name: mirai-core-api
  80. path: mirai-core-api/build/libs
  81. - name: Upload mirai-core
  82. uses: actions/upload-artifact@v3
  83. with:
  84. name: mirai-core
  85. path: mirai-core/build/libs
  86. - name: "Build mirai-core-all"
  87. run: ./gradlew :mirai-core-all:shadowJar ${{ env.gradleArgs }}
  88. - name: Upload mirai-core-all
  89. uses: actions/upload-artifact@v3
  90. with:
  91. name: mirai-core-all
  92. path: mirai-core-all/build/libs
  93. # Console and tools
  94. - name: "Compile mirai-console"
  95. run: ./gradlew :mirai-console:assemble ${{ env.gradleArgs }}
  96. - name: "Test mirai-console"
  97. run: ./gradlew :mirai-console:check ${{ env.gradleArgs }}
  98. - name: "Check JVM ABI"
  99. run: ./gradlew :mirai-console:apiCheckAll ${{ env.gradleArgs }}
  100. - name: "Compile mirai-console integration-test"
  101. run: ./gradlew :mirai-console:check ${{ env.gradleArgs }}
  102. - name: "Test mirai-console integration-test"
  103. run: ./gradlew :mirai-console.integration-test:check ${{ env.gradleArgs }}
  104. - name: "Compile mirai-console-terminal"
  105. run: ./gradlew :mirai-console-terminal:assemble ${{ env.gradleArgs }}
  106. - name: "Test mirai-console-terminal"
  107. run: ./gradlew :mirai-console-terminal:check ${{ env.gradleArgs }}
  108. - name: "Compile mirai-console-gradle"
  109. run: ./gradlew :mirai-console-gradle:assemble ${{ env.gradleArgs }}
  110. - name: "Test mirai-console-gradle"
  111. run: ./gradlew :mirai-console-gradle:check ${{ env.gradleArgs }}
  112. - name: "Compile mirai-console-intellij"
  113. run: ./gradlew :mirai-console-intellij:assemble ${{ env.gradleArgs }}
  114. - name: "Build mirai-console-intellij plugin"
  115. run: ./gradlew :mirai-console-intellij:buildPlugin ${{ env.gradleArgs }}
  116. - name: "Test mirai-console-intellij"
  117. run: ./gradlew :mirai-console-intellij:check ${{ env.gradleArgs }}
  118. - name: "Compile mirai-logging"
  119. run:
  120. ./gradlew
  121. :mirai-logging-log4j2:assemble
  122. :mirai-logging-slf4j:assemble
  123. :mirai-logging-slf4j-logback:assemble
  124. :mirai-logging-slf4j-simple:assemble
  125. ${{ env.gradleArgs }}
  126. - name: "Test mirai-logging"
  127. run:
  128. ./gradlew
  129. :mirai-logging-log4j2:check
  130. :mirai-logging-slf4j:check
  131. :mirai-logging-slf4j-logback:check
  132. :mirai-logging-slf4j-simple:check
  133. ${{ env.gradleArgs }}
  134. - name: Upload mirai-console
  135. uses: actions/upload-artifact@v3
  136. with:
  137. name: mirai-console
  138. path: mirai-console/backend/mirai-console/build/libs
  139. - name: Upload mirai-console-terminal
  140. uses: actions/upload-artifact@v3
  141. with:
  142. name: mirai-console-terminal
  143. path: mirai-console/frontend/mirai-console-terminal/build/libs
  144. - name: Upload mirai-console-compiler-annotations
  145. uses: actions/upload-artifact@v3
  146. with:
  147. name: mirai-console-compiler-annotations
  148. path: mirai-console/tools/mirai-console-compiler-annotations/build/libs
  149. - name: Upload mirai-console-compiler-common
  150. uses: actions/upload-artifact@v3
  151. with:
  152. name: mirai-console-compiler-common
  153. path: mirai-console/tools/mirai-console-compiler-common/build/libs
  154. - name: Upload mirai-console-intellij
  155. uses: actions/upload-artifact@v3
  156. with:
  157. name: mirai-console-intellij
  158. path: mirai-console/tools/intelli-plugin/build/distribution
  159. - name: Upload mirai-logging-log4j2
  160. uses: actions/upload-artifact@v3
  161. with:
  162. name: mirai-logging-log4j2
  163. path: logging/mirai-logging-log4j2/build/libs
  164. - name: Upload mirai-logging-slf4j
  165. uses: actions/upload-artifact@v3
  166. with:
  167. name: mirai-logging-slf4j
  168. path: logging/mirai-logging-slf4j/build/libs
  169. - name: Upload mirai-logging-slf4j-logback
  170. uses: actions/upload-artifact@v3
  171. with:
  172. name: mirai-logging-slf4j-logback
  173. path: logging/mirai-logging-slf4j-logback/build/libs
  174. - name: Upload mirai-logging-slf4j-simple
  175. uses: actions/upload-artifact@v3
  176. with:
  177. name: mirai-logging-slf4j-simple
  178. path: logging/mirai-logging-slf4j-simple/build/libs
  179. build-mirai-all:
  180. name: "Everything (${{ matrix.os }})"
  181. runs-on: ${{ matrix.os }}
  182. strategy:
  183. fail-fast: false
  184. matrix:
  185. os:
  186. - macos-12
  187. env:
  188. enableLocalPublishingTest: 'false'
  189. gradleArgs: --scan
  190. isMac: ${{ startsWith(matrix.os, 'macos') }}
  191. isWindows: ${{ startsWith(matrix.os, 'windows') }}
  192. isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }}
  193. isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }}
  194. steps:
  195. - uses: actions/checkout@v2
  196. with:
  197. submodules: 'recursive'
  198. - uses: actions/setup-java@v2
  199. with:
  200. distribution: 'temurin'
  201. java-version: '17'
  202. - name: Setup Gradle
  203. uses: gradle/gradle-build-action@v2
  204. - name: Cache konan
  205. uses: pat-s/always-upload-cache@v3
  206. with:
  207. path: ~/.konan
  208. key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }}
  209. restore-keys: |
  210. ${{ runner.os }}-gradle-
  211. - if: ${{ env.isUnix == 'true' }}
  212. run: chmod -R 777 *
  213. # Prepare environment for linking for macOS
  214. - if: ${{ env.isMac == 'true' }}
  215. name: Install OpenSSL
  216. run: >
  217. git clone https://github.com/openssl/openssl.git --recursive &&
  218. cd openssl &&
  219. git checkout tags/openssl-3.0.3 &&
  220. ./Configure --prefix=/opt/openssl --openssldir=/usr/local/ssl &&
  221. make &&
  222. sudo make install
  223. - name: Clean and download dependencies
  224. run: ./gradlew clean ${{ env.gradleArgs }}
  225. - run: >
  226. ./gradlew updateSnapshotVersion ${{ env.gradleArgs }}
  227. if: github.event.pusher
  228. env:
  229. MIRAI_IS_SNAPSHOTS_PUBLISHING: true
  230. SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}
  231. SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}
  232. SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}
  233. CURRENT_BRANCH_NAME: dev # always use -dev for now
  234. - name: "Assemble"
  235. run: ./gradlew assemble ${{ env.gradleArgs }}
  236. - name: Publish Local Artifacts
  237. if: ${{ env.enableLocalPublishingTest == 'true' }}
  238. run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} "-Dmirai.build.project.version=2.99.0-deps-test"
  239. - name: "Check"
  240. run: ./gradlew check ${{ env.gradleArgs }}
  241. - if: ${{ env.isMac == 'true' }}
  242. name: Ensure KDoc valid
  243. run: ./gradlew dokkaHtmlMultiModule ${{ env.gradleArgs }}
  244. - name: Publish Snapshots
  245. if: ${{ github.event.pusher && env.isMac == 'true' }}
  246. run: ./gradlew publishAllPublicationsToMiraiRepoRepository ${{ env.gradleArgs }}
  247. env:
  248. MIRAI_IS_SNAPSHOTS_PUBLISHING: true
  249. SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}
  250. SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}
  251. SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}
  252. CURRENT_BRANCH_NAME: dev
  253. build-mirai-core-native:
  254. name: "Native (${{ matrix.os }})"
  255. runs-on: ${{ matrix.os }}
  256. strategy:
  257. fail-fast: false
  258. matrix:
  259. os:
  260. - windows-2022
  261. - ubuntu-20.04
  262. - ubuntu-18.04
  263. - macos-12
  264. - macos-11
  265. include:
  266. - os: windows-2022
  267. targetName: mingwX64
  268. - os: ubuntu-20.04
  269. targetName: linuxX64
  270. - os: ubuntu-18.04
  271. targetName: linuxX64
  272. - os: macos-12
  273. targetName: macosX64
  274. - os: macos-11
  275. targetName: macosX64
  276. env:
  277. # FIXME there must be two or more targets, or we'll get error on `@OptionalExpectation`
  278. # > Declaration annotated with '@OptionalExpectation' can only be used in common module sources
  279. enableLocalPublishingTest: 'false'
  280. gradleArgs: --scan "-Dmirai.target=jvm;${{ matrix.targetName }};!other" "-Pkotlin.compiler.execution.strategy=in-process" "-Dorg.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8"
  281. isMac: ${{ startsWith(matrix.os, 'macos') }}
  282. isWindows: ${{ startsWith(matrix.os, 'windows') }}
  283. isUbuntu: ${{ startsWith(matrix.os, 'ubuntu') }}
  284. isUnix: ${{ startsWith(matrix.os, 'macos') || startsWith(matrix.os, 'ubuntu') }}
  285. VCPKG_DEFAULT_BINARY_CACHE: ${{ startsWith(matrix.os, 'windows') && 'C:\vcpkg\binary_cache' || '/usr/local/share/vcpkg/binary_cache' }}
  286. steps:
  287. - uses: actions/checkout@v2
  288. with:
  289. submodules: 'recursive'
  290. - uses: actions/setup-java@v2
  291. with:
  292. distribution: 'adopt-openj9'
  293. java-version: '17'
  294. - name: Setup Gradle
  295. uses: gradle/gradle-build-action@v2
  296. - name: Cache konan
  297. uses: pat-s/always-upload-cache@v3
  298. with:
  299. path: ~/.konan
  300. key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }}
  301. restore-keys: |
  302. ${{ runner.os }}-gradle-
  303. - name: Prepare to cache vcpkg
  304. if: ${{ env.isWindows == 'true' }}
  305. run: mkdir -p ${{ env.VCPKG_DEFAULT_BINARY_CACHE }}
  306. - name: Cache vcpkg
  307. if: ${{ env.isWindows == 'true' }}
  308. uses: pat-s/always-upload-cache@v3
  309. with:
  310. path: ${{ env.VCPKG_DEFAULT_BINARY_CACHE }}
  311. key: ${{ runner.os }}-vcpkg-binary-cache-${{ github.job }}
  312. restore-keys: |
  313. ${{ runner.os }}-vcpkg-binary-cache-
  314. - if: ${{ env.isUnix == 'true' }}
  315. run: chmod -R 777 *
  316. # Prepare environment for linking on macOS
  317. - if: ${{ env.isMac == 'true' }}
  318. name: Install OpenSSL on Mac OS
  319. run: >
  320. git clone https://github.com/openssl/openssl.git --recursive &&
  321. cd openssl &&
  322. git checkout tags/openssl-3.0.3 &&
  323. ./Configure --prefix=/opt/openssl --openssldir=/usr/local/ssl &&
  324. make &&
  325. sudo make install
  326. # Prepare environment for linking on Ubuntu
  327. - if: ${{ env.isUbuntu == 'true' }}
  328. name: Install OpenSSL on Ubuntu
  329. run: sudo apt install libssl-dev -y
  330. # Prepare environment for linking on Windows
  331. - if: ${{ env.isWindows == 'true' }}
  332. name: Setup Memory Environment on Windows
  333. run: >
  334. wmic pagefileset where name="D:\\pagefile.sys" set InitialSize=1024,MaximumSize=9216 &
  335. net stop mongodb
  336. shell: cmd
  337. continue-on-error: true
  338. - if: ${{ env.isWindows == 'true' }}
  339. name: Install OpenSSL & cURL on Windows
  340. run: |
  341. echo "set(VCPKG_BUILD_TYPE release)" | Out-File -FilePath "$env:VCPKG_INSTALLATION_ROOT\triplets\x64-windows.cmake" -Encoding utf8 -Append
  342. vcpkg install openssl:x64-windows curl[core,ssl]:x64-windows
  343. New-Item -Path $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\crypto.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\libcrypto.lib
  344. New-Item -Path $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\ssl.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\libssl.lib
  345. New-Item -Path $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\curl.lib -ItemType SymbolicLink -Value $env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib\libcurl.lib
  346. echo "$env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
  347. - name: Clean and download dependencies
  348. run: ./gradlew clean ${{ env.gradleArgs }}
  349. - run: >
  350. ./gradlew updateSnapshotVersion ${{ env.gradleArgs }}
  351. if: github.event.pusher
  352. env:
  353. MIRAI_IS_SNAPSHOTS_PUBLISHING: true
  354. SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}
  355. SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}
  356. SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}
  357. CURRENT_BRANCH_NAME: dev # always use -dev for now
  358. - name: "Test mirai-core-utils for ${{ matrix.os }}"
  359. run: ./gradlew :mirai-core-utils:${{ matrix.targetName }}Test ${{ env.gradleArgs }}
  360. - name: "Test mirai-core-api for ${{ matrix.os }}"
  361. run: ./gradlew :mirai-core-api:${{ matrix.targetName }}Test ${{ env.gradleArgs }}
  362. - name: "Test mirai-core for ${{ matrix.os }}"
  363. run: ./gradlew :mirai-core:${{ matrix.targetName }}Test ${{ env.gradleArgs }}
  364. - name: Publish Local Artifacts
  365. if: ${{ env.enableLocalPublishingTest == 'true' }}
  366. run: ./gradlew :mirai-deps-test:publishMiraiArtifactsToMavenLocal ${{ env.gradleArgs }} "-Dmirai.build.project.version=2.99.0-deps-test"
  367. - name: Check Publication
  368. if: ${{ env.enableLocalPublishingTest == 'true' }}
  369. run: ./gradlew :mirai-deps-test:check ${{ env.gradleArgs }}
  370. # Publish native snapshots. Other artifacts are published in build-mirai-all
  371. - name: Publish MingwX64 Snapshots
  372. if: ${{ github.event.pusher && env.isWindows == 'true' }}
  373. run: ./gradlew publishMingwX64PublicationToMiraiRepoRepository ${{ env.gradleArgs }}
  374. env:
  375. MIRAI_IS_SNAPSHOTS_PUBLISHING: true
  376. SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}
  377. SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}
  378. SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}
  379. CURRENT_BRANCH_NAME: dev
  380. - name: Publish LinuxX64 Snapshots
  381. if: ${{ github.event.pusher && env.isUbuntu == 'true' }}
  382. run: ./gradlew publishLinuxX64PublicationToMiraiRepoRepository ${{ env.gradleArgs }}
  383. env:
  384. MIRAI_IS_SNAPSHOTS_PUBLISHING: true
  385. SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}
  386. SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}
  387. SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}
  388. CURRENT_BRANCH_NAME: dev
  389. - name: Publish macOSX64 Snapshots
  390. if: ${{ github.event.pusher && env.isMac == 'true' }}
  391. run: ./gradlew publishMacosX64PublicationToMiraiRepoRepository ${{ env.gradleArgs }}
  392. env:
  393. MIRAI_IS_SNAPSHOTS_PUBLISHING: true
  394. SNAPSHOTS_PUBLISHING_USER: ${{ secrets.SNAPSHOTS_PUBLISHING_USER }}
  395. SNAPSHOTS_PUBLISHING_KEY: ${{ secrets.SNAPSHOTS_PUBLISHING_KEY }}
  396. SNAPSHOTS_PUBLISHING_URL: ${{ secrets.SNAPSHOTS_PUBLISHING_URL }}
  397. CURRENT_BRANCH_NAME: dev