feat: log when initializing a nodes table entry (#2104) #315
This file contains hidden or 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: 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 | |