mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-18 05:30:37 +00:00
Previously, Postgres was built in 'tmp_install/build', and installed into 'tmp_install'. In the CI, the 'build' directory was included in the final neon.tar.zst artifact that includes all the necessary binaries. That was unnecessary, the intermediate build results are not needed, only the final binaries. Separate the build directory so that the Postgres build happens in 'build', and it is installed into 'tmp_install'. That makes the final neon.tar.zst artifact smaller. The changes to the python tests are needed to find the 'pg_regress' binary in the installation directory. Previously, they would use the 'pg_regress' binary from the build directory, not the final installation location.
147 lines
5.1 KiB
YAML
147 lines
5.1 KiB
YAML
name: 'Run python test'
|
|
description: 'Runs a Neon python test set, performing all the required preparations before'
|
|
|
|
inputs:
|
|
build_type:
|
|
description: 'Type of Rust (neon) and C (postgres) builds. Must be "release" or "debug".'
|
|
required: true
|
|
rust_toolchain:
|
|
description: 'Rust toolchain version to fetch the caches'
|
|
required: true
|
|
test_selection:
|
|
description: 'A python test suite to run'
|
|
required: true
|
|
extra_params:
|
|
description: 'Arbitrary parameters to pytest. For example "-s" to prevent capturing stdout/stderr'
|
|
required: false
|
|
default: ''
|
|
needs_postgres_source:
|
|
description: 'Set to true if the test suite requires postgres source checked out'
|
|
required: false
|
|
default: 'false'
|
|
run_in_parallel:
|
|
description: 'Whether to run tests in parallel'
|
|
required: false
|
|
default: 'true'
|
|
save_perf_report:
|
|
description: 'Whether to upload the performance report'
|
|
required: false
|
|
default: 'false'
|
|
|
|
runs:
|
|
using: "composite"
|
|
steps:
|
|
- name: Checkout
|
|
if: inputs.needs_postgres_source == 'true'
|
|
uses: actions/checkout@v3
|
|
with:
|
|
submodules: true
|
|
fetch-depth: 1
|
|
|
|
- name: Get Neon artifact for restoration
|
|
uses: actions/download-artifact@v3
|
|
with:
|
|
name: neon-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.rust_toolchain }}-artifact
|
|
path: ./neon-artifact/
|
|
|
|
- name: Extract Neon artifact
|
|
shell: bash -ex {0}
|
|
run: |
|
|
mkdir -p /tmp/neon/
|
|
tar -xf ./neon-artifact/neon.tar.zst -C /tmp/neon/
|
|
rm -rf ./neon-artifact/
|
|
|
|
# Restore the parts of the 'build' directory that were included in the
|
|
# tarball. This includes the regression test modules in
|
|
# src/test/regress/*.so.
|
|
mkdir -p build/
|
|
cp -a /tmp/neon/pg_build/* build/
|
|
|
|
- name: Cache poetry deps
|
|
id: cache_poetry
|
|
uses: actions/cache@v3
|
|
with:
|
|
path: ~/.cache/pypoetry/virtualenvs
|
|
key: v1-${{ runner.os }}-python-deps-${{ hashFiles('poetry.lock') }}
|
|
|
|
- name: Install Python deps
|
|
shell: bash -ex {0}
|
|
run: ./scripts/pysync
|
|
|
|
- name: Run pytest
|
|
env:
|
|
NEON_BIN: /tmp/neon/bin
|
|
POSTGRES_DISTRIB_DIR: /tmp/neon/pg_install
|
|
TEST_OUTPUT: /tmp/test_output
|
|
# this variable will be embedded in perf test report
|
|
# and is needed to distinguish different environments
|
|
PLATFORM: github-actions-selfhosted
|
|
shell: bash -ex {0}
|
|
run: |
|
|
PERF_REPORT_DIR="$(realpath test_runner/perf-report-local)"
|
|
rm -rf $PERF_REPORT_DIR
|
|
|
|
TEST_SELECTION="test_runner/${{ inputs.test_selection }}"
|
|
EXTRA_PARAMS="${{ inputs.extra_params }}"
|
|
if [ -z "$TEST_SELECTION" ]; then
|
|
echo "test_selection must be set"
|
|
exit 1
|
|
fi
|
|
if [[ "${{ inputs.run_in_parallel }}" == "true" ]]; then
|
|
EXTRA_PARAMS="-n4 $EXTRA_PARAMS"
|
|
fi
|
|
if [[ "${{ inputs.save_perf_report }}" == "true" ]]; then
|
|
if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then
|
|
mkdir -p "$PERF_REPORT_DIR"
|
|
EXTRA_PARAMS="--out-dir $PERF_REPORT_DIR $EXTRA_PARAMS"
|
|
fi
|
|
fi
|
|
|
|
if [[ "${{ inputs.build_type }}" == "debug" ]]; then
|
|
cov_prefix=(scripts/coverage "--profraw-prefix=$GITHUB_JOB" --dir=/tmp/coverage run)
|
|
elif [[ "${{ inputs.build_type }}" == "release" ]]; then
|
|
cov_prefix=()
|
|
fi
|
|
|
|
# Run the tests.
|
|
#
|
|
# The junit.xml file allows CircleCI to display more fine-grained test information
|
|
# in its "Tests" tab in the results page.
|
|
# --verbose prints name of each test (helpful when there are
|
|
# multiple tests in one file)
|
|
# -rA prints summary in the end
|
|
# -n4 uses four processes to run tests via pytest-xdist
|
|
# -s is not used to prevent pytest from capturing output, because tests are running
|
|
# in parallel and logs are mixed between different tests
|
|
"${cov_prefix[@]}" ./scripts/pytest \
|
|
--junitxml=$TEST_OUTPUT/junit.xml \
|
|
--tb=short \
|
|
--verbose \
|
|
-m "not remote_cluster" \
|
|
-rA $TEST_SELECTION $EXTRA_PARAMS
|
|
|
|
if [[ "${{ inputs.save_perf_report }}" == "true" ]]; then
|
|
if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then
|
|
export REPORT_FROM="$PERF_REPORT_DIR"
|
|
export REPORT_TO=local
|
|
scripts/generate_and_push_perf_report.sh
|
|
fi
|
|
fi
|
|
|
|
- name: Delete all data but logs
|
|
shell: bash -ex {0}
|
|
if: always()
|
|
run: |
|
|
du -sh /tmp/test_output/*
|
|
find /tmp/test_output -type f ! -name "*.log" ! -name "regression.diffs" ! -name "junit.xml" ! -name "*.filediff" ! -name "*.stdout" ! -name "*.stderr" ! -name "flamegraph.svg" ! -name "*.metrics" -delete
|
|
du -sh /tmp/test_output/*
|
|
|
|
- name: Upload python test logs
|
|
if: always()
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
retention-days: 7
|
|
if-no-files-found: error
|
|
name: python-test-${{ inputs.test_selection }}-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.rust_toolchain }}-logs
|
|
path: /tmp/test_output/
|