ci.yml 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. name: CI
  2. on:
  3. push:
  4. branches: [main]
  5. pull_request:
  6. branches: [main]
  7. workflow_dispatch:
  8. jobs:
  9. changes:
  10. name: Detect changes
  11. runs-on: ubuntu-22.04
  12. outputs:
  13. rust: ${{ github.event_name == 'workflow_dispatch' && 'true' || steps.filter.outputs.rust }}
  14. steps:
  15. - name: Checkout
  16. if: github.event_name != 'workflow_dispatch'
  17. uses: actions/checkout@v5
  18. with:
  19. fetch-depth: 0
  20. - name: Filter paths
  21. if: github.event_name != 'workflow_dispatch'
  22. uses: dorny/paths-filter@v4
  23. id: filter
  24. with:
  25. filters: |
  26. rust:
  27. - 'src-tauri/**'
  28. # PR / manual only. Merge to main already passed this on the PR;
  29. # do not compile the same debug tree again.
  30. check:
  31. name: Check Ubuntu
  32. needs: changes
  33. if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
  34. runs-on: ubuntu-22.04
  35. steps:
  36. - name: Checkout
  37. uses: actions/checkout@v5
  38. - name: Install Rust stable
  39. uses: dtolnay/rust-toolchain@stable
  40. - name: Install dependencies
  41. run: |
  42. sudo apt-get update
  43. sudo apt-get install -y curl libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf protobuf-compiler
  44. - name: Rust cache
  45. uses: Swatinem/rust-cache@v2
  46. with:
  47. workspaces: src-tauri
  48. cache-on-failure: true
  49. - name: Setup Node.js
  50. uses: actions/setup-node@v5
  51. with:
  52. node-version: 24
  53. cache: npm
  54. - name: Install frontend dependencies
  55. run: npm ci
  56. - name: Check frontend build
  57. run: npx vite build
  58. - name: Check Rust build
  59. working-directory: src-tauri
  60. run: cargo build
  61. check-windows:
  62. name: Check Windows (Rust)
  63. needs: changes
  64. if: >-
  65. (github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch') &&
  66. needs.changes.outputs.rust == 'true'
  67. runs-on: windows-latest
  68. steps:
  69. - name: Checkout
  70. uses: actions/checkout@v5
  71. - name: Install Rust stable
  72. uses: dtolnay/rust-toolchain@stable
  73. - name: Install protoc
  74. uses: arduino/setup-protoc@v3
  75. with:
  76. repo-token: ${{ secrets.GITHUB_TOKEN }}
  77. - name: Rust cache
  78. uses: Swatinem/rust-cache@v2
  79. with:
  80. workspaces: src-tauri
  81. cache-on-failure: true
  82. - name: Check Rust build
  83. working-directory: src-tauri
  84. run: cargo build
  85. # Warm target/release on the default branch so tag builds can restore it.
  86. # Only when src-tauri changes (or manual dispatch). Frontend merges must not
  87. # pay for a 3-platform release compile.
  88. release-compile:
  89. name: Release compile ${{ matrix.display }}
  90. needs: changes
  91. if: github.event_name != 'pull_request' && needs.changes.outputs.rust == 'true'
  92. runs-on: ${{ matrix.platform }}
  93. env:
  94. CARGO_PROFILE_RELEASE_LTO: "false"
  95. CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "16"
  96. CARGO_PROFILE_RELEASE_OPT_LEVEL: "1"
  97. strategy:
  98. fail-fast: false
  99. matrix:
  100. include:
  101. - platform: ubuntu-22.04
  102. display: Linux x64
  103. - platform: macos-latest
  104. display: macOS
  105. steps:
  106. - name: Checkout
  107. uses: actions/checkout@v5
  108. - name: Install Rust stable
  109. uses: dtolnay/rust-toolchain@stable
  110. - name: Install protoc (macOS)
  111. if: matrix.platform == 'macos-latest'
  112. run: |
  113. brew untap aws/tap || true
  114. brew install protobuf
  115. - name: Install dependencies (Ubuntu)
  116. if: matrix.platform == 'ubuntu-22.04'
  117. run: |
  118. sudo apt-get update
  119. sudo apt-get install -y curl libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf protobuf-compiler
  120. - name: Rust cache
  121. uses: Swatinem/rust-cache@v2
  122. with:
  123. workspaces: src-tauri
  124. shared-key: qmai-release
  125. add-job-id-key: false
  126. cache-on-failure: true
  127. - name: Setup Node.js
  128. uses: actions/setup-node@v5
  129. with:
  130. node-version: 24
  131. cache: npm
  132. - name: Install frontend dependencies
  133. run: npm ci
  134. - name: Build frontend
  135. run: npx vite build
  136. - name: Cargo release build
  137. working-directory: src-tauri
  138. run: cargo build --release
  139. release-compile-windows:
  140. name: Release compile Windows x64
  141. needs: changes
  142. if: github.event_name != 'pull_request' && needs.changes.outputs.rust == 'true'
  143. runs-on: windows-latest
  144. env:
  145. CARGO_PROFILE_RELEASE_LTO: "false"
  146. CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "16"
  147. CARGO_PROFILE_RELEASE_OPT_LEVEL: "1"
  148. steps:
  149. - name: Checkout
  150. uses: actions/checkout@v5
  151. - name: Install Rust stable
  152. uses: dtolnay/rust-toolchain@stable
  153. - name: Install protoc (Windows)
  154. uses: arduino/setup-protoc@v3
  155. with:
  156. repo-token: ${{ secrets.GITHUB_TOKEN }}
  157. - name: Rust cache
  158. uses: Swatinem/rust-cache@v2
  159. with:
  160. workspaces: src-tauri
  161. shared-key: qmai-release
  162. add-job-id-key: false
  163. cache-on-failure: true
  164. - name: Setup Node.js
  165. uses: actions/setup-node@v5
  166. with:
  167. node-version: 24
  168. cache: npm
  169. - name: Install frontend dependencies
  170. run: npm ci
  171. - name: Build frontend
  172. run: npx vite build
  173. - name: Cargo release build
  174. working-directory: src-tauri
  175. run: cargo build --release