-
Notifications
You must be signed in to change notification settings - Fork 2
384 lines (338 loc) · 13.6 KB
/
plugin-ci.yml
File metadata and controls
384 lines (338 loc) · 13.6 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
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
name: Plugin CI
on:
workflow_dispatch:
inputs:
tag:
description: Enter tag for release
required: true
type: string
release:
description: Enter name for github release
required: true
type: string
prerelease:
type: boolean
default: true
required: true
overwrite:
type: boolean
default: true
required: true
artifacttype:
type: choice
required: true
default: "OSS-develop"
options:
- "OSS-develop"
- "OSS-release"
- "Project"
pull_request:
types: [opened, ready_for_review, reopened, synchronize]
merge_group:
push:
branches:
- develop
- deno2.5.6
- 'release/v*'
env:
NPM_ARTIFACT_TYPE: ${{ github.event.inputs.artifacttype || 'OSS-develop'}}
jobs:
pick_runner:
runs-on: ubuntu-latest
if: (github.ref_name == 'develop' || github.ref_name == 'deno2.5.6' || startsWith(github.ref_name, 'release/') || github.event_name == 'workflow_dispatch') || ( github.event_name == 'pull_request' && !github.event.pull_request.draft )
outputs:
random_runner: ${{ steps.shuffle.outputs.random_runner }}
steps:
- id: shuffle
run: echo "random_runner=$(shuf -e ubuntu-22.04 ubuntu-24.04 | head -n 1)" >> "$GITHUB_OUTPUT"
build:
needs: [pick_runner]
if: (github.ref_name == 'develop' || github.ref_name == 'deno2.5.6' || startsWith(github.ref_name, 'release/') || github.event_name == 'workflow_dispatch') || ( github.event_name == 'pull_request' && !github.event.pull_request.draft )
strategy:
fail-fast: false
matrix:
include:
- PKGPATH: ./plugins/chdb
RUNNER: ubuntu-24.04
- PKGPATH: ./plugins/atlas
RUNNER: ubuntu-24.04
- PKGPATH: ./plugins/hana
- PKGPATH: ./plugins/ai
RUNNER: ubuntu-24.04
- PKGPATH: ./plugins/pgwire
- PKGPATH: ./plugins/tpm
- PKGPATH: ./plugins/migration
- PKGPATH: ./plugins/db
- PKGPATH: ./plugins/etl
- PKGPATH: ./plugins/fhir
- PKGPATH: ./plugins/transform
- PKGPATH: ./plugins/cql2elm
RUNNER: ubuntu-24.04
- PKGPATH: ./plugins/bao
RUNNER: ubuntu-24.04
- PKGPATH: ./plugins/docs
- PKGPATH: ./plugins/web
- PKGPATH: ./plugins/runtime
runs-on: ${{ matrix.RUNNER || needs.pick_runner.outputs.random_runner }}
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: "18.x"
registry-url: "https://npm.pkg.github.com"
scope: "@trex"
- name: Update version
run: |
cd ${{ matrix.PKGPATH }}
if [[ $GITHUB_EVENT_NAME == 'workflow_dispatch' ]]; then
RELEASE_VERSION=${{ github.event.inputs.tag }}
jq --arg v $RELEASE_VERSION '.version=$v' package.json > tmppkg; mv tmppkg package.json
elif [[ $GITHUB_REF_NAME == 'deno2.5.6' ]]; then
jq --arg v "-$(date +%s)-$GITHUB_SHA-d256" '.version+=$v' package.json > tmppkg; mv tmppkg package.json
elif [[ $GITHUB_REF_NAME == release/v* ]]; then
BRANCH_SUFFIX=${GITHUB_REF_NAME#release/}
jq --arg v "-$(date +%s)-${BRANCH_SUFFIX}-$GITHUB_SHA" '.version+=$v' package.json > tmppkg; mv tmppkg package.json
else
jq --arg v "-$(date +%s)-$GITHUB_SHA" '.version+=$v' package.json > tmppkg; mv tmppkg package.json
fi
- name: Set up Rust toolchain
if: matrix.PKGPATH == './plugins/bao'
uses: dtolnay/rust-toolchain@stable
- name: Download libtrexsql and build native library
if: matrix.PKGPATH == './plugins/bao'
run: |
mkdir -p /tmp/trexsql
wget -q -O /tmp/libtrexsql.zip \
https://github.com/p-hoffmann/trexsql-rs/releases/download/v1.4.4-trex/libtrexsql-linux-amd64.zip
unzip -o /tmp/libtrexsql.zip -d /tmp/trexsql
ln -sf /tmp/trexsql/libtrexsql.so /tmp/trexsql/libduckdb.so
TREXSQL_LIB_DIR=/tmp/trexsql cargo build --release
mkdir -p plugins/bao/java/resources/linux-x86-64
cp target/release/libtrexsql_engine.so plugins/bao/java/resources/linux-x86-64/
cp /tmp/trexsql/libtrexsql.so plugins/bao/java/resources/linux-x86-64/libduckdb.so
- name: Set up Java 21
if: matrix.PKGPATH == './plugins/bao'
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '21'
- name: Install Leiningen
if: matrix.PKGPATH == './plugins/bao'
run: |
sudo curl -sL https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein -o /usr/local/bin/lein
sudo chmod +x /usr/local/bin/lein
lein version
- name: Clean V8 cache
if: matrix.PKGPATH == './plugins/runtime'
working-directory: ${{ matrix.PKGPATH }}
run: rm -rf target/*/gn_out target/*/obj/librusty_v8.a || true
- name: Install dependencies
run: |
cd ${{ matrix.PKGPATH }}
npm install --ignore-scripts
env:
CI: true
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Configure @trex publish registry
uses: actions/setup-node@v4
with:
node-version: "18.x"
registry-url: "https://pkgs.dev.azure.com/data2evidence/d2e/_packaging/trex/npm/registry/"
scope: "@trex"
- name: Configure @data2evidence registry - OSS Develop
uses: actions/setup-node@v4
if: env.NPM_ARTIFACT_TYPE == 'OSS-develop'
with:
node-version: "18.x"
registry-url: "https://pkgs.dev.azure.com/data2evidence/d2e/_packaging/d2e/npm/registry/"
scope: "@data2evidence"
- name: Configure @data2evidence registry - OSS Release
uses: actions/setup-node@v4
if: env.NPM_ARTIFACT_TYPE == 'OSS-release'
with:
node-version: "18.x"
registry-url: "https://pkgs.dev.azure.com/data2evidence/d2e/_packaging/stable/npm/registry/"
scope: "@data2evidence"
- name: Configure @data2evidence registry - Project
uses: actions/setup-node@v4
if: env.NPM_ARTIFACT_TYPE == 'Project'
with:
node-version: "18.x"
registry-url: "https://pkgs.dev.azure.com/data2evidence/d2e/_packaging/ms/npm/registry/"
scope: "@data2evidence"
- name: Publish
env:
CI: true
SHOULD_PUBLISH: ${{ github.ref_name == 'develop' || github.ref_name == 'deno2.5.6' || startsWith(github.ref_name, 'release/') || github.event_name == 'workflow_dispatch' }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_PROJECT_TOKEN }}
DUCKDB_EXTENSION_SIGNING_KEY: ${{ secrets.DUCKDB_EXTENSION_SIGNING_KEY }}
run: |
cd ${{ matrix.PKGPATH }}
if [[ $SHOULD_PUBLISH == true ]]; then
npm publish
else
npm pack
fi
- name: Extract extension name
id: extname
run: echo "name=$(basename ${{ matrix.PKGPATH }})" >> "$GITHUB_OUTPUT"
- name: Upload extension artifact
if: hashFiles(format('{0}/*.trex', matrix.PKGPATH)) != ''
uses: actions/upload-artifact@v4
with:
name: ext-${{ steps.extname.outputs.name }}
path: ${{ matrix.PKGPATH }}/*.trex
retention-days: 1
create-release:
needs: [build]
if: github.event_name == 'workflow_dispatch' && github.event.inputs.tag != ''
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Download all extension artifacts
uses: actions/download-artifact@v4
with:
pattern: ext-*
path: release-assets/
merge-multiple: true
- name: List release assets
run: ls -la release-assets/
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.inputs.tag }}
name: ${{ github.event.inputs.release }}
prerelease: ${{ github.event.inputs.prerelease }}
files: release-assets/*.trex
fail_on_unmatched_files: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-docker:
needs: [build]
runs-on: ubuntu-24.04
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Download extension artifacts
uses: actions/download-artifact@v4
with:
pattern: ext-*
path: extensions/
merge-multiple: true
- name: List extensions
run: ls -la extensions/
- name: Build Docker image
run: docker build -t trexsql-test .
- name: Test extensions load
run: |
OUTPUT=$(docker run --rm trexsql-test --check 2>&1) || true
echo "$OUTPUT"
echo "$OUTPUT" | grep -q "extension(s) loaded successfully"
- name: Login to GHCR
if: github.ref_name == 'develop' || github.ref_name == 'deno2.5.6' || startsWith(github.ref_name, 'release/') || github.event_name == 'workflow_dispatch'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push to GHCR
if: github.ref_name == 'develop' || github.ref_name == 'deno2.5.6' || startsWith(github.ref_name, 'release/') || github.event_name == 'workflow_dispatch'
run: |
docker tag trexsql-test ghcr.io/ohdsi/trexsql:latest
docker tag trexsql-test ghcr.io/ohdsi/trexsql:sha-${{ github.sha }}
docker push ghcr.io/ohdsi/trexsql:latest
docker push ghcr.io/ohdsi/trexsql:sha-${{ github.sha }}
build-pg-trex:
needs: [build]
runs-on: ubuntu-24.04
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: dtolnay/rust-toolchain@stable
- name: Install PostgreSQL 17 dev headers
run: |
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg
sudo apt-get update
sudo apt-get install -y postgresql-17 postgresql-server-dev-17
- name: Download libtrexsql
run: |
wget -O /tmp/libtrexsql.zip \
https://github.com/p-hoffmann/trexsql-rs/releases/download/v1.4.4-trex/libtrexsql-linux-amd64.zip
unzip /tmp/libtrexsql.zip -d /tmp/trexsql
ln -sf /tmp/trexsql/libtrexsql.so /tmp/trexsql/libduckdb.so
- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
~/.pgrx
plugins/pg_trex/target
key: rust-pg-trex-${{ runner.os }}-${{ hashFiles('plugins/pg_trex/Cargo.lock') }}
restore-keys: rust-pg-trex-${{ runner.os }}-
- name: Install cargo-pgrx and init
run: |
cargo install cargo-pgrx --version 0.16.1 --locked
cargo pgrx init --pg17=$(which pg_config)
- name: Build pg_trex
run: LIBRARY_PATH=/tmp/trexsql cargo build
working-directory: plugins/pg_trex
- name: Download extension artifacts
uses: actions/download-artifact@v4
with:
pattern: ext-*
path: extensions/
merge-multiple: true
- name: List extensions
run: ls -la extensions/
- name: Build pg_trex Docker image
run: docker build -t pg-trex-test -f plugins/pg_trex/Dockerfile .
- name: Smoke test
run: |
docker run -d --name pg-trex-smoke \
pg-trex-test \
postgres \
-c shared_preload_libraries=pg_trex \
-c pg_trex.swarm_extension_path=/usr/lib/trexsql/extensions/db.trex
sleep 8
docker exec pg-trex-smoke pg_isready -U postgres
docker exec pg-trex-smoke psql -U postgres -c "SELECT state FROM pg_trex_status()"
docker rm -f pg-trex-smoke
- name: Login to GHCR
if: github.ref_name == 'develop' || github.ref_name == 'deno2.5.6' || startsWith(github.ref_name, 'release/') || github.event_name == 'workflow_dispatch'
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push to GHCR
if: github.ref_name == 'develop' || github.ref_name == 'deno2.5.6' || startsWith(github.ref_name, 'release/') || github.event_name == 'workflow_dispatch'
run: |
docker tag pg-trex-test ghcr.io/ohdsi/pg-trex:latest
docker tag pg-trex-test ghcr.io/ohdsi/pg-trex:sha-${{ github.sha }}
docker push ghcr.io/ohdsi/pg-trex:latest
docker push ghcr.io/ohdsi/pg-trex:sha-${{ github.sha }}
success:
needs: [build, build-docker, build-pg-trex, create-release]
if: always()
runs-on: ubuntu-latest
steps:
- name: Check
run: |
if [[ "${{ needs.build.result }}" == "failure" || "${{ needs.build-docker.result }}" == "failure" || "${{ needs.build-pg-trex.result }}" == "failure" || "${{ needs.create-release.result }}" == "failure" ]]; then
echo "::error::One or more jobs failed"
exit 1
fi
echo "All required jobs passed (or were skipped)"