backend.yml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. name: backend
  2. on:
  3. push:
  4. branches:
  5. - master
  6. pull_request:
  7. # Cancel in progress workflows on pull_requests.
  8. # https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value
  9. concurrency:
  10. group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  11. cancel-in-progress: true
  12. # hack for https://github.com/actions/cache/issues/810#issuecomment-1222550359
  13. env:
  14. SEGMENT_DOWNLOAD_TIMEOUT_MINS: 3
  15. jobs:
  16. files-changed:
  17. name: detect what files changed
  18. runs-on: ubuntu-20.04
  19. timeout-minutes: 3
  20. # Map a step output to a job output
  21. outputs:
  22. api_docs: ${{ steps.changes.outputs.api_docs }}
  23. backend: ${{ steps.changes.outputs.backend_all }}
  24. backend_dependencies: ${{ steps.changes.outputs.backend_dependencies }}
  25. backend_any_type: ${{ steps.changes.outputs.backend_any_type }}
  26. migration_lockfile: ${{ steps.changes.outputs.migration_lockfile }}
  27. plugins: ${{ steps.changes.outputs.plugins }}
  28. steps:
  29. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  30. - name: Check for backend file changes
  31. uses: getsentry/paths-filter@4512585405083f25c027a35db413c2b3b9006d50 # v2.11.1
  32. id: changes
  33. with:
  34. token: ${{ github.token }}
  35. filters: .github/file-filters.yml
  36. api-docs:
  37. if: needs.files-changed.outputs.api_docs == 'true'
  38. needs: files-changed
  39. name: api docs test
  40. runs-on: ubuntu-20.04
  41. steps:
  42. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  43. - uses: getsentry/action-setup-volta@54775a59c41065f54ecc76d1dd5f2cdc7a1550cb # v1.1.0
  44. - name: Setup sentry python env
  45. uses: ./.github/actions/setup-sentry
  46. id: setup
  47. with:
  48. snuba: true
  49. - name: Run API docs tests
  50. # install ts-node for ts build scripts to execute properly without potentially installing
  51. # conflicting deps when running scripts locally
  52. # see: https://github.com/getsentry/sentry/pull/32328/files
  53. run: |
  54. yarn add ts-node && make test-api-docs
  55. backend-test:
  56. if: needs.files-changed.outputs.backend == 'true'
  57. needs: files-changed
  58. name: backend test
  59. runs-on: ubuntu-20.04
  60. timeout-minutes: 40
  61. strategy:
  62. # This helps not having to run multiple jobs because one fails, thus, reducing resource usage
  63. # and reducing the risk that one of many runs would turn red again (read: intermittent tests)
  64. fail-fast: false
  65. matrix:
  66. # XXX: When updating this, make sure you also update MATRIX_INSTANCE_TOTAL.
  67. instance: [0, 1, 2, 3, 4, 5, 6]
  68. pg-version: ['14']
  69. env:
  70. # XXX: `MATRIX_INSTANCE_TOTAL` must be hardcoded to the length of `strategy.matrix.instance`.
  71. # If this increases, make sure to also increase `flags.backend.after_n_builds` in `codecov.yml`.
  72. MATRIX_INSTANCE_TOTAL: 7
  73. steps:
  74. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  75. with:
  76. # Avoid codecov error message related to SHA resolution:
  77. # https://github.com/codecov/codecov-bash/blob/7100762afbc822b91806a6574658129fe0d23a7d/codecov#L891
  78. fetch-depth: '2'
  79. - name: Setup sentry env
  80. uses: ./.github/actions/setup-sentry
  81. id: setup
  82. with:
  83. snuba: true
  84. # Right now, we run so few bigtable related tests that the
  85. # overhead of running bigtable in all backend tests
  86. # is way smaller than the time it would take to run in its own job.
  87. bigtable: true
  88. pg-version: ${{ matrix.pg-version }}
  89. - name: Run backend test (${{ steps.setup.outputs.matrix-instance-number }} of ${{ steps.setup.outputs.matrix-instance-total }})
  90. run: |
  91. make test-python-ci
  92. # Upload coverage data even if running the tests step fails since
  93. # it reduces large coverage fluctuations
  94. - name: Handle artifacts
  95. if: ${{ always() }}
  96. uses: ./.github/actions/artifacts
  97. with:
  98. token: ${{ secrets.CODECOV_TOKEN }}
  99. backend-migration-tests:
  100. if: needs.files-changed.outputs.backend == 'true'
  101. needs: files-changed
  102. name: backend migration tests
  103. runs-on: ubuntu-20.04
  104. timeout-minutes: 30
  105. strategy:
  106. matrix:
  107. pg-version: ['14']
  108. steps:
  109. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  110. with:
  111. # Avoid codecov error message related to SHA resolution:
  112. # https://github.com/codecov/codecov-bash/blob/7100762afbc822b91806a6574658129fe0d23a7d/codecov#L891
  113. fetch-depth: '2'
  114. - name: Setup sentry env
  115. uses: ./.github/actions/setup-sentry
  116. id: setup
  117. with:
  118. snuba: true
  119. pg-version: ${{ matrix.pg-version }}
  120. - name: run tests
  121. run: |
  122. MIGRATIONS_TEST_MIGRATE=1 PYTEST_ADDOPTS="$PYTEST_ADDOPTS -m migrations" make test-python-ci
  123. # Upload coverage data even if running the tests step fails since
  124. # it reduces large coverage fluctuations
  125. - name: Handle artifacts
  126. if: ${{ always() }}
  127. uses: ./.github/actions/artifacts
  128. with:
  129. token: ${{ secrets.CODECOV_TOKEN }}
  130. cli:
  131. if: needs.files-changed.outputs.backend == 'true'
  132. needs: files-changed
  133. name: cli test
  134. runs-on: ubuntu-20.04
  135. timeout-minutes: 10
  136. strategy:
  137. matrix:
  138. pg-version: ['14']
  139. steps:
  140. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  141. - name: Setup sentry env
  142. uses: ./.github/actions/setup-sentry
  143. id: setup
  144. with:
  145. pg-version: ${{ matrix.pg-version }}
  146. - name: Run test
  147. run: |
  148. make test-cli
  149. # Upload coverage data even if running the tests step fails since
  150. # it reduces large coverage fluctuations
  151. - name: Handle artifacts
  152. if: ${{ always() }}
  153. uses: ./.github/actions/artifacts
  154. with:
  155. token: ${{ secrets.CODECOV_TOKEN }}
  156. requirements:
  157. if: needs.files-changed.outputs.backend_dependencies == 'true'
  158. needs: files-changed
  159. name: requirements check
  160. runs-on: ubuntu-20.04
  161. timeout-minutes: 3
  162. steps:
  163. - uses: getsentry/action-github-app-token@97c9e23528286821f97fba885c1b1123284b29cc # v2.0.0
  164. id: token
  165. continue-on-error: true
  166. with:
  167. app_id: ${{ vars.SENTRY_INTERNAL_APP_ID }}
  168. private_key: ${{ secrets.SENTRY_INTERNAL_APP_PRIVATE_KEY }}
  169. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  170. - uses: getsentry/action-setup-venv@9e3bbae3836b1b6f129955bf55a19e1d99a61c67 # v1.0.5
  171. with:
  172. python-version: 3.8.16
  173. cache-depedency: requirements-dev-frozen.txt
  174. install-cmd: pip install -q --constraint requirements-dev-frozen.txt pip-tools
  175. - name: check requirements
  176. run: |
  177. python -S -m tools.freeze_requirements
  178. if ! git diff --exit-code; then
  179. echo $'\n\nrun `make freeze-requirements` locally to update requirements'
  180. exit 1
  181. fi
  182. - name: apply any requirements changes
  183. if: steps.token.outcome == 'success' && github.ref != 'refs/heads/master' && always()
  184. uses: getsentry/action-github-commit@748c31dd78cffe76f51bef49a0be856b6effeda7 # v1.1.0
  185. with:
  186. github-token: ${{ steps.token.outputs.token }}
  187. message: ':snowflake: re-freeze requirements'
  188. migration:
  189. if: needs.files-changed.outputs.migration_lockfile == 'true'
  190. needs: files-changed
  191. name: check migration
  192. runs-on: ubuntu-20.04
  193. strategy:
  194. matrix:
  195. pg-version: ['14']
  196. steps:
  197. - name: Checkout sentry
  198. uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  199. - name: Setup sentry env
  200. uses: ./.github/actions/setup-sentry
  201. id: setup
  202. with:
  203. pg-version: ${{ matrix.pg-version }}
  204. - name: Migration & lockfile checks
  205. env:
  206. SENTRY_LOG_LEVEL: ERROR
  207. PGPASSWORD: postgres
  208. run: |
  209. ./.github/workflows/scripts/migration-check.sh
  210. plugins:
  211. if: needs.files-changed.outputs.plugins == 'true'
  212. needs: files-changed
  213. name: plugins test
  214. runs-on: ubuntu-20.04
  215. timeout-minutes: 10
  216. steps:
  217. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  218. - name: Setup sentry env
  219. uses: ./.github/actions/setup-sentry
  220. id: setup
  221. with:
  222. snuba: true
  223. - name: Run test
  224. env:
  225. SENTRY_FORCE_SILOED_TESTS: 1
  226. run: |
  227. make test-plugins
  228. relay:
  229. if: needs.files-changed.outputs.backend == 'true'
  230. needs: files-changed
  231. name: relay test
  232. runs-on: ubuntu-20.04
  233. timeout-minutes: 30
  234. steps:
  235. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  236. with:
  237. # Avoid codecov error message related to SHA resolution:
  238. # https://github.com/codecov/codecov-bash/blob/7100762afbc822b91806a6574658129fe0d23a7d/codecov#L891
  239. fetch-depth: '2'
  240. - name: Setup sentry env
  241. uses: ./.github/actions/setup-sentry
  242. id: setup
  243. with:
  244. snuba: true
  245. kafka: true
  246. - name: Pull relay image
  247. run: |
  248. # pull relay we'll run and kill it for each test
  249. docker pull us.gcr.io/sentryio/relay:nightly
  250. docker ps -a
  251. - name: Run test
  252. env:
  253. SENTRY_FORCE_SILOED_TESTS: 1
  254. run: |
  255. make test-relay-integration
  256. # Upload coverage data even if running the tests step fails since
  257. # it reduces large coverage fluctuations
  258. - name: Handle artifacts
  259. if: ${{ always() }}
  260. uses: ./.github/actions/artifacts
  261. with:
  262. token: ${{ secrets.CODECOV_TOKEN }}
  263. snuba:
  264. if: needs.files-changed.outputs.backend == 'true'
  265. needs: files-changed
  266. name: snuba test
  267. runs-on: ubuntu-20.04
  268. timeout-minutes: 45
  269. strategy:
  270. # This helps not having to run multiple jobs because one fails, thus, reducing resource usage
  271. # and reducing the risk that one of many runs would turn red again (read: intermittent tests)
  272. fail-fast: false
  273. matrix:
  274. # XXX: When updating this, make sure you also update MATRIX_INSTANCE_TOTAL.
  275. instance: [0, 1, 2, 3]
  276. env:
  277. # XXX: MATRIX_INSTANCE_TOTAL must be hardcoded to the length of strategy.matrix.instance.
  278. MATRIX_INSTANCE_TOTAL: 4
  279. steps:
  280. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  281. with:
  282. # Avoid codecov error message related to SHA resolution:
  283. # https://github.com/codecov/codecov-bash/blob/7100762afbc822b91806a6574658129fe0d23a7d/codecov#L891
  284. fetch-depth: '2'
  285. - name: Setup sentry env
  286. uses: ./.github/actions/setup-sentry
  287. id: setup
  288. with:
  289. snuba: true
  290. kafka: true
  291. - name: Run snuba test (${{ steps.setup.outputs.matrix-instance-number }} of ${{ steps.setup.outputs.matrix-instance-total }})
  292. run: |
  293. make test-snuba
  294. # Upload coverage data even if running the tests step fails since
  295. # it reduces large coverage fluctuations
  296. - name: Handle artifacts
  297. if: ${{ always() }}
  298. uses: ./.github/actions/artifacts
  299. with:
  300. token: ${{ secrets.CODECOV_TOKEN }}
  301. symbolicator:
  302. if: needs.files-changed.outputs.backend == 'true'
  303. needs: files-changed
  304. name: symbolicator test
  305. runs-on: ubuntu-20.04
  306. timeout-minutes: 20
  307. steps:
  308. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  309. with:
  310. # Avoid codecov error message related to SHA resolution:
  311. # https://github.com/codecov/codecov-bash/blob/7100762afbc822b91806a6574658129fe0d23a7d/codecov#L891
  312. fetch-depth: '2'
  313. - name: Setup sentry env
  314. uses: ./.github/actions/setup-sentry
  315. id: setup
  316. with:
  317. snuba: true
  318. kafka: true
  319. - name: Start symbolicator
  320. run: |
  321. echo $PWD
  322. docker run \
  323. -d \
  324. -v $PWD/config/symbolicator/:/etc/symbolicator \
  325. --network host \
  326. --name symbolicator \
  327. us.gcr.io/sentryio/symbolicator:nightly \
  328. run -c /etc/symbolicator/config.yml
  329. docker ps -a
  330. - name: Run test
  331. run: |
  332. make test-symbolicator
  333. # Upload coverage data even if running the tests step fails since
  334. # it reduces large coverage fluctuations
  335. - name: Handle artifacts
  336. if: ${{ always() }}
  337. uses: ./.github/actions/artifacts
  338. with:
  339. token: ${{ secrets.CODECOV_TOKEN }}
  340. typing:
  341. if: needs.files-changed.outputs.backend == 'true'
  342. needs: files-changed
  343. name: backend typing
  344. runs-on: ubuntu-20.04
  345. timeout-minutes: 20
  346. steps:
  347. - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
  348. - uses: getsentry/action-setup-venv@9e3bbae3836b1b6f129955bf55a19e1d99a61c67 # v1.0.5
  349. with:
  350. python-version: 3.8.16
  351. cache-dependency-path: requirements-dev-frozen.txt
  352. install-cmd: pip install -r requirements-dev-frozen.txt
  353. - name: setup sentry (lite)
  354. run: |
  355. SENTRY_LIGHT_BUILD=1 pip install --no-deps -e .
  356. sentry init
  357. - run: make backend-typing
  358. id: run
  359. - uses: getsentry/action-github-app-token@97c9e23528286821f97fba885c1b1123284b29cc # v2.0.0
  360. id: token
  361. continue-on-error: true
  362. with:
  363. app_id: ${{ vars.SENTRY_INTERNAL_APP_ID }}
  364. private_key: ${{ secrets.SENTRY_INTERNAL_APP_PRIVATE_KEY }}
  365. # only if `backend-typing` succeeds should we try and trim the blocklist
  366. - run: |
  367. python3 -m tools.mypy_helpers.make_module_ignores
  368. git diff --exit-code
  369. - name: apply blocklist changes
  370. if: steps.token.outcome == 'success' && steps.run.outcome == 'success' && github.ref != 'refs/heads/master' && always()
  371. uses: getsentry/action-github-commit@748c31dd78cffe76f51bef49a0be856b6effeda7 # v1.1.0
  372. with:
  373. github-token: ${{ steps.token.outputs.token }}
  374. message: ':knife: regenerate mypy module blocklist'
  375. # This check runs once all dependent jobs have passed
  376. # It symbolizes that all required Backend checks have succesfully passed (Or skipped)
  377. # This step is the only required backend check
  378. backend-required-check:
  379. needs:
  380. [
  381. api-docs,
  382. backend-test,
  383. backend-migration-tests,
  384. cli,
  385. files-changed,
  386. requirements,
  387. migration,
  388. plugins,
  389. relay,
  390. snuba,
  391. symbolicator,
  392. typing,
  393. ]
  394. name: Backend
  395. # This is necessary since a failed/skipped dependent job would cause this job to be skipped
  396. if: always()
  397. runs-on: ubuntu-20.04
  398. steps:
  399. # If any jobs we depend on fail, we will fail since this is a required check
  400. # NOTE: A timeout is considered a failure
  401. - name: Check for failures
  402. if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')
  403. run: |
  404. echo "One of the dependent jobs have failed. You may need to re-run it." && exit 1