-
Notifications
You must be signed in to change notification settings - Fork 80
270 lines (231 loc) · 9.14 KB
/
spanner.yml
File metadata and controls
270 lines (231 loc) · 9.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
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