ci.yml 5.2 KB

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