ray-clickhouse 1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. ray_clickhouse-1.0/.github/workflows/ci.yml +379 -0
  2. ray_clickhouse-1.0/.github/workflows/release.yml +941 -0
  3. ray_clickhouse-1.0/.gitignore +11 -0
  4. ray_clickhouse-1.0/CONTRIBUTING.md +113 -0
  5. ray_clickhouse-1.0/LICENSE +201 -0
  6. ray_clickhouse-1.0/PKG-INFO +239 -0
  7. ray_clickhouse-1.0/README.md +206 -0
  8. ray_clickhouse-1.0/SECURITY.md +21 -0
  9. ray_clickhouse-1.0/doc/Makefile +16 -0
  10. ray_clickhouse-1.0/doc/source/architecture.md +77 -0
  11. ray_clickhouse-1.0/doc/source/compatibility.md +26 -0
  12. ray_clickhouse-1.0/doc/source/conf.py +14 -0
  13. ray_clickhouse-1.0/doc/source/contributing.md +14 -0
  14. ray_clickhouse-1.0/doc/source/index.md +17 -0
  15. ray_clickhouse-1.0/doc/source/release-notes.md +7 -0
  16. ray_clickhouse-1.0/doc/source/security.md +28 -0
  17. ray_clickhouse-1.0/doc/source/troubleshooting.md +70 -0
  18. ray_clickhouse-1.0/docker/clickhouse/compose.yaml +14 -0
  19. ray_clickhouse-1.0/docker/ray/Dockerfile +10 -0
  20. ray_clickhouse-1.0/docker/ray/compose.yaml +114 -0
  21. ray_clickhouse-1.0/pyproject.toml +79 -0
  22. ray_clickhouse-1.0/release-notes/v0.1.0.md +43 -0
  23. ray_clickhouse-1.0/release-notes/v1.0.md +34 -0
  24. ray_clickhouse-1.0/scripts/run_clickhouse_it.sh +69 -0
  25. ray_clickhouse-1.0/scripts/run_ray_cluster_it.sh +134 -0
  26. ray_clickhouse-1.0/src/ray_clickhouse/__init__.py +36 -0
  27. ray_clickhouse-1.0/src/ray_clickhouse/_api.py +281 -0
  28. ray_clickhouse-1.0/src/ray_clickhouse/_compat.py +72 -0
  29. ray_clickhouse-1.0/src/ray_clickhouse/_ddl.py +240 -0
  30. ray_clickhouse-1.0/src/ray_clickhouse/_discovery.py +553 -0
  31. ray_clickhouse-1.0/src/ray_clickhouse/_errors.py +90 -0
  32. ray_clickhouse-1.0/src/ray_clickhouse/_models.py +273 -0
  33. ray_clickhouse-1.0/src/ray_clickhouse/_planning.py +55 -0
  34. ray_clickhouse-1.0/src/ray_clickhouse/_query.py +210 -0
  35. ray_clickhouse-1.0/src/ray_clickhouse/_schema.py +405 -0
  36. ray_clickhouse-1.0/src/ray_clickhouse/_sql.py +346 -0
  37. ray_clickhouse-1.0/src/ray_clickhouse/_transport.py +520 -0
  38. ray_clickhouse-1.0/src/ray_clickhouse/datasink.py +193 -0
  39. ray_clickhouse-1.0/src/ray_clickhouse/datasource.py +335 -0
  40. ray_clickhouse-1.0/src/ray_clickhouse/py.typed +1 -0
  41. ray_clickhouse-1.0/tests/__init__.py +1 -0
  42. ray_clickhouse-1.0/tests/contract/__init__.py +1 -0
  43. ray_clickhouse-1.0/tests/contract/test_public_api.py +152 -0
  44. ray_clickhouse-1.0/tests/contract/test_ray_compatibility.py +138 -0
  45. ray_clickhouse-1.0/tests/integration/__init__.py +0 -0
  46. ray_clickhouse-1.0/tests/integration/conftest.py +77 -0
  47. ray_clickhouse-1.0/tests/integration/test_auto_range.py +139 -0
  48. ray_clickhouse-1.0/tests/integration/test_clickhouse.py +560 -0
  49. ray_clickhouse-1.0/tests/integration/test_query.py +193 -0
  50. ray_clickhouse-1.0/tests/integration/test_query_metadata.py +55 -0
  51. ray_clickhouse-1.0/tests/integration/test_read_diagnostics.py +101 -0
  52. ray_clickhouse-1.0/tests/integration/test_typed_parameters.py +264 -0
  53. ray_clickhouse-1.0/tests/it-ledger.md +129 -0
  54. ray_clickhouse-1.0/tests/unit/test_auto_range.py +343 -0
  55. ray_clickhouse-1.0/tests/unit/test_cluster_ci.py +21 -0
  56. ray_clickhouse-1.0/tests/unit/test_compat.py +106 -0
  57. ray_clickhouse-1.0/tests/unit/test_compatibility.py +384 -0
  58. ray_clickhouse-1.0/tests/unit/test_datasink.py +60 -0
  59. ray_clickhouse-1.0/tests/unit/test_datasource.py +205 -0
  60. ray_clickhouse-1.0/tests/unit/test_ddl.py +115 -0
  61. ray_clickhouse-1.0/tests/unit/test_docs.py +96 -0
  62. ray_clickhouse-1.0/tests/unit/test_models.py +92 -0
  63. ray_clickhouse-1.0/tests/unit/test_planning.py +44 -0
  64. ray_clickhouse-1.0/tests/unit/test_query.py +261 -0
  65. ray_clickhouse-1.0/tests/unit/test_read_diagnostics.py +426 -0
  66. ray_clickhouse-1.0/tests/unit/test_release.py +653 -0
  67. ray_clickhouse-1.0/tests/unit/test_schema.py +107 -0
  68. ray_clickhouse-1.0/tests/unit/test_sql.py +112 -0
  69. ray_clickhouse-1.0/tests/unit/test_transport.py +193 -0
  70. ray_clickhouse-1.0/tests/unit/test_typed_parameters.py +199 -0
  71. ray_clickhouse-1.0/tools/check_compatibility.py +370 -0
  72. ray_clickhouse-1.0/tools/check_docs.py +187 -0
  73. ray_clickhouse-1.0/tools/check_release.py +984 -0
  74. ray_clickhouse-1.0/uv.lock +2110 -0
@@ -0,0 +1,379 @@
1
+ name: CI
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ candidate_sha:
7
+ description: Immutable release candidate commit to test
8
+ required: false
9
+ type: string
10
+ pull_request:
11
+ push:
12
+ branches: [master]
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ concurrency:
18
+ group: ci-${{ github.workflow }}-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ candidate:
23
+ name: Resolve candidate commit
24
+ runs-on: ubuntu-latest
25
+ timeout-minutes: 5
26
+ outputs:
27
+ sha: ${{ steps.resolve.outputs.sha }}
28
+ steps:
29
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
30
+ with:
31
+ fetch-depth: 0
32
+ persist-credentials: false
33
+ ref: ${{ github.sha }}
34
+ - id: resolve
35
+ name: Validate immutable candidate SHA
36
+ shell: bash
37
+ env:
38
+ INPUT_CANDIDATE_SHA: ${{ inputs.candidate_sha }}
39
+ run: |
40
+ candidate_sha="${INPUT_CANDIDATE_SHA:-${GITHUB_SHA}}"
41
+ if [[ ! "${candidate_sha}" =~ ^[0-9a-f]{40}$ ]]; then
42
+ echo "candidate_sha must be a full 40-character commit SHA" >&2
43
+ exit 1
44
+ fi
45
+ echo "sha=${candidate_sha}" >> "${GITHUB_OUTPUT}"
46
+ - name: Checkout validated candidate
47
+ shell: bash
48
+ env:
49
+ CANDIDATE_SHA: ${{ steps.resolve.outputs.sha }}
50
+ run: |
51
+ set -euo pipefail
52
+ git checkout --detach "${CANDIDATE_SHA}"
53
+ test "$(git rev-parse HEAD)" = "${CANDIDATE_SHA}"
54
+
55
+ unit:
56
+ name: Python ${{ matrix.python }} / Ray ${{ matrix.ray }}
57
+ needs: candidate
58
+ runs-on: ubuntu-latest
59
+ timeout-minutes: 20
60
+ strategy:
61
+ fail-fast: false
62
+ matrix:
63
+ include:
64
+ - python: "3.12"
65
+ ray: "2.55.0"
66
+ - python: "3.12"
67
+ ray: "2.56.1"
68
+ - python: "3.12"
69
+ ray: "2.57.0"
70
+ - python: "3.12"
71
+ ray: "2.58.0"
72
+ - python: "3.10"
73
+ ray: "2.58.0"
74
+ - python: "3.11"
75
+ ray: "2.58.0"
76
+ - python: "3.13"
77
+ ray: "2.58.0"
78
+ steps:
79
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
80
+ with:
81
+ persist-credentials: false
82
+ ref: ${{ needs.candidate.outputs.sha }}
83
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
84
+ with:
85
+ python-version: ${{ matrix.python }}
86
+ - run: uv venv --python ${{ matrix.python }}
87
+ - run: uv pip install -e ".[dev]" "ray[data]==${{ matrix.ray }}"
88
+ - name: Show resolved runtime versions
89
+ run: >-
90
+ .venv/bin/python -c
91
+ "from importlib.metadata import version;
92
+ print('python=' + __import__('platform').python_version());
93
+ print('ray=' + version('ray'));
94
+ print('pyarrow=' + version('pyarrow'));
95
+ print('clickhouse-connect=' + version('clickhouse-connect'))"
96
+ - run: >-
97
+ .venv/bin/python -m pytest tests/unit tests/contract
98
+ --cov=ray_clickhouse --cov-report=term-missing
99
+ env:
100
+ RAY_ENABLE_UV_RUN_RUNTIME_ENV: "0"
101
+ RAY_USAGE_STATS_ENABLED: "0"
102
+
103
+ quality:
104
+ name: Static quality
105
+ needs: candidate
106
+ runs-on: ubuntu-latest
107
+ timeout-minutes: 30
108
+ steps:
109
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
110
+ with:
111
+ persist-credentials: false
112
+ ref: ${{ needs.candidate.outputs.sha }}
113
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
114
+ with:
115
+ python-version: "3.12"
116
+ - run: uv sync --extra dev --group docs --frozen
117
+ - run: uv lock --check
118
+ - run: .venv/bin/ruff format --check .
119
+ - run: .venv/bin/ruff check .
120
+ - run: .venv/bin/mypy
121
+ - run: .venv/bin/python tools/check_compatibility.py
122
+ - run: .venv/bin/python tools/check_docs.py
123
+ - run: .venv/bin/python tools/check_release.py check
124
+
125
+ docs:
126
+ name: Documentation
127
+ needs: candidate
128
+ runs-on: ubuntu-24.04
129
+ timeout-minutes: 15
130
+ steps:
131
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
132
+ with:
133
+ persist-credentials: false
134
+ ref: ${{ needs.candidate.outputs.sha }}
135
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
136
+ with:
137
+ python-version: "3.12"
138
+ - run: uv sync --extra dev --group docs --frozen
139
+ - run: .venv/bin/python tools/check_docs.py
140
+ - run: make -C doc html
141
+ - run: make -C doc spelling
142
+
143
+ docs-linkcheck:
144
+ name: Documentation links
145
+ needs: candidate
146
+ runs-on: ubuntu-24.04
147
+ timeout-minutes: 15
148
+ steps:
149
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
150
+ with:
151
+ persist-credentials: false
152
+ ref: ${{ needs.candidate.outputs.sha }}
153
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
154
+ with:
155
+ python-version: "3.12"
156
+ - run: uv sync --extra dev --group docs --frozen
157
+ - run: make -C doc linkcheck
158
+
159
+ clickhouse-it:
160
+ name: ClickHouse 26.8 integration
161
+ needs: candidate
162
+ runs-on: ubuntu-latest
163
+ timeout-minutes: 30
164
+ outputs:
165
+ artifact-id: ${{ steps.upload-evidence.outputs.artifact-id }}
166
+ artifact-digest: sha256:${{ steps.upload-evidence.outputs.artifact-digest }}
167
+ artifact-url: ${{ steps.upload-evidence.outputs.artifact-url }}
168
+ steps:
169
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
170
+ with:
171
+ persist-credentials: false
172
+ ref: ${{ needs.candidate.outputs.sha }}
173
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
174
+ with:
175
+ python-version: "3.12"
176
+ - run: uv sync --extra dev --frozen
177
+ - name: Run ClickHouse integration
178
+ run: ./scripts/run_clickhouse_it.sh
179
+ env:
180
+ RAY_CLICKHOUSE_IT_ARTIFACT_DIR: artifacts/it
181
+ - name: Upload ClickHouse integration evidence
182
+ id: upload-evidence
183
+ if: always()
184
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
185
+ with:
186
+ name: clickhouse-26.8-integration
187
+ path: artifacts/it
188
+ if-no-files-found: error
189
+ retention-days: 90
190
+
191
+ ray-cluster-it:
192
+ name: Ray 2.58 multi-node integration
193
+ needs: candidate
194
+ runs-on: ubuntu-24.04
195
+ timeout-minutes: 45
196
+ steps:
197
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
198
+ with:
199
+ persist-credentials: false
200
+ ref: ${{ needs.candidate.outputs.sha }}
201
+ - name: Run multi-node integration
202
+ run: ./scripts/run_ray_cluster_it.sh
203
+ env:
204
+ RAY_CLICKHOUSE_CLUSTER_IT_ARTIFACT_DIR: artifacts/it/ray-cluster
205
+ - name: Upload multi-node integration evidence
206
+ if: always()
207
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
208
+ with:
209
+ name: ray-2.58-cluster-integration
210
+ path: artifacts/it/ray-cluster
211
+ if-no-files-found: error
212
+ retention-days: 90
213
+
214
+ package-build:
215
+ name: Build package
216
+ needs: candidate
217
+ runs-on: ubuntu-latest
218
+ timeout-minutes: 15
219
+ permissions:
220
+ contents: read
221
+ outputs:
222
+ artifact-id: ${{ steps.upload-distributions.outputs.artifact-id }}
223
+ artifact-digest: sha256:${{ steps.upload-distributions.outputs.artifact-digest }}
224
+ artifact-url: ${{ steps.upload-distributions.outputs.artifact-url }}
225
+ steps:
226
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
227
+ with:
228
+ persist-credentials: false
229
+ ref: ${{ needs.candidate.outputs.sha }}
230
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
231
+ with:
232
+ python-version: "3.12"
233
+ - run: uv sync --extra dev --frozen
234
+ - run: .venv/bin/python -m build
235
+ - run: .venv/bin/twine check dist/*.whl dist/*.tar.gz
236
+ - name: Create distribution checksums
237
+ run: cd dist && sha256sum -- *.whl *.tar.gz > SHA256SUMS
238
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
239
+ id: upload-distributions
240
+ with:
241
+ name: distributions
242
+ path: dist/*
243
+ if-no-files-found: error
244
+ retention-days: 90
245
+
246
+ package-smoke:
247
+ name: Python ${{ matrix.python }} package smoke
248
+ needs: [candidate, package-build]
249
+ runs-on: ubuntu-latest
250
+ timeout-minutes: 15
251
+ strategy:
252
+ fail-fast: false
253
+ matrix:
254
+ include:
255
+ - python: "3.10"
256
+ - python: "3.11"
257
+ - python: "3.12"
258
+ - python: "3.13"
259
+ steps:
260
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
261
+ with:
262
+ persist-credentials: false
263
+ ref: ${{ needs.candidate.outputs.sha }}
264
+ - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
265
+ with:
266
+ python-version: ${{ matrix.python }}
267
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
268
+ with:
269
+ name: distributions
270
+ path: dist
271
+ - run: uv venv --python ${{ matrix.python }} .venv-wheel
272
+ - name: Install and check wheel
273
+ run: |
274
+ shopt -s nullglob
275
+ (cd dist && sha256sum --check SHA256SUMS)
276
+ packages=(dist/*.whl)
277
+ test "${#packages[@]}" -eq 1
278
+ uv pip install \
279
+ --python .venv-wheel/bin/python \
280
+ "ray[data]==2.58.0" \
281
+ "${packages[0]}"
282
+ uv pip check --python .venv-wheel/bin/python
283
+ .venv-wheel/bin/python -c \
284
+ "from importlib.metadata import distribution, version; import clickhouse_connect, pyarrow, ray, ray_clickhouse; d = distribution('ray-clickhouse'); assert version('ray-clickhouse') == '1.0'; assert d.locate_file('ray_clickhouse/py.typed').is_file(); assert d.metadata['License-Expression'] == 'Apache-2.0'; assert d.metadata['Description-Content-Type'] == 'text/markdown'; assert 'Typing :: Typed' in d.metadata.get_all('Classifier'); print(ray.__version__)"
285
+ - name: Install and check source distribution
286
+ if: matrix.python == '3.12'
287
+ run: |
288
+ shopt -s nullglob
289
+ packages=(dist/*.tar.gz)
290
+ test "${#packages[@]}" -eq 1
291
+ uv venv --python 3.12 .venv-sdist
292
+ uv pip install \
293
+ --python .venv-sdist/bin/python \
294
+ "ray[data]==2.58.0" \
295
+ "${packages[0]}"
296
+ uv pip check --python .venv-sdist/bin/python
297
+ .venv-sdist/bin/python -c \
298
+ "from importlib.metadata import distribution, version; import clickhouse_connect, pyarrow, ray, ray_clickhouse; d = distribution('ray-clickhouse'); assert version('ray-clickhouse') == '1.0'; assert d.locate_file('ray_clickhouse/py.typed').is_file(); assert d.metadata['License-Expression'] == 'Apache-2.0'; assert d.metadata['Description-Content-Type'] == 'text/markdown'; assert 'Typing :: Typed' in d.metadata.get_all('Classifier'); print(ray.__version__)"
299
+
300
+ candidate-record:
301
+ name: Record release candidate
302
+ if: >-
303
+ github.event_name == 'push' &&
304
+ github.ref == 'refs/heads/master' &&
305
+ github.workflow_ref ==
306
+ 'jiangxt2/ray-clickhouse/.github/workflows/ci.yml@refs/heads/master'
307
+ needs: [candidate, unit, quality, docs, docs-linkcheck, clickhouse-it, ray-cluster-it, package-build, package-smoke]
308
+ runs-on: ubuntu-24.04
309
+ timeout-minutes: 10
310
+ permissions:
311
+ actions: read
312
+ attestations: write
313
+ contents: read
314
+ id-token: write
315
+ outputs:
316
+ artifact-id: ${{ steps.upload-record.outputs.artifact-id }}
317
+ artifact-digest: sha256:${{ steps.upload-record.outputs.artifact-digest }}
318
+ artifact-url: ${{ steps.upload-record.outputs.artifact-url }}
319
+ steps:
320
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
321
+ with:
322
+ persist-credentials: false
323
+ ref: ${{ needs.candidate.outputs.sha }}
324
+ - name: Download distributions by artifact ID
325
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
326
+ with:
327
+ artifact-ids: ${{ needs.package-build.outputs.artifact-id }}
328
+ path: candidate-distributions
329
+ digest-mismatch: error
330
+ - name: Attest distributions
331
+ uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4
332
+ with:
333
+ subject-checksums: candidate-distributions/SHA256SUMS
334
+ - name: Create candidate descriptor
335
+ env:
336
+ CANDIDATE_SHA: ${{ needs.candidate.outputs.sha }}
337
+ SOURCE_RUN_ID: ${{ github.run_id }}
338
+ DISTRIBUTION_ID: ${{ needs.package-build.outputs.artifact-id }}
339
+ DISTRIBUTION_DIGEST: ${{ needs.package-build.outputs.artifact-digest }}
340
+ DISTRIBUTION_URL: ${{ needs.package-build.outputs.artifact-url }}
341
+ EVIDENCE_ID: ${{ needs.clickhouse-it.outputs.artifact-id }}
342
+ EVIDENCE_DIGEST: ${{ needs.clickhouse-it.outputs.artifact-digest }}
343
+ EVIDENCE_URL: ${{ needs.clickhouse-it.outputs.artifact-url }}
344
+ run: >-
345
+ python3 tools/check_release.py create-candidate-record
346
+ --output release-candidate.json
347
+ --candidate-sha "${CANDIDATE_SHA}"
348
+ --source-run-id "${SOURCE_RUN_ID}"
349
+ --distribution-id "${DISTRIBUTION_ID}"
350
+ --distribution-digest "${DISTRIBUTION_DIGEST}"
351
+ --distribution-url "${DISTRIBUTION_URL}"
352
+ --evidence-id "${EVIDENCE_ID}"
353
+ --evidence-digest "${EVIDENCE_DIGEST}"
354
+ --evidence-url "${EVIDENCE_URL}"
355
+ --sha256sums candidate-distributions/SHA256SUMS
356
+ - name: Upload candidate descriptor
357
+ id: upload-record
358
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
359
+ with:
360
+ name: release-candidate-record
361
+ path: release-candidate.json
362
+ if-no-files-found: error
363
+ retention-days: 90
364
+ - name: Record candidate identity
365
+ env:
366
+ CANDIDATE_SHA: ${{ needs.candidate.outputs.sha }}
367
+ SOURCE_RUN_ID: ${{ github.run_id }}
368
+ RECORD_ID: ${{ steps.upload-record.outputs.artifact-id }}
369
+ RECORD_DIGEST: sha256:${{ steps.upload-record.outputs.artifact-digest }}
370
+ RECORD_URL: ${{ steps.upload-record.outputs.artifact-url }}
371
+ run: |
372
+ {
373
+ echo "## Release candidate"
374
+ echo "- Candidate SHA: ${CANDIDATE_SHA}"
375
+ echo "- Source run ID: ${SOURCE_RUN_ID}"
376
+ echo "- Candidate record artifact ID: ${RECORD_ID}"
377
+ echo "- Candidate record artifact digest: ${RECORD_DIGEST}"
378
+ echo "- Candidate record artifact URL: ${RECORD_URL}"
379
+ } >> "${GITHUB_STEP_SUMMARY}"