-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
testing(devservices): Run docker compose for backend/acceptance tests (…
…#78568) Merging this will help us understand if docker compose is reliable enough to use in CI. I have this scheduled to run every 30 minutes, and we can run this for a few days before reverting this PR. Backend and acceptance tests are passing using docker compose to bring up required services. Acceptance: https://github.com/getsentry/sentry/actions/runs/11225594164/job/31204963522?pr=78568 Backend: https://github.com/getsentry/sentry/actions/runs/11225594182/job/31205507375?pr=78568
- Loading branch information
1 parent
89bf646
commit 5ddca5d
Showing
6 changed files
with
815 additions
and
0 deletions.
There are no files selected for viewing
119 changes: 119 additions & 0 deletions
119
.github/actions/test-setup-sentry-devservices/action.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
# 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: '.' | ||
|
||
outputs: | ||
yarn-cache-dir: | ||
description: 'Path to yarn cache' | ||
value: ${{ steps.config.outputs.yarn-cache-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 | ||
### pytest configuration ### | ||
echo "PY_COLORS=1" >> "$GITHUB_ENV" | ||
echo "PYTEST_ADDOPTS=--reruns=5 --durations=10 --fail-slow=60s" >> $GITHUB_ENV | ||
echo "COVERAGE_CORE=sysmon" >> "$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@a133e6fd5fa6abd3f590a1c106abda344f5df69f # v2.1.0 | ||
with: | ||
python-version: ${{ inputs.python-version }} | ||
cache-dependency-path: ${{ inputs.workdir }}/requirements-dev-frozen.txt | ||
install-cmd: cd ${{ inputs.workdir }} && python3 -m tools.hack_pip && pip install -r 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" | ||
- 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. | ||
python3 -m tools.fast_editable --path . | ||
- name: Start devservices | ||
shell: bash --noprofile --norc -eo pipefail -ux {0} | ||
env: | ||
WORKDIR: ${{ inputs.workdir }} | ||
ENABLE_AUTORUN_MIGRATION_SEARCH_ISSUES: '1' | ||
run: | | ||
sentry init | ||
# have tests listen on the docker gateway ip so loopback can occur | ||
echo "DJANGO_LIVE_TEST_SERVER_ADDRESS=$(docker network inspect bridge --format='{{(index .IPAM.Config 0).Gateway}}')" >> "$GITHUB_ENV" | ||
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" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
# Also note that this name *MUST* match the filename because GHA | ||
# only provides the workflow name (https://docs.github.com/en/free-pro-team@latest/actions/reference/environment-variables#default-environment-variables) | ||
# and GH APIs only support querying by workflow *FILENAME* (https://developer.github.com/v3/actions/workflows/#get-a-workflow) | ||
name: docker-compose-acceptance | ||
on: | ||
schedule: | ||
- cron: '30,0 * * * *' | ||
|
||
# Cancel in progress workflows on pull_requests. | ||
# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value | ||
concurrency: | ||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | ||
cancel-in-progress: true | ||
|
||
# hack for https://github.com/actions/cache/issues/810#issuecomment-1222550359 | ||
env: | ||
SEGMENT_DOWNLOAD_TIMEOUT_MINS: 3 | ||
NODE_OPTIONS: '--max-old-space-size=4096' | ||
|
||
jobs: | ||
docker-compose-acceptance: | ||
name: docker-compose-acceptance | ||
runs-on: ubuntu-22.04 | ||
timeout-minutes: 30 | ||
permissions: | ||
contents: read | ||
id-token: write | ||
strategy: | ||
# This helps not having to run multiple jobs because one fails, thus, reducing resource usage | ||
# and reducing the risk that one of many runs would turn red again (read: intermittent tests) | ||
fail-fast: false | ||
matrix: | ||
# XXX: When updating this, make sure you also update MATRIX_INSTANCE_TOTAL. | ||
instance: [0, 1, 2, 3, 4] | ||
pg-version: ['14'] | ||
env: | ||
# XXX: MATRIX_INSTANCE_TOTAL must be hardcoded to the length of strategy.matrix.instance. | ||
MATRIX_INSTANCE_TOTAL: 5 | ||
TEST_GROUP_STRATEGY: roundrobin | ||
|
||
steps: | ||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||
name: Checkout sentry | ||
|
||
- uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4 | ||
id: setup-node | ||
with: | ||
node-version-file: '.volta.json' | ||
|
||
- name: Step configurations | ||
id: config | ||
run: | | ||
echo "webpack-path=.webpack_cache" >> "$GITHUB_OUTPUT" | ||
echo "WEBPACK_CACHE_PATH=.webpack_cache" >> "$GITHUB_ENV" | ||
- name: webpack cache | ||
uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 | ||
with: | ||
path: ${{ steps.config.outputs.webpack-path }} | ||
key: ${{ runner.os }}-v2-webpack-cache-${{ hashFiles('webpack.config.ts') }} | ||
|
||
- name: node_modules cache | ||
uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 | ||
id: nodemodulescache | ||
with: | ||
path: node_modules | ||
key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock', 'api-docs/yarn.lock', '.volta.json') }} | ||
|
||
- name: Install Javascript Dependencies | ||
if: steps.nodemodulescache.outputs.cache-hit != 'true' | ||
run: yarn install --frozen-lockfile | ||
|
||
- name: webpack | ||
env: | ||
# this is fine to not have for forks, it shouldn't fail | ||
SENTRY_WEBPACK_WEBHOOK_SECRET: ${{ secrets.SENTRY_WEBPACK_WEBHOOK_SECRET }} | ||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | ||
# should set value either as `true` or `false` | ||
CODECOV_ENABLE_BA: true | ||
GH_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} | ||
run: | | ||
yarn build-acceptance | ||
- name: Build chartcuterie configuration module | ||
run: | | ||
make build-chartcuterie-config | ||
- name: Setup sentry env | ||
uses: ./.github/actions/test-setup-sentry-devservices | ||
id: setup | ||
|
||
- name: copy chartcuterie config to devservices chartcuterie directory | ||
run: | | ||
ls config/chartcuterie | ||
cp -r config/chartcuterie devservices | ||
- name: Bring up devservices | ||
run: | | ||
docker network create sentry | ||
docker compose -f devservices/docker-compose-testing.yml up -d redis postgres snuba clickhouse chartcuterie | ||
- name: Run acceptance tests (#${{ steps.setup.outputs.matrix-instance-number }} of ${{ steps.setup.outputs.matrix-instance-total }}) | ||
run: make run-acceptance | ||
|
||
- name: Collect test data | ||
uses: ./.github/actions/collect-test-data | ||
if: ${{ !cancelled() }} | ||
with: | ||
artifact_path: .artifacts/pytest.acceptance.json | ||
gcs_bucket: ${{ secrets.COLLECT_TEST_DATA_GCS_BUCKET }} | ||
gcp_project_id: ${{ secrets.COLLECT_TEST_DATA_GCP_PROJECT_ID }} | ||
workload_identity_provider: ${{ secrets.SENTRY_GCP_DEV_WORKLOAD_IDENTITY_POOL }} | ||
service_account_email: ${{ secrets.COLLECT_TEST_DATA_SERVICE_ACCOUNT_EMAIL }} | ||
matrix_instance_number: ${{ steps.setup.outputs.matrix-instance-number }} | ||
|
||
# This job runs when FE or BE changes happen, however, we only upload coverage data for | ||
# BE changes since it conflicts with codecov's carry forward functionality | ||
# Upload coverage data even if running the tests step fails since | ||
# it reduces large coverage fluctuations | ||
- name: Handle artifacts | ||
uses: ./.github/actions/artifacts | ||
if: ${{ always() }} | ||
with: | ||
token: ${{ secrets.CODECOV_TOKEN }} | ||
commit_sha: ${{ github.event.pull_request.head.sha }} | ||
|
||
docker-compose-acceptance-required-checks: | ||
# this is a required check so we need this job to always run and report a status. | ||
if: always() | ||
name: Acceptance | ||
needs: [docker-compose-acceptance] | ||
runs-on: ubuntu-22.04 | ||
timeout-minutes: 3 | ||
steps: | ||
- name: Check for failures | ||
if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') | ||
run: | | ||
echo "One of the dependent jobs have failed. You may need to re-run it." && exit 1 |
Oops, something went wrong.