-
Notifications
You must be signed in to change notification settings - Fork 758
246 lines (210 loc) · 8.32 KB
/
Copy pathdevkit-ci.yml
File metadata and controls
246 lines (210 loc) · 8.32 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
name: DevKit CI
on:
pull_request:
paths:
- 'devkit/**'
workflow_dispatch:
inputs:
level:
description: 'Test level'
type: choice
options: [lint, smoke, full]
default: smoke
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
env:
AUTOMQ_DEV_HOME: ${{ github.workspace }}
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install just
uses: extractions/setup-just@v2
- name: Install envsubst
run: sudo apt-get install -y gettext-base
- name: Validate justfile
working-directory: devkit
run: just --list
- name: Validate docker-compose
working-directory: devkit
run: |
for p in single cluster cluster4 cluster5 tabletopic analytics; do
echo "=== Profile: $p ==="
docker compose -f docker-compose.yml --profile $p config --services
done
- name: Validate config generation
working-directory: devkit
run: |
# Generate cluster-id without kafka-storage.sh
mkdir -p .devkit
echo "test-cluster-id" > .devkit/cluster-id
# Single node, no features
just generate-config 1 ""
grep -q "node.id=0" .devkit/config/node-0.properties
grep -q "controller.quorum.voters=0@node-0:9093" .devkit/config/node-0.properties
! grep -q "broker.rack" .devkit/config/node-0.properties
echo "✓ Single node config OK"
# 3-node cluster with zerozone
just generate-config 3 "zerozone"
grep -q "broker.rack=az-0" .devkit/config/node-0.properties
grep -q "broker.rack=az-1" .devkit/config/node-1.properties
grep -q "broker.rack=az-2" .devkit/config/node-2.properties
grep -q "zonerouter" .devkit/config/node-0.properties
grep -q "controller.quorum.voters=0@node-0:9093,1@node-1:9093,2@node-2:9093" .devkit/config/node-0.properties
echo "✓ Cluster + zerozone config OK"
# Tabletopic feature
just generate-config 1 "tabletopic"
grep -q "automq.table.topic.catalog.type=rest" .devkit/config/node-0.properties
echo "✓ Tabletopic config OK"
# Combined features
just generate-config 1 "tabletopic zerozone"
grep -q "automq.table.topic" .devkit/config/node-0.properties
grep -q "zonerouter" .devkit/config/node-0.properties
grep -q "broker.rack" .devkit/config/node-0.properties
echo "✓ Combined features config OK"
smoke:
name: Smoke
needs: lint
if: ${{ github.event_name == 'pull_request' || inputs.level == 'smoke' || inputs.level == 'full' }}
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- uses: extractions/setup-just@v2
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-
- name: Gradle build
run: ./gradlew :core:build :tools:build :shell:build -x test
- name: Start single node
working-directory: devkit
run: just start
- name: Wait for healthy
working-directory: devkit
run: just wait
- name: Topic operations
working-directory: devkit
run: |
just topic-create ci-test
just topic-list 2>&1 | grep ci-test
just topic-describe ci-test 2>&1 | grep "PartitionCount: 1"
echo "✓ Topic operations OK"
- name: Produce and consume
working-directory: devkit
run: |
echo -e "ci-msg-1\nci-msg-2" | just produce ci-test
just consume ci-test --from-beginning --max-messages 2 --timeout-ms 15000 2>&1 | grep ci-msg-1
echo "✓ Produce/consume OK"
- name: Consumer group operations
working-directory: devkit
run: |
just group-list 2>&1 | grep -q "."
just group-describe ci-consumer 2>&1 || true # group may not exist yet, just verify command works
just broker-list 2>&1 | grep -q "node-0"
just broker-config 0 2>&1 | grep -q "advertised.listeners"
echo "✓ Consumer group and cluster operations OK"
- name: Bin passthrough
working-directory: devkit
run: |
just bin kafka-broker-api-versions.sh --bootstrap-server localhost:9092 2>&1 | grep -q "ApiVersion"
echo "✓ Bin passthrough OK"
- name: JMX operations
working-directory: devkit
run: |
just jmx -e domains 2>&1 | grep -q "kafka.server"
just jmx -e 'get -b kafka.server:name=BrokerState,type=KafkaServer Value' 2>&1 | grep -q "Value = 3"
echo "✓ JMX operations OK"
- name: Stop
if: always()
working-directory: devkit
run: just stop
full:
name: Full
needs: lint
if: ${{ github.event_name == 'pull_request' || inputs.level == 'full' }}
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- uses: extractions/setup-just@v2
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: ${{ runner.os }}-gradle-
- name: Gradle build
run: ./gradlew :core:build :tools:build :shell:build -x test
- name: Test tabletopic
working-directory: devkit
run: |
just start 1 tabletopic
just wait
curl -sf http://localhost:8181/v1/config > /dev/null
echo "✓ Iceberg REST OK"
for i in $(seq 1 30); do
curl -sf http://localhost:8081/ > /dev/null && echo "✓ Schema Registry OK" && break
sleep 5
done
grep -q "automq.table.topic" .devkit/config/node-0.properties
echo "✓ Tabletopic config merged"
just stop
- name: Test 4-node cluster (3 controller + 1 broker)
working-directory: devkit
run: |
just start 4
just wait
grep -q "process.roles=broker,controller" .devkit/config/node-0.properties
grep -q "process.roles=broker,controller" .devkit/config/node-1.properties
grep -q "process.roles=broker,controller" .devkit/config/node-2.properties
grep -q "^process.roles=broker$" .devkit/config/node-3.properties
grep -q "controller.quorum.voters=0@node-0:9093,1@node-1:9093,2@node-2:9093" .devkit/config/node-0.properties
echo "✓ Role configs correct"
just topic-create mixed-ci-test
just topic-describe mixed-ci-test 2>&1 | grep -E "Leader: [0123]"
echo "✓ Mixed cluster (3 controller + 1 broker) OK"
just perf-produce mixed-ci-test --num-records 100 --record-size 512 --throughput -1 2>&1 | grep -q "records sent"
echo "✓ Perf produce OK"
just arthas-exec 0 version 2>&1 | grep -q "arthas"
echo "✓ Arthas OK"
just chaos-delay 100 node-0
just chaos-status 2>&1 | grep -q "node-0"
just chaos-reset
just chaos-status 2>&1 | grep -q "minio"
echo "✓ Chaos OK"
just stop
- name: Test zerozone config
working-directory: devkit
run: |
just start 5 zerozone
grep -q "broker.rack=az-0" .devkit/config/node-0.properties
grep -q "broker.rack=az-1" .devkit/config/node-1.properties
grep -q "broker.rack=az-2" .devkit/config/node-2.properties
grep -q "broker.rack=az-0" .devkit/config/node-3.properties
grep -q "broker.rack=az-1" .devkit/config/node-4.properties
echo "✓ ZeroZone broker.rack round-robin OK"
just stop
- name: Cleanup
if: always()
working-directory: devkit
run: just clean