Skip to content

feat: log when initializing a nodes table entry (#2104) #315

feat: log when initializing a nodes table entry (#2104)

feat: log when initializing a nodes table entry (#2104) #315

Workflow file for this run

name: Spanner Build, Test, and Push
on:
pull_request:
types: [opened, synchronize]
push:
branches:
- "**"
tags:
- "**"
workflow_dispatch: {}
env:
RUST_VERSION: "1.91" # RUST_VER
PYTHON_VERSION: "3.12" # PY_VER
jobs:
build-and-test-spanner:
runs-on: ubuntu-latest
services:
spanner-emulator:
image: gcr.io/cloud-spanner-emulator/emulator:1.4.0
ports:
- 9010:9010
- 9020:9020
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: test
MYSQL_PASSWORD: test
MYSQL_DATABASE: syncstorage
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping"
--health-interval=10s
--health-timeout=5s
--health-retries=3
env:
# The code expects a spanner URL like:
SYNC_SYNCSTORAGE__DATABASE_URL: spanner://projects/test-project/instances/test-instance/databases/test-database
RUST_BACKTRACE: 1
RUST_TEST_THREADS: 1
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- uses: ./.github/actions/setup-rust
with:
workspace-path: workflow/test-results
- uses: ./.github/actions/setup-python
with:
workspace-path: workflow/test-results
- name: Create version.json
run: |
printf '{"commit":"%s","version":"%s","source":"https://github.com/%s/%s","build":"%s"}\n' \
"${GITHUB_SHA}" \
"${GITHUB_REF_NAME}" \
"${GITHUB_REPOSITORY_OWNER}" \
"${GITHUB_REPOSITORY_NAME}" \
"${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" \
> version.json
env:
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
- name: Install cargo-nextest
run: curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin
- name: Install cargo-llvm-cov
run: cargo install --locked cargo-llvm-cov
- name: Build workspace (spanner feature)
run: |
# Build with the spanner feature so any compile-time issues surface early
cargo build --workspace --no-default-features --features=syncstorage-db/spanner --features=py_verifier
- name: Wait for Spanner Emulator to be ready
run: |
echo "Waiting for Spanner emulator to be ready..."
for i in {1..30}; do
if curl -s http://localhost:9020/ > /dev/null 2>&1; then
echo "Spanner emulator is ready (REST port 9020 responding)"
break
fi
echo "Attempt $i/30: Spanner emulator not ready yet, waiting..."
sleep 2
done
# Verify both ports are accessible
if ! curl -s http://localhost:9020/ > /dev/null 2>&1; then
echo "ERROR: Cannot connect to Spanner emulator REST API at localhost:9020"
exit 1
fi
echo "Spanner emulator is fully ready"
- name: Setup Spanner schema & instance (prepare-spanner.sh)
env:
SYNC_SYNCSTORAGE__DATABASE_URL: spanner://projects/test-project/instances/test-instance/databases/test-database
SYNC_SYNCSTORAGE__SPANNER_EMULATOR_HOST: http://localhost:9020
run: |
# prepare-spanner.sh uses the REST API (port 9020)
scripts/prepare-spanner.sh
- name: Create Tokenserver database
run: |
mysql -u root -ppassword -h 127.0.0.1 -e 'CREATE DATABASE tokenserver;'
mysql -u root -ppassword -h 127.0.0.1 -e "GRANT ALL ON tokenserver.* to 'test'@'%';"
- name: Run Spanner unit tests with coverage
env:
SYNC_SYNCSTORAGE__DATABASE_URL: spanner://projects/test-project/instances/test-instance/databases/test-database
SYNC_SYNCSTORAGE__SPANNER_EMULATOR_HOST: localhost:9010
SYNC_TOKENSERVER__DATABASE_URL: mysql://test:test@127.0.0.1/tokenserver
SYNC_TOKENSERVER__NODE_TYPE: spanner
RUST_TEST_THREADS: 1
run: make spanner_test_with_coverage
- name: Publish Test Report
uses: dorny/test-reporter@a810f9bf83f2344124a920a7a0a85a6716e791f0
if: always()
with:
name: Spanner Unit Tests
path: workflow/test-results/*.xml
reporter: java-junit
fail-on-error: false
- name: Upload test results
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: spanner-test-results
path: workflow/test-results/
# Upload to GCS on master
- name: Authenticate to Google Cloud
if: github.ref == 'refs/heads/master'
uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3
with:
credentials_json: ${{ secrets.ETE_GCLOUD_SERVICE_KEY }}
- name: Upload JUnit results to GCS
if: github.ref == 'refs/heads/master'
uses: google-github-actions/upload-cloud-storage@c0f6160ff80057923ff50e5e567695cea181ec23 # v2
with:
path: workflow/test-results
destination: ecosystem-test-eng-metrics/syncstorage-rs/junit
glob: "*.xml"
parent: false
process_gcloudignore: false
- name: Upload coverage results to GCS
if: github.ref == 'refs/heads/master'
uses: google-github-actions/upload-cloud-storage@c0f6160ff80057923ff50e5e567695cea181ec23 # v2
with:
path: workflow/test-results
destination: ecosystem-test-eng-metrics/syncstorage-rs/coverage
glob: "*.json"
parent: false
process_gcloudignore: false
build-spanner-image:
runs-on: ubuntu-latest
needs: build-and-test-spanner
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Create version.json
run: |
printf '{"commit":"%s","version":"%s","source":"https://github.com/%s/%s","build":"%s"}\n' \
"${GITHUB_SHA}" \
"${GITHUB_REF_NAME}" \
"${GITHUB_REPOSITORY_OWNER}" \
"${GITHUB_REPOSITORY_NAME}" \
"${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" \
> version.json
env:
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Build Spanner Docker image (local artifact)
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with:
context: .
push: false
tags: app:build
build-args: |
SYNCSTORAGE_DATABASE_BACKEND=spanner
MYSQLCLIENT_PKG=libmysqlclient-dev
outputs: type=docker,dest=/tmp/spanner-image.tar
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Upload Docker image artifact
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: spanner-docker-image
path: /tmp/spanner-image.tar
retention-days: 1
spanner-e2e-tests:
runs-on: ubuntu-latest
needs: build-spanner-image
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
persist-credentials: false
- name: Download Docker image
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6
with:
name: spanner-docker-image
path: /tmp
- name: Load Docker image
run: docker load --input /tmp/spanner-image.tar
- name: Create test results directory
run: mkdir -p workflow/test-results
- name: Run Spanner e2e tests
run: make docker_run_spanner_e2e_tests
env:
SYNCSTORAGE_RS_IMAGE: app:build
- name: Publish E2E Test Report
uses: dorny/test-reporter@a810f9bf83f2344124a920a7a0a85a6716e791f0
if: always()
with:
name: Spanner E2E Tests
path: workflow/test-results/*.xml
reporter: java-junit
fail-on-error: false
- name: Upload e2e test results
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
with:
name: spanner-e2e-test-results
path: workflow/test-results/
# Upload to GCS on master
- name: Authenticate to Google Cloud
if: github.ref == 'refs/heads/master'
uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3
with:
credentials_json: ${{ secrets.ETE_GCLOUD_SERVICE_KEY }}
- name: Upload e2e test results to GCS
if: github.ref == 'refs/heads/master'
uses: google-github-actions/upload-cloud-storage@c0f6160ff80057923ff50e5e567695cea181ec23 # v2
with:
path: workflow/test-results
destination: ecosystem-test-eng-metrics/syncstorage-rs/junit
glob: "*.xml"
parent: false
process_gcloudignore: false