Tests #32791
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
name: Tests | |
on: | |
push: | |
branches: | |
- master | |
- ci | |
- "release/*" | |
pull_request: | |
branches: | |
- '**' | |
schedule: | |
- cron: "0 */3 * * *" | |
jobs: | |
build: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
submodules: false | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 50 | |
submodules: true | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
id: setup-python | |
with: | |
python-version: '3.12.2' | |
cache: 'pip' | |
cache-dependency-path: | | |
pyproject.toml | |
# The below is technically a lie as we are technically not | |
# inside a virtual env, but there is really no reason to bother | |
# actually creating and activating one as below works just fine. | |
- name: Export $VIRTUAL_ENV | |
run: | | |
venv="$(python -c 'import sys; sys.stdout.write(sys.prefix)')" | |
echo "VIRTUAL_ENV=${venv}" >> $GITHUB_ENV | |
- name: Set up uv cache | |
uses: actions/cache@v4 | |
with: | |
path: ~/.cache/uv | |
key: uv-cache-${{ runner.os }}-py-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('pyproject.toml') }} | |
- name: Cached requirements.txt | |
uses: actions/cache@v4 | |
id: requirements-cache | |
with: | |
path: requirements.txt | |
key: edb-requirements-${{ hashFiles('pyproject.toml') }} | |
- name: Compute requirements.txt | |
if: steps.requirements-cache.outputs.cache-hit != 'true' | |
run: | | |
python -m pip install pip-tools | |
pip-compile --no-strip-extras --all-build-deps \ | |
--extra test,language-server \ | |
--output-file requirements.txt pyproject.toml | |
- name: Install Python dependencies | |
run: | | |
python -c "import sys; print(sys.prefix)" | |
python -m pip install uv~=0.1.0 && uv pip install -U -r requirements.txt | |
- name: Compute cache keys and download the running times log | |
env: | |
GIST_TOKEN: ${{ secrets.CI_BOT_GIST_TOKEN }} | |
run: | | |
mkdir -p shared-artifacts | |
if [ "$(uname)" = "Darwin" ]; then | |
find /usr/lib -type f -name 'lib*' -exec stat -f '%N %z' {} + | sort | shasum -a 256 | cut -d ' ' -f1 > shared-artifacts/lib_cache_key.txt | |
else | |
find /usr/lib -type f -name 'lib*' -printf '%P %s\n' | sort | sha256sum | cut -d ' ' -f1 > shared-artifacts/lib_cache_key.txt | |
fi | |
python setup.py -q ci_helper --type cli > shared-artifacts/edgedbcli_git_rev.txt | |
python setup.py -q ci_helper --type rust >shared-artifacts/rust_cache_key.txt | |
python setup.py -q ci_helper --type ext >shared-artifacts/ext_cache_key.txt | |
python setup.py -q ci_helper --type parsers >shared-artifacts/parsers_cache_key.txt | |
python setup.py -q ci_helper --type postgres >shared-artifacts/postgres_git_rev.txt | |
python setup.py -q ci_helper --type libpg_query >shared-artifacts/libpg_query_git_rev.txt | |
echo 'f8cd94309eaccbfba5dea7835b88c78377608a37' >shared-artifacts/stolon_git_rev.txt | |
python setup.py -q ci_helper --type bootstrap >shared-artifacts/bootstrap_cache_key.txt | |
echo EDGEDBCLI_GIT_REV=$(cat shared-artifacts/edgedbcli_git_rev.txt) >> $GITHUB_ENV | |
echo POSTGRES_GIT_REV=$(cat shared-artifacts/postgres_git_rev.txt) >> $GITHUB_ENV | |
echo LIBPG_QUERY_GIT_REV=$(cat shared-artifacts/libpg_query_git_rev.txt) >> $GITHUB_ENV | |
echo STOLON_GIT_REV=$(cat shared-artifacts/stolon_git_rev.txt) >> $GITHUB_ENV | |
echo BUILD_LIB=$(python setup.py -q ci_helper --type build_lib) >> $GITHUB_ENV | |
echo BUILD_TEMP=$(python setup.py -q ci_helper --type build_temp) >> $GITHUB_ENV | |
curl \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
-u edgedb-ci:$GIST_TOKEN \ | |
https://api.github.com/gists/8b722a65397f7c4c0df72f5394efa04c \ | |
| jq '.files."time_stats.csv".raw_url' \ | |
| xargs curl > shared-artifacts/time_stats.csv | |
- name: Upload shared artifacts | |
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 | |
with: | |
name: shared-artifacts | |
path: shared-artifacts | |
retention-days: 1 | |
# Restore binary cache | |
- name: Handle cached EdgeDB CLI binaries | |
uses: actions/cache@v4 | |
id: cli-cache | |
with: | |
path: build/cli | |
key: edb-cli-v4-${{ env.EDGEDBCLI_GIT_REV }} | |
- name: Handle cached Rust extensions | |
uses: actions/cache@v4 | |
id: rust-cache | |
with: | |
path: build/rust_extensions | |
key: edb-rust-v4-${{ hashFiles('shared-artifacts/rust_cache_key.txt') }} | |
restore-keys: | | |
edb-rust-v4- | |
- name: Handle cached Cython extensions | |
uses: actions/cache@v4 | |
id: ext-cache | |
with: | |
path: build/extensions | |
key: edb-ext-v6-${{ hashFiles('shared-artifacts/ext_cache_key.txt') }} | |
- name: Handle cached PostgreSQL build | |
uses: actions/cache@v4 | |
id: postgres-cache | |
with: | |
path: build/postgres/install | |
key: edb-postgres-v3-${{ env.POSTGRES_GIT_REV }}-${{ hashFiles('shared-artifacts/lib_cache_key.txt') }} | |
- name: Handle cached Stolon build | |
uses: actions/cache@v4 | |
id: stolon-cache | |
with: | |
path: build/stolon/bin | |
key: edb-stolon-v2-${{ env.STOLON_GIT_REV }} | |
- name: Handle cached libpg_query build | |
uses: actions/cache@v4 | |
id: libpg-query-cache | |
with: | |
path: edb/pgsql/parser/libpg_query/libpg_query.a | |
key: edb-libpg_query-v1-${{ env.LIBPG_QUERY_GIT_REV }} | |
# Install system dependencies for building | |
- name: Install system deps | |
if: | | |
steps.cli-cache.outputs.cache-hit != 'true' || | |
steps.rust-cache.outputs.cache-hit != 'true' || | |
steps.ext-cache.outputs.cache-hit != 'true' || | |
steps.stolon-cache.outputs.cache-hit != 'true' || | |
steps.postgres-cache.outputs.cache-hit != 'true' | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y uuid-dev libreadline-dev bison flex libprotobuf-c-dev | |
- name: Install Rust toolchain | |
if: | | |
steps.cli-cache.outputs.cache-hit != 'true' || | |
steps.rust-cache.outputs.cache-hit != 'true' | |
uses: dsherret/rust-toolchain-file@v1 | |
# Build EdgeDB CLI | |
- name: Handle EdgeDB CLI build cache | |
uses: actions/cache@v4 | |
if: steps.cli-cache.outputs.cache-hit != 'true' | |
with: | |
path: ${{ env.BUILD_TEMP }}/rust/cli | |
key: edb-cli-build-v7-${{ env.EDGEDBCLI_GIT_REV }} | |
restore-keys: | | |
edb-cli-build-v7- | |
- name: Build EdgeDB CLI | |
env: | |
CARGO_HOME: ${{ env.BUILD_TEMP }}/rust/cli/cargo_home | |
CACHE_HIT: ${{ steps.cli-cache.outputs.cache-hit }} | |
run: | | |
if [[ "$CACHE_HIT" == "true" ]]; then | |
cp -v build/cli/bin/edgedb edb/cli/edgedb | |
else | |
python setup.py -v build_cli | |
fi | |
# Build Rust extensions | |
- name: Handle Rust extensions build cache | |
uses: actions/cache@v4 | |
if: steps.rust-cache.outputs.cache-hit != 'true' | |
with: | |
path: ${{ env.BUILD_TEMP }}/rust/extensions | |
key: edb-rust-build-v1-${{ hashFiles('shared-artifacts/rust_cache_key.txt') }} | |
restore-keys: | | |
edb-rust-build-v1- | |
- name: Build Rust extensions | |
env: | |
CARGO_HOME: ${{ env.BUILD_TEMP }}/rust/extensions/cargo_home | |
CACHE_HIT: ${{ steps.rust-cache.outputs.cache-hit }} | |
run: | | |
if [[ "$CACHE_HIT" != "true" ]]; then | |
rm -rf ${BUILD_LIB} | |
mkdir -p build/rust_extensions | |
rsync -av ./build/rust_extensions/ ${BUILD_LIB}/ | |
python setup.py -v build_rust | |
rsync -av ${BUILD_LIB}/ build/rust_extensions/ | |
rm -rf ${BUILD_LIB} | |
fi | |
rsync -av ./build/rust_extensions/edb/ ./edb/ | |
# Build libpg_query | |
- name: Build libpg_query | |
if: | | |
steps.libpg-query-cache.outputs.cache-hit != 'true' && | |
steps.ext-cache.outputs.cache-hit != 'true' | |
run: | | |
python setup.py build_libpg_query | |
# Build extensions | |
- name: Handle Cython extensions build cache | |
uses: actions/cache@v4 | |
if: steps.ext-cache.outputs.cache-hit != 'true' | |
with: | |
path: ${{ env.BUILD_TEMP }}/edb | |
key: edb-ext-build-v4-${{ hashFiles('shared-artifacts/ext_cache_key.txt') }} | |
- name: Build Cython extensions | |
env: | |
CACHE_HIT: ${{ steps.ext-cache.outputs.cache-hit }} | |
BUILD_EXT_MODE: py-only | |
run: | | |
if [[ "$CACHE_HIT" != "true" ]]; then | |
rm -rf ${BUILD_LIB} | |
mkdir -p ./build/extensions | |
rsync -av ./build/extensions/ ${BUILD_LIB}/ | |
BUILD_EXT_MODE=py-only python setup.py -v build_ext | |
rsync -av ${BUILD_LIB}/ ./build/extensions/ | |
rm -rf ${BUILD_LIB} | |
fi | |
rsync -av ./build/extensions/edb/ ./edb/ | |
# Build parsers | |
- name: Handle compiled parsers cache | |
uses: actions/cache@v4 | |
id: parsers-cache | |
with: | |
path: build/lib | |
key: edb-parsers-v3-${{ hashFiles('shared-artifacts/parsers_cache_key.txt') }} | |
restore-keys: | | |
edb-parsers-v3- | |
- name: Build parsers | |
env: | |
CACHE_HIT: ${{ steps.parsers-cache.outputs.cache-hit }} | |
run: | | |
if [[ "$CACHE_HIT" != "true" ]]; then | |
rm -rf ${BUILD_LIB} | |
mkdir -p ./build/lib | |
rsync -av ./build/lib/ ${BUILD_LIB}/ | |
python setup.py -v build_parsers | |
rsync -av ${BUILD_LIB}/ ./build/lib/ | |
rm -rf ${BUILD_LIB} | |
fi | |
rsync -av ./build/lib/edb/ ./edb/ | |
# Build PostgreSQL | |
- name: Build PostgreSQL | |
env: | |
CACHE_HIT: ${{ steps.postgres-cache.outputs.cache-hit }} | |
run: | | |
if [[ "$CACHE_HIT" == "true" ]]; then | |
cp build/postgres/install/stamp build/postgres/ | |
else | |
python setup.py build_postgres | |
cp build/postgres/stamp build/postgres/install/ | |
fi | |
# Build Stolon | |
- name: Set up Go | |
if: steps.stolon-cache.outputs.cache-hit != 'true' | |
uses: actions/setup-go@v2 | |
with: | |
go-version: 1.16 | |
- uses: actions/checkout@v4 | |
if: steps.stolon-cache.outputs.cache-hit != 'true' | |
with: | |
repository: edgedb/stolon | |
path: build/stolon | |
ref: ${{ env.STOLON_GIT_REV }} | |
fetch-depth: 0 | |
submodules: false | |
- name: Build Stolon | |
if: steps.stolon-cache.outputs.cache-hit != 'true' | |
run: | | |
mkdir -p build/stolon/bin/ | |
curl -fsSL https://releases.hashicorp.com/consul/1.10.1/consul_1.10.1_linux_amd64.zip | zcat > build/stolon/bin/consul | |
chmod +x build/stolon/bin/consul | |
cd build/stolon && make | |
# Install edgedb-server and populate egg-info | |
- name: Install edgedb-server | |
env: | |
BUILD_EXT_MODE: skip | |
run: | | |
# --no-build-isolation because we have explicitly installed all deps | |
# and don't want them to be reinstalled in an "isolated env". | |
pip install --no-build-isolation --no-deps -e .[test,docs] | |
# Refresh the bootstrap cache | |
- name: Handle bootstrap cache | |
uses: actions/cache@v4 | |
id: bootstrap-cache | |
with: | |
path: build/cache | |
key: edb-bootstrap-v2-${{ hashFiles('shared-artifacts/bootstrap_cache_key.txt') }} | |
restore-keys: | | |
edb-bootstrap-v2- | |
- name: Bootstrap EdgeDB Server | |
if: steps.bootstrap-cache.outputs.cache-hit != 'true' | |
run: | | |
edb server --bootstrap-only | |
cargo-test: | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
submodules: false | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 50 | |
submodules: true | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
id: setup-python | |
with: | |
python-version: '3.12.2' | |
cache: 'pip' | |
cache-dependency-path: | | |
pyproject.toml | |
# The below is technically a lie as we are technically not | |
# inside a virtual env, but there is really no reason to bother | |
# actually creating and activating one as below works just fine. | |
- name: Export $VIRTUAL_ENV | |
run: | | |
venv="$(python -c 'import sys; sys.stdout.write(sys.prefix)')" | |
echo "VIRTUAL_ENV=${venv}" >> $GITHUB_ENV | |
- name: Set up uv cache | |
uses: actions/cache@v4 | |
with: | |
path: ~/.cache/uv | |
key: uv-cache-${{ runner.os }}-py-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('pyproject.toml') }} | |
- name: Download requirements.txt | |
uses: actions/cache@v4 | |
with: | |
path: requirements.txt | |
key: edb-requirements-${{ hashFiles('pyproject.toml') }} | |
- name: Install Python dependencies | |
run: python -m pip install uv~=0.1.0 && uv pip install -U -r requirements.txt | |
- name: Download cache key | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: shared-artifacts | |
path: shared-artifacts | |
- name: Generate environment variables | |
run: | | |
echo BUILD_TEMP=$(python setup.py -q ci_helper --type build_temp) >> $GITHUB_ENV | |
- name: Handle Rust extensions build cache | |
uses: actions/cache@v4 | |
id: rust-cache | |
with: | |
path: ${{ env.BUILD_TEMP }}/rust/extensions | |
key: edb-rust-build-v1-${{ hashFiles('shared-artifacts/rust_cache_key.txt') }} | |
- name: Install Rust toolchain | |
uses: dsherret/rust-toolchain-file@v1 | |
- name: Cargo test | |
env: | |
CARGO_TARGET_DIR: ${{ env.BUILD_TEMP }}/rust/extensions | |
CARGO_HOME: ${{ env.BUILD_TEMP }}/rust/extensions/cargo_home | |
run: | |
cargo test --all-features | |
python-test: | |
needs: build | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
matrix: | |
shard: [ | |
1, 2, 3, 4, | |
5, 6, 7, 8, | |
9, 10, 11, 12, | |
13, 14, 15, 16, | |
] | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
submodules: false | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 50 | |
submodules: true | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
id: setup-python | |
with: | |
python-version: '3.12.2' | |
cache: 'pip' | |
cache-dependency-path: | | |
pyproject.toml | |
# The below is technically a lie as we are technically not | |
# inside a virtual env, but there is really no reason to bother | |
# actually creating and activating one as below works just fine. | |
- name: Export $VIRTUAL_ENV | |
run: | | |
venv="$(python -c 'import sys; sys.stdout.write(sys.prefix)')" | |
echo "VIRTUAL_ENV=${venv}" >> $GITHUB_ENV | |
- name: Set up uv cache | |
uses: actions/cache@v4 | |
with: | |
path: ~/.cache/uv | |
key: uv-cache-${{ runner.os }}-py-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('pyproject.toml') }} | |
- name: Download requirements.txt | |
uses: actions/cache@v4 | |
with: | |
path: requirements.txt | |
key: edb-requirements-${{ hashFiles('pyproject.toml') }} | |
- name: Install Python dependencies | |
run: python -m pip install uv~=0.1.0 && uv pip install -U -r requirements.txt | |
# Restore the artifacts and environment variables | |
- name: Download shared artifacts | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: shared-artifacts | |
path: shared-artifacts | |
- name: Set environment variables | |
run: | | |
echo EDGEDBCLI_GIT_REV=$(cat shared-artifacts/edgedbcli_git_rev.txt) >> $GITHUB_ENV | |
echo POSTGRES_GIT_REV=$(cat shared-artifacts/postgres_git_rev.txt) >> $GITHUB_ENV | |
echo STOLON_GIT_REV=$(cat shared-artifacts/stolon_git_rev.txt) >> $GITHUB_ENV | |
echo BUILD_LIB=$(python setup.py -q ci_helper --type build_lib) >> $GITHUB_ENV | |
echo BUILD_TEMP=$(python setup.py -q ci_helper --type build_temp) >> $GITHUB_ENV | |
# Restore build cache | |
- name: Restore cached EdgeDB CLI binaries | |
uses: actions/cache@v4 | |
id: cli-cache | |
with: | |
path: build/cli | |
key: edb-cli-v4-${{ env.EDGEDBCLI_GIT_REV }} | |
- name: Restore cached Rust extensions | |
uses: actions/cache@v4 | |
id: rust-cache | |
with: | |
path: build/rust_extensions | |
key: edb-rust-v4-${{ hashFiles('shared-artifacts/rust_cache_key.txt') }} | |
- name: Restore cached Cython extensions | |
uses: actions/cache@v4 | |
id: ext-cache | |
with: | |
path: build/extensions | |
key: edb-ext-v6-${{ hashFiles('shared-artifacts/ext_cache_key.txt') }} | |
- name: Restore compiled parsers cache | |
uses: actions/cache@v4 | |
id: parsers-cache | |
with: | |
path: build/lib | |
key: edb-parsers-v3-${{ hashFiles('shared-artifacts/parsers_cache_key.txt') }} | |
- name: Restore cached PostgreSQL build | |
uses: actions/cache@v4 | |
id: postgres-cache | |
with: | |
path: build/postgres/install | |
key: edb-postgres-v3-${{ env.POSTGRES_GIT_REV }}-${{ hashFiles('shared-artifacts/lib_cache_key.txt') }} | |
- name: Restore cached Stolon build | |
uses: actions/cache@v4 | |
id: stolon-cache | |
with: | |
path: build/stolon/bin | |
key: edb-stolon-v2-${{ env.STOLON_GIT_REV }} | |
- name: Restore bootstrap cache | |
uses: actions/cache@v4 | |
id: bootstrap-cache | |
with: | |
path: build/cache | |
key: edb-bootstrap-v2-${{ hashFiles('shared-artifacts/bootstrap_cache_key.txt') }} | |
- name: Stop if we cannot retrieve the cache | |
if: | | |
steps.cli-cache.outputs.cache-hit != 'true' || | |
steps.rust-cache.outputs.cache-hit != 'true' || | |
steps.ext-cache.outputs.cache-hit != 'true' || | |
steps.parsers-cache.outputs.cache-hit != 'true' || | |
steps.postgres-cache.outputs.cache-hit != 'true' || | |
steps.stolon-cache.outputs.cache-hit != 'true' || | |
steps.bootstrap-cache.outputs.cache-hit != 'true' | |
run: | | |
echo ::error::Cannot retrieve build cache. | |
exit 1 | |
- name: Validate cached binaries | |
run: | | |
# Validate EdgeDB CLI | |
./build/cli/bin/edgedb --version || exit 1 | |
# Validate Stolon | |
./build/stolon/bin/stolon-sentinel --version || exit 1 | |
./build/stolon/bin/stolon-keeper --version || exit 1 | |
./build/stolon/bin/stolon-proxy --version || exit 1 | |
# Validate PostgreSQL | |
./build/postgres/install/bin/postgres --version || exit 1 | |
./build/postgres/install/bin/pg_config --version || exit 1 | |
- name: Restore cache into the source tree | |
run: | | |
cp -v build/cli/bin/edgedb edb/cli/edgedb | |
cp -v build/cli/bin/edgedb edb/cli/gel | |
rsync -av ./build/rust_extensions/edb/ ./edb/ | |
rsync -av ./build/extensions/edb/ ./edb/ | |
rsync -av ./build/lib/edb/ ./edb/ | |
cp build/postgres/install/stamp build/postgres/ | |
- name: Install edgedb-server | |
env: | |
BUILD_EXT_MODE: skip | |
run: | | |
# --no-build-isolation because we have explicitly installed all deps | |
# and don't want them to be reinstalled in an "isolated env". | |
pip install --no-build-isolation --no-deps -e .[test,docs] | |
# Run the test | |
- name: Install Rust toolchain | |
uses: dsherret/rust-toolchain-file@v1 | |
- name: Test | |
env: | |
SHARD: ${{ matrix.shard }} | |
EDGEDB_TEST_REPEATS: 1 | |
run: | | |
mkdir -p results/ | |
cp shared-artifacts/time_stats.csv results/running_times_${SHARD}.csv | |
edb test --jobs 2 --verbose --shard ${SHARD}/16 \ | |
--running-times-log=results/running_times_${SHARD}.csv \ | |
--result-log=results/result_${SHARD}.json | |
- name: Upload test results | |
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 | |
if: ${{ always() }} | |
with: | |
name: python-test-results-${{ matrix.shard }} | |
path: results | |
retention-days: 1 | |
python-test-list: | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
submodules: false | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 50 | |
submodules: true | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
id: setup-python | |
with: | |
python-version: '3.12.2' | |
cache: 'pip' | |
cache-dependency-path: | | |
pyproject.toml | |
# The below is technically a lie as we are technically not | |
# inside a virtual env, but there is really no reason to bother | |
# actually creating and activating one as below works just fine. | |
- name: Export $VIRTUAL_ENV | |
run: | | |
venv="$(python -c 'import sys; sys.stdout.write(sys.prefix)')" | |
echo "VIRTUAL_ENV=${venv}" >> $GITHUB_ENV | |
- name: Set up uv cache | |
uses: actions/cache@v4 | |
with: | |
path: ~/.cache/uv | |
key: uv-cache-${{ runner.os }}-py-${{ steps.setup-python.outputs.python-version }}-${{ hashFiles('pyproject.toml') }} | |
- name: Download requirements.txt | |
uses: actions/cache@v4 | |
with: | |
path: requirements.txt | |
key: edb-requirements-${{ hashFiles('pyproject.toml') }} | |
- name: Install Python dependencies | |
run: python -m pip install uv~=0.1.0 && uv pip install -U -r requirements.txt | |
# Restore the artifacts and environment variables | |
- name: Download shared artifacts | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: shared-artifacts | |
path: shared-artifacts | |
- name: Set environment variables | |
run: | | |
echo EDGEDBCLI_GIT_REV=$(cat shared-artifacts/edgedbcli_git_rev.txt) >> $GITHUB_ENV | |
echo POSTGRES_GIT_REV=$(cat shared-artifacts/postgres_git_rev.txt) >> $GITHUB_ENV | |
echo STOLON_GIT_REV=$(cat shared-artifacts/stolon_git_rev.txt) >> $GITHUB_ENV | |
echo BUILD_LIB=$(python setup.py -q ci_helper --type build_lib) >> $GITHUB_ENV | |
echo BUILD_TEMP=$(python setup.py -q ci_helper --type build_temp) >> $GITHUB_ENV | |
# Restore build cache | |
- name: Restore cached EdgeDB CLI binaries | |
uses: actions/cache@v4 | |
id: cli-cache | |
with: | |
path: build/cli | |
key: edb-cli-v4-${{ env.EDGEDBCLI_GIT_REV }} | |
- name: Restore cached Rust extensions | |
uses: actions/cache@v4 | |
id: rust-cache | |
with: | |
path: build/rust_extensions | |
key: edb-rust-v4-${{ hashFiles('shared-artifacts/rust_cache_key.txt') }} | |
- name: Restore cached Cython extensions | |
uses: actions/cache@v4 | |
id: ext-cache | |
with: | |
path: build/extensions | |
key: edb-ext-v6-${{ hashFiles('shared-artifacts/ext_cache_key.txt') }} | |
- name: Restore compiled parsers cache | |
uses: actions/cache@v4 | |
id: parsers-cache | |
with: | |
path: build/lib | |
key: edb-parsers-v3-${{ hashFiles('shared-artifacts/parsers_cache_key.txt') }} | |
- name: Restore cached PostgreSQL build | |
uses: actions/cache@v4 | |
id: postgres-cache | |
with: | |
path: build/postgres/install | |
key: edb-postgres-v3-${{ env.POSTGRES_GIT_REV }}-${{ hashFiles('shared-artifacts/lib_cache_key.txt') }} | |
- name: Restore cached Stolon build | |
uses: actions/cache@v4 | |
id: stolon-cache | |
with: | |
path: build/stolon/bin | |
key: edb-stolon-v2-${{ env.STOLON_GIT_REV }} | |
- name: Restore bootstrap cache | |
uses: actions/cache@v4 | |
id: bootstrap-cache | |
with: | |
path: build/cache | |
key: edb-bootstrap-v2-${{ hashFiles('shared-artifacts/bootstrap_cache_key.txt') }} | |
- name: Stop if we cannot retrieve the cache | |
if: | | |
steps.cli-cache.outputs.cache-hit != 'true' || | |
steps.rust-cache.outputs.cache-hit != 'true' || | |
steps.ext-cache.outputs.cache-hit != 'true' || | |
steps.parsers-cache.outputs.cache-hit != 'true' || | |
steps.postgres-cache.outputs.cache-hit != 'true' || | |
steps.stolon-cache.outputs.cache-hit != 'true' || | |
steps.bootstrap-cache.outputs.cache-hit != 'true' | |
run: | | |
echo ::error::Cannot retrieve build cache. | |
exit 1 | |
- name: Validate cached binaries | |
run: | | |
# Validate EdgeDB CLI | |
./build/cli/bin/edgedb --version || exit 1 | |
# Validate Stolon | |
./build/stolon/bin/stolon-sentinel --version || exit 1 | |
./build/stolon/bin/stolon-keeper --version || exit 1 | |
./build/stolon/bin/stolon-proxy --version || exit 1 | |
# Validate PostgreSQL | |
./build/postgres/install/bin/postgres --version || exit 1 | |
./build/postgres/install/bin/pg_config --version || exit 1 | |
- name: Restore cache into the source tree | |
run: | | |
cp -v build/cli/bin/edgedb edb/cli/edgedb | |
cp -v build/cli/bin/edgedb edb/cli/gel | |
rsync -av ./build/rust_extensions/edb/ ./edb/ | |
rsync -av ./build/extensions/edb/ ./edb/ | |
rsync -av ./build/lib/edb/ ./edb/ | |
cp build/postgres/install/stamp build/postgres/ | |
- name: Install edgedb-server | |
env: | |
BUILD_EXT_MODE: skip | |
run: | | |
# --no-build-isolation because we have explicitly installed all deps | |
# and don't want them to be reinstalled in an "isolated env". | |
pip install --no-build-isolation --no-deps -e .[test,docs] | |
# List tests and upload | |
- name: Generate complete list of tests for verification | |
env: | |
SHARD: ${{ matrix.shard }} | |
EDGEDB_TEST_REPEATS: 1 | |
run: | | |
edb test --list > shared-artifacts/all_tests.txt | |
- name: Upload list of tests | |
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 | |
with: | |
name: test-list | |
path: shared-artifacts | |
retention-days: 1 | |
test-conclusion: | |
needs: [cargo-test, python-test, python-test-list] | |
runs-on: ubuntu-latest | |
if: ${{ always() }} | |
steps: | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: '3.12.2' | |
- name: Install Python deps | |
run: | | |
python -m pip install requests click | |
- uses: actions/checkout@v4 | |
with: | |
submodules: false | |
- name: Download python-test results | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
pattern: python-test-results-* | |
merge-multiple: true | |
path: results | |
# Render results and exit if they were unsuccessful | |
- name: Render results | |
run: | | |
python edb/tools/test/results.py 'results/result_*.json' | |
- name: Download shared artifacts | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: shared-artifacts | |
path: shared-artifacts | |
- name: Download test list | |
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
name: test-list | |
path: shared-artifacts | |
- name: Merge stats and verify tests completion | |
shell: python | |
env: | |
GIST_TOKEN: ${{ secrets.CI_BOT_GIST_TOKEN }} | |
GIT_REF: ${{ github.ref }} | |
run: | | |
import csv | |
import glob | |
import io | |
import os | |
import requests | |
orig = {} | |
new = {} | |
all_tests = set() | |
with open("shared-artifacts/time_stats.csv") as f: | |
for name, t, c in csv.reader(f): | |
assert name not in orig, "duplicate test name in original stats!" | |
orig[name] = (t, int(c)) | |
with open("shared-artifacts/all_tests.txt") as f: | |
for line in f: | |
assert line not in all_tests, "duplicate test name in this run!" | |
all_tests.add(line.strip()) | |
for new_file in glob.glob("results/running_times_*.csv"): | |
with open(new_file) as f: | |
for name, t, c in csv.reader(f): | |
if int(c) > orig.get(name, (0, 0))[1]: | |
if name.startswith("setup::"): | |
new[name] = (t, c) | |
else: | |
assert name not in new, f"duplicate test! {name}" | |
new[name] = (t, c) | |
all_tests.remove(name) | |
assert not all_tests, "Tests not run! \n" + "\n".join(all_tests) | |
if os.environ["GIT_REF"] == "refs/heads/master": | |
buf = io.StringIO() | |
writer = csv.writer(buf) | |
orig.update(new) | |
for k, v in sorted(orig.items()): | |
writer.writerow((k,) + v) | |
resp = requests.patch( | |
"https://api.github.com/gists/8b722a65397f7c4c0df72f5394efa04c", | |
headers={"Accept": "application/vnd.github.v3+json"}, | |
auth=("edgedb-ci", os.environ["GIST_TOKEN"]), | |
json={"files": {"time_stats.csv": {"content": buf.getvalue()}}}, | |
) | |
resp.raise_for_status() | |
workflow-notifications: | |
if: failure() && github.event_name != 'pull_request' | |
name: Notify in Slack on failures | |
needs: | |
- test-conclusion | |
runs-on: ubuntu-latest | |
permissions: | |
actions: 'read' | |
steps: | |
- name: Slack Workflow Notification | |
uses: Gamesight/slack-workflow-status@26a36836c887f260477432e4314ec3490a84f309 | |
with: | |
repo_token: ${{secrets.GITHUB_TOKEN}} | |
slack_webhook_url: ${{secrets.ACTIONS_SLACK_WEBHOOK_URL}} | |
name: 'Workflow notifications' | |
icon_emoji: ':hammer:' | |
include_jobs: 'on-failure' |