action.yml 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. # NOTE: Do not rely on `make` commands here as this action is used across different repos
  2. # where the Makefile will not be available
  3. name: 'Sentry Setup'
  4. description: 'Sets up a Sentry test environment'
  5. inputs:
  6. workdir:
  7. description: 'Directory where the sentry source is located'
  8. required: false
  9. default: '.'
  10. snuba:
  11. description: 'Is snuba required?'
  12. required: false
  13. default: 'false'
  14. clickhouse:
  15. description: 'Is clickhouse required?'
  16. required: false
  17. default: 'false'
  18. kafka:
  19. description: 'Is kafka required?'
  20. required: false
  21. default: 'false'
  22. chartcuterie:
  23. description: 'Is chartcuterie required?'
  24. required: false
  25. default: 'false'
  26. bigtable:
  27. description: 'Is bigtable required?'
  28. required: false
  29. default: 'false'
  30. python-version:
  31. description: 'python version to install'
  32. required: false
  33. default: '3.8.13'
  34. pg-version:
  35. description: 'PostgreSQL version to use'
  36. default: '9.6'
  37. required: false
  38. outputs:
  39. yarn-cache-dir:
  40. description: 'Path to yarn cache'
  41. value: ${{ steps.config.outputs.yarn-cache-dir }}
  42. acceptance-dir:
  43. description: 'Path to acceptance visual snapshot artifacts'
  44. value: ${{ steps.config.outputs.acceptance-dir }}
  45. matrix-instance-number:
  46. description: 'The matrix instance number (starting at 1)'
  47. value: ${{ steps.config.outputs.matrix-instance-number }}
  48. matrix-instance-total:
  49. description: 'Reexport of MATRIX_INSTANCE_TOTAL.'
  50. value: ${{ steps.config.outputs.matrix-instance-total }}
  51. runs:
  52. using: 'composite'
  53. steps:
  54. - name: Setup default environment variables
  55. shell: bash
  56. env:
  57. MATRIX_INSTANCE: ${{ matrix.instance }}
  58. # XXX: We should be using something like len(strategy.matrix.instance) (not possible atm)
  59. # If you have other things like python-version: [foo, bar, baz] then the sharding logic
  60. # isn't right because job-total will be 3x larger and you'd never run 2/3 of the tests.
  61. # MATRIX_INSTANCE_TOTAL: ${{ strategy.job-total }}
  62. run: |
  63. # Only set `MIGRATIONS_TEST_MIGRATE` if it is not already set (or if it's an empty string)
  64. if [ -z $MIGRATIONS_TEST_MIGRATE ]; then
  65. echo "MIGRATIONS_TEST_MIGRATE=0" >> $GITHUB_ENV
  66. fi
  67. echo "PIP_DISABLE_PIP_VERSION_CHECK=on" >> $GITHUB_ENV
  68. echo "PIP_INDEX_URL=https://pypi.devinfra.sentry.io/simple" >> $GITHUB_ENV
  69. echo "SENTRY_SKIP_BACKEND_VALIDATION=1" >> $GITHUB_ENV
  70. ### node configuration ###
  71. echo "NODE_ENV=development" >> $GITHUB_ENV
  72. echo "NODE_OPTIONS=--max-old-space-size=4096" >> $GITHUB_ENV
  73. ### pytest configuration ###
  74. echo "PY_COLORS=1" >> "$GITHUB_ENV"
  75. echo "PYTEST_ADDOPTS=--reruns=5 --durations=10" >> $GITHUB_ENV
  76. ### pytest-sentry configuration ###
  77. if [ "$GITHUB_REPOSITORY" = "getsentry/sentry" ]; then
  78. echo "PYTEST_SENTRY_DSN=https://6fd5cfea2d4d46b182ad214ac7810508@sentry.io/2423079" >> $GITHUB_ENV
  79. echo "PYTEST_SENTRY_TRACES_SAMPLE_RATE=0" >> $GITHUB_ENV
  80. # This records failures on master to sentry in order to detect flakey tests, as it's
  81. # expected that people have failing tests on their PRs
  82. if [ "$GITHUB_REF" = "refs/heads/master" ]; then
  83. echo "PYTEST_SENTRY_ALWAYS_REPORT=1" >> $GITHUB_ENV
  84. fi
  85. fi
  86. # Configure a different release version, otherwise it defaults to the
  87. # commit sha which will conflict with our actual prod releases. This is a
  88. # confusing experience because it looks like these are "empty" releases
  89. # because no commits are attached and associates the release with our
  90. # javascript + sentry projects.
  91. echo "SENTRY_RELEASE=ci@$GITHUB_SHA" >> $GITHUB_ENV
  92. # this handles pytest test sharding
  93. if [ "$MATRIX_INSTANCE" ]; then
  94. if ! [ "$MATRIX_INSTANCE_TOTAL" ]; then
  95. echo "MATRIX_INSTANCE_TOTAL is required."
  96. exit 1
  97. fi
  98. echo "TEST_GROUP=$MATRIX_INSTANCE" >> $GITHUB_ENV
  99. echo "TOTAL_TEST_GROUPS=$MATRIX_INSTANCE_TOTAL" >> $GITHUB_ENV
  100. fi
  101. - name: Setup python
  102. uses: actions/setup-python@13ae5bb136fac2878aff31522b9efb785519f984 # v4.3.0
  103. with:
  104. python-version: ${{ inputs.python-version }}
  105. cache: pip
  106. cache-dependency-path: ${{ inputs.workdir }}/requirements-dev-frozen.txt
  107. - name: Set up outputs
  108. id: config
  109. env:
  110. MATRIX_INSTANCE: ${{ matrix.instance }}
  111. shell: bash
  112. run: |
  113. echo "yarn-cache-dir=$(yarn cache dir)" >> "$GITHUB_OUTPUT"
  114. echo "matrix-instance-number=$(($MATRIX_INSTANCE+1))" >> "$GITHUB_OUTPUT"
  115. echo "matrix-instance-total=$(($MATRIX_INSTANCE_TOTAL))" >> "$GITHUB_OUTPUT"
  116. echo "acceptance-dir=.artifacts/visual-snapshots/acceptance" >> "$GITHUB_OUTPUT"
  117. - name: Install python dependencies
  118. shell: bash
  119. env:
  120. # This is necessary when other repositories (e.g. relay) want to take advantage of this workflow
  121. # without needing to fork it. The path needed is the one where setup.py is located
  122. WORKDIR: ${{ inputs.workdir }}
  123. run: |
  124. cd "$WORKDIR"
  125. python setup.py install_egg_info
  126. # We need to install editable otherwise things like check migration will fail.
  127. pip install -r requirements-dev-frozen.txt & \
  128. SENTRY_LIGHT_BUILD=1 pip install --no-deps -e . & \
  129. wait
  130. cd -
  131. - name: Start devservices
  132. shell: bash
  133. env:
  134. NEED_KAFKA: ${{ inputs.kafka }}
  135. NEED_SNUBA: ${{ inputs.snuba }}
  136. NEED_CLICKHOUSE: ${{ inputs.clickhouse }}
  137. NEED_BIGTABLE: ${{ inputs.bigtable }}
  138. NEED_CHARTCUTERIE: ${{ inputs.chartcuterie }}
  139. WORKDIR: ${{ inputs.workdir }}
  140. PG_VERSION: ${{ inputs.pg-version }}
  141. run: |
  142. sentry init
  143. # redis, postgres are needed for almost every code path.
  144. services='redis postgres'
  145. if [ "$NEED_CLICKHOUSE" = "true" ] || [ "$NEED_SNUBA" = "true" ]; then
  146. services="${services} clickhouse"
  147. fi
  148. if [ "$NEED_SNUBA" = "true" ]; then
  149. services="${services} snuba"
  150. fi
  151. if [ "$NEED_BIGTABLE" = "true" ]; then
  152. echo "BIGTABLE_EMULATOR_HOST=127.0.0.1:8086" >> $GITHUB_ENV
  153. services="${services} bigtable"
  154. fi
  155. if [ "$NEED_CHARTCUTERIE" = "true" ]; then
  156. services="${services} chartcuterie"
  157. fi
  158. sentry devservices up $services &
  159. # TODO: Use devservices kafka. See https://github.com/getsentry/sentry/pull/20986#issuecomment-704510570
  160. if [ "$NEED_KAFKA" = "true" ]; then
  161. # This is *not* the production version. Unclear reason as to why this was chosen
  162. # https://github.com/getsentry/ops/blob/c823e62f930ecc6c97bb08898c71e49edc7232f6/cookbooks/getsentry/attributes/default.rb#L631
  163. docker run \
  164. --name sentry_zookeeper \
  165. -d --network host \
  166. -e ZOOKEEPER_CLIENT_PORT=2181 \
  167. confluentinc/cp-zookeeper:4.1.0 \
  168. &
  169. # This is the production version; do not change w/o changing it there as well
  170. # https://github.com/getsentry/ops/blob/c823e62f930ecc6c97bb08898c71e49edc7232f6/cookbooks/getsentry/attributes/default.rb#L643
  171. docker run \
  172. --name sentry_kafka \
  173. -d --network host \
  174. -e KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181 \
  175. -e KAFKA_LISTENERS=INTERNAL://0.0.0.0:9093,EXTERNAL://0.0.0.0:9092 \
  176. -e KAFKA_ADVERTISED_LISTENERS=INTERNAL://127.0.0.1:9093,EXTERNAL://127.0.0.1:9092 \
  177. -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT \
  178. -e KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL \
  179. -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
  180. confluentinc/cp-kafka:5.1.2 \
  181. &
  182. fi
  183. wait
  184. docker ps -a
  185. # This is necessary when other repositories (e.g. relay) want to take advantage of this workflow
  186. # without needing to fork it. The path needed is the one where tools are located
  187. cd "$WORKDIR"
  188. python3 -u -S -m tools.devservices_healthcheck
  189. cd -