# NOTE: Do not rely on `make` commands here as this action is used across different repos # where the Makefile will not be available name: 'Sentry Setup' description: 'Sets up a Sentry test environment' inputs: workdir: description: 'Directory where the sentry source is located' required: false default: '.' snuba: description: 'Is snuba required?' required: false default: 'false' clickhouse: description: 'Is clickhouse required?' required: false default: 'false' kafka: description: 'Is kafka required?' required: false default: 'false' chartcuterie: description: 'Is chartcuterie required?' required: false default: 'false' bigtable: description: 'Is bigtable required?' required: false default: 'false' python-version: description: 'python version to install' required: false default: '3.8.13' pg-version: description: 'PostgreSQL version to use' default: '9.6' required: false outputs: yarn-cache-dir: description: 'Path to yarn cache' value: ${{ steps.config.outputs.yarn-cache-dir }} acceptance-dir: description: 'Path to acceptance visual snapshot artifacts' value: ${{ steps.config.outputs.acceptance-dir }} matrix-instance-number: description: 'The matrix instance number (starting at 1)' value: ${{ steps.config.outputs.matrix-instance-number }} matrix-instance-total: description: 'Reexport of MATRIX_INSTANCE_TOTAL.' value: ${{ steps.config.outputs.matrix-instance-total }} runs: using: 'composite' steps: - name: Setup default environment variables # the default for "bash" is: # bash --noprofile --norc -eo pipefail {0} shell: bash --noprofile --norc -eo pipefail -ux {0} env: MATRIX_INSTANCE: ${{ matrix.instance }} # XXX: We should be using something like len(strategy.matrix.instance) (not possible atm) # If you have other things like python-version: [foo, bar, baz] then the sharding logic # isn't right because job-total will be 3x larger and you'd never run 2/3 of the tests. # MATRIX_INSTANCE_TOTAL: ${{ strategy.job-total }} run: | echo "PIP_DISABLE_PIP_VERSION_CHECK=on" >> $GITHUB_ENV echo "PIP_INDEX_URL=https://pypi.devinfra.sentry.io/simple" >> $GITHUB_ENV echo "SENTRY_SKIP_BACKEND_VALIDATION=1" >> $GITHUB_ENV ### node configuration ### echo "NODE_ENV=development" >> $GITHUB_ENV echo "NODE_OPTIONS=--max-old-space-size=4096" >> $GITHUB_ENV ### pytest configuration ### echo "PY_COLORS=1" >> "$GITHUB_ENV" echo "PYTEST_ADDOPTS=--reruns=5 --durations=10 --fail-slow=60s" >> $GITHUB_ENV ### pytest-sentry configuration ### if [ "$GITHUB_REPOSITORY" = "getsentry/sentry" ]; then echo "PYTEST_SENTRY_DSN=https://6fd5cfea2d4d46b182ad214ac7810508@sentry.io/2423079" >> $GITHUB_ENV echo "PYTEST_SENTRY_TRACES_SAMPLE_RATE=0" >> $GITHUB_ENV # This records failures on master to sentry in order to detect flakey tests, as it's # expected that people have failing tests on their PRs if [ "$GITHUB_REF" = "refs/heads/master" ]; then echo "PYTEST_SENTRY_ALWAYS_REPORT=1" >> $GITHUB_ENV fi fi # Configure a different release version, otherwise it defaults to the # commit sha which will conflict with our actual prod releases. This is a # confusing experience because it looks like these are "empty" releases # because no commits are attached and associates the release with our # javascript + sentry projects. echo "SENTRY_RELEASE=ci@$GITHUB_SHA" >> $GITHUB_ENV # this handles pytest test sharding if [ "$MATRIX_INSTANCE" ]; then if ! [ "${MATRIX_INSTANCE_TOTAL:-}" ]; then echo "MATRIX_INSTANCE_TOTAL is required." exit 1 fi echo "TEST_GROUP=$MATRIX_INSTANCE" >> $GITHUB_ENV echo "TOTAL_TEST_GROUPS=$MATRIX_INSTANCE_TOTAL" >> $GITHUB_ENV fi - uses: getsentry/action-setup-venv@9e3bbae3836b1b6f129955bf55a19e1d99a61c67 # v1.0.5 with: python-version: ${{ inputs.python-version }} cache-dependency-path: ${{ inputs.workdir }}/requirements-dev-frozen.txt install-cmd: pip install -r ${{ inputs.workdir }}/requirements-dev-frozen.txt - name: Set up outputs id: config env: MATRIX_INSTANCE: ${{ matrix.instance }} shell: bash --noprofile --norc -eo pipefail -ux {0} run: | echo "yarn-cache-dir=$(yarn cache dir)" >> "$GITHUB_OUTPUT" echo "matrix-instance-number=$(($MATRIX_INSTANCE+1))" >> "$GITHUB_OUTPUT" echo "matrix-instance-total=$((${MATRIX_INSTANCE_TOTAL:-}))" >> "$GITHUB_OUTPUT" echo "acceptance-dir=.artifacts/visual-snapshots/acceptance" >> "$GITHUB_OUTPUT" - name: Install python dependencies shell: bash --noprofile --norc -eo pipefail -ux {0} env: # This is necessary when other repositories (e.g. relay) want to take advantage of this workflow # without needing to fork it. The path needed is the one where setup.py is located WORKDIR: ${{ inputs.workdir }} run: | cd "$WORKDIR" # We need to install editable otherwise things like check migration will fail. SENTRY_LIGHT_BUILD=1 pip install --no-deps -e . - name: Start devservices shell: bash --noprofile --norc -eo pipefail -ux {0} env: NEED_KAFKA: ${{ inputs.kafka }} NEED_SNUBA: ${{ inputs.snuba }} NEED_CLICKHOUSE: ${{ inputs.clickhouse }} NEED_BIGTABLE: ${{ inputs.bigtable }} NEED_CHARTCUTERIE: ${{ inputs.chartcuterie }} WORKDIR: ${{ inputs.workdir }} PG_VERSION: ${{ inputs.pg-version }} ENABLE_AUTORUN_MIGRATION_SEARCH_ISSUES: '1' run: | sentry init # redis, postgres are needed for almost every code path. services='redis postgres' if [ "$NEED_CLICKHOUSE" = "true" ] || [ "$NEED_SNUBA" = "true" ]; then services="${services} clickhouse" fi if [ "$NEED_SNUBA" = "true" ]; then services="${services} snuba" fi if [ "$NEED_BIGTABLE" = "true" ]; then echo "BIGTABLE_EMULATOR_HOST=127.0.0.1:8086" >> $GITHUB_ENV services="${services} bigtable" fi if [ "$NEED_CHARTCUTERIE" = "true" ]; then services="${services} chartcuterie" fi sentry devservices up $services & # TODO: Use devservices kafka. See https://github.com/getsentry/sentry/pull/20986#issuecomment-704510570 if [ "$NEED_KAFKA" = "true" ]; then # This is *not* the production version. Unclear reason as to why this was chosen # https://github.com/getsentry/ops/blob/c823e62f930ecc6c97bb08898c71e49edc7232f6/cookbooks/getsentry/attributes/default.rb#L631 docker run \ --name sentry_zookeeper \ -d --network host \ -e ZOOKEEPER_CLIENT_PORT=2181 \ confluentinc/cp-zookeeper:4.1.0 \ & # This is the production version; do not change w/o changing it there as well # https://github.com/getsentry/ops/blob/c823e62f930ecc6c97bb08898c71e49edc7232f6/cookbooks/getsentry/attributes/default.rb#L643 docker run \ --name sentry_kafka \ -d --network host \ -e KAFKA_ZOOKEEPER_CONNECT=127.0.0.1:2181 \ -e KAFKA_LISTENERS=INTERNAL://0.0.0.0:9093,EXTERNAL://0.0.0.0:9092 \ -e KAFKA_ADVERTISED_LISTENERS=INTERNAL://127.0.0.1:9093,EXTERNAL://127.0.0.1:9092 \ -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT \ -e KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL \ -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \ confluentinc/cp-kafka:5.1.2 \ & fi wait docker ps -a # This is necessary when other repositories (e.g. relay) want to take advantage of this workflow # without needing to fork it. The path needed is the one where tools are located cd "$WORKDIR" python3 -u -S -m tools.devservices_healthcheck cd -