3232 - " !**.md"
3333 workflow_dispatch :
3434
35+ permissions :
36+ contents : read
37+
38+ concurrency :
39+ group : ${{ github.workflow }}-${{ github.ref }}
40+ cancel-in-progress : true
41+
3542jobs :
3643 deploy-with-helm :
3744 runs-on : ubuntu-latest
45+ timeout-minutes : 45
3846 strategy :
3947 fail-fast : false
4048 matrix :
41- database_type : ["mysql-builtin", "mysql-external"]
49+ database_type : ["mysql-builtin", "mysql-external", "postgresql-builtin", "postgresql-external" ]
4250 steps :
43- - name : Creating kind cluster
44- uses : container-tools/kind-action@v1
51+ - name : Checkout
52+ uses : actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
53+
54+ - name : Setup environment
55+ uses : ./.github/actions/setup-environment
4556
46- - name : Cluster information
57+ - name : Create kind cluster
58+ uses : ./.github/actions/kind-cluster
59+ with :
60+ cluster_name : devlake-${{ matrix.database_type }}
61+
62+ - name : Install external MySQL
63+ if : matrix.database_type == 'mysql-external'
4764 run : |
48- kubectl cluster-info
49- kubectl get nodes
50- kubectl get pods -n kube-system
51- helm version
52- kubectl version
53- kubectl get storageclasses
65+ DB_ROOT_PASSWORD=$(openssl rand -base64 16)
66+ DB_PASSWORD=$(openssl rand -base64 16)
67+ echo "::add-mask::${DB_ROOT_PASSWORD}"
68+ echo "::add-mask::${DB_PASSWORD}"
5469
55- - name : Checkout
56- uses : actions/checkout@v2
70+ # Retry logic for helm repo add (network flakiness)
71+ for i in {1..3}; do
72+ if helm repo add bitnami https://charts.bitnami.com/bitnami; then
73+ break
74+ else
75+ sleep $((2**i))
76+ fi
77+ done
78+
79+ helm install mysql bitnami/mysql --version 9.19.1 \
80+ --set auth.rootPassword="${DB_ROOT_PASSWORD}" \
81+ --set auth.database=lake \
82+ --set auth.username=devlake \
83+ --set auth.password="${DB_PASSWORD}"
5784
58- - name : Helm install devlake
85+ - name : Install external PostgreSQL
86+ if : matrix.database_type == 'postgresql-external'
87+ run : |
88+ DB_ROOT_PASSWORD=$(openssl rand -base64 16)
89+ DB_PASSWORD=$(openssl rand -base64 16)
90+ echo "::add-mask::${DB_ROOT_PASSWORD}"
91+ echo "::add-mask::${DB_PASSWORD}"
92+
93+ # Retry logic for helm repo add (network flakiness)
94+ for i in {1..3}; do
95+ if helm repo add bitnami https://charts.bitnami.com/bitnami; then
96+ break
97+ else
98+ sleep $((2**i))
99+ fi
100+ done
101+
102+ helm install postgresql bitnami/postgresql --version 12.12.10 \
103+ --set auth.postgresPassword="${DB_ROOT_PASSWORD}" \
104+ --set auth.database=lake \
105+ --set auth.username=devlake \
106+ --set auth.password="${DB_PASSWORD}"
107+
108+ - name : Install DevLake (MySQL external)
59109 if : matrix.database_type == 'mysql-external'
60110 run : |
61- helm repo add bitnami https://charts.bitnami.com/bitnami
62- helm repo add grafana https://grafana.github.io/helm-charts
63- helm install mysql bitnami/mysql --version 9.19.1 --set auth.rootPassword=admin --set auth.database=lake --set auth.username=merico --set auth.password=merico
64- # external mysql at service: mysql
65- helm dep build charts/devlake
111+ DB_PASSWORD=$(openssl rand -base64 16)
112+ ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc '[:upper:]' | fold -w 128 | head -n 1)
113+ echo "::add-mask::${DB_PASSWORD}"
114+ echo "::add-mask::${ENCRYPTION_SECRET}"
115+ NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
116+ echo "Node IP: ${NODE_IP}"
66117 helm install --debug --wait --timeout 2400s deploy-test charts/devlake \
67118 --set service.uiPort=30000 \
68- --set mysql.useExternal=true \
69- --set mysql.externalServer=mysql \
70- --set lake.encryptionSecret.secret=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
119+ --set database.type=mysql \
120+ --set database.useExternal=true \
121+ --set database.externalServer=mysql \
122+ --set database.externalPort=3306 \
123+ --set database.username=devlake \
124+ --set database.password="${DB_PASSWORD}" \
125+ --set database.database=lake \
126+ --set lake.encryptionSecret.secret="${ENCRYPTION_SECRET}"
71127
72- - name : Helm install devlake
128+ - name : Install DevLake (MySQL builtin)
73129 if : matrix.database_type == 'mysql-builtin'
74130 run : |
75- helm repo add grafana https://grafana.github.io/helm-charts
76- helm dep build charts/devlake
77- export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
78- echo Node IP: ${NODE_IP}
131+ DB_ROOT_PASSWORD=$(openssl rand -base64 16)
132+ DB_PASSWORD=$(openssl rand -base64 16)
133+ ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc '[:upper:]' | fold -w 128 | head -n 1)
134+ echo "::add-mask::${DB_ROOT_PASSWORD}"
135+ echo "::add-mask::${DB_PASSWORD}"
136+ echo "::add-mask::${ENCRYPTION_SECRET}"
137+ NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
138+ echo "Node IP: ${NODE_IP}"
139+ helm install --debug --wait --timeout 2400s deploy-test charts/devlake \
140+ --set service.uiPort=30000 \
141+ --set database.type=mysql \
142+ --set database.useExternal=false \
143+ --set database.username=devlake \
144+ --set database.password="${DB_PASSWORD}" \
145+ --set database.database=lake \
146+ --set database.mysql.rootPassword="${DB_ROOT_PASSWORD}" \
147+ --set database.image.tag=8-debian \
148+ --set lake.encryptionSecret.secret="${ENCRYPTION_SECRET}"
149+
150+ - name : Install DevLake (PostgreSQL external)
151+ if : matrix.database_type == 'postgresql-external'
152+ run : |
153+ DB_PASSWORD=$(openssl rand -base64 16)
154+ ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc '[:upper:]' | fold -w 128 | head -n 1)
155+ echo "::add-mask::${DB_PASSWORD}"
156+ echo "::add-mask::${ENCRYPTION_SECRET}"
157+ NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
158+ echo "Node IP: ${NODE_IP}"
79159 helm install --debug --wait --timeout 2400s deploy-test charts/devlake \
80160 --set service.uiPort=30000 \
81- --set mysql.image.tag=8-debian \
82- --set lake.encryptionSecret.secret=$(openssl rand -base64 2000 | tr -dc 'A-Z' | fold -w 128 | head -n 1)
161+ --set database.type=postgresql \
162+ --set database.useExternal=true \
163+ --set database.externalServer=postgresql \
164+ --set database.externalPort=5432 \
165+ --set database.username=devlake \
166+ --set database.password="${DB_PASSWORD}" \
167+ --set database.database=lake \
168+ --set grafana.enabled=false \
169+ --set lake.encryptionSecret.secret="${ENCRYPTION_SECRET}"
170+
171+ - name : Install DevLake (PostgreSQL builtin)
172+ if : matrix.database_type == 'postgresql-builtin'
173+ run : |
174+ DB_PASSWORD=$(openssl rand -base64 16)
175+ ENCRYPTION_SECRET=$(openssl rand -base64 2000 | tr -dc '[:upper:]' | fold -w 128 | head -n 1)
176+ echo "::add-mask::${DB_PASSWORD}"
177+ echo "::add-mask::${ENCRYPTION_SECRET}"
178+ NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
179+ echo "Node IP: ${NODE_IP}"
180+ helm install --debug --wait --timeout 2400s deploy-test charts/devlake \
181+ --set service.uiPort=30000 \
182+ --set database.type=postgresql \
183+ --set database.useExternal=false \
184+ --set database.username=devlake \
185+ --set database.password="${DB_PASSWORD}" \
186+ --set database.database=lake \
187+ --set grafana.enabled=false \
188+ --set lake.encryptionSecret.secret="${ENCRYPTION_SECRET}"
83189
84190 - name : List cluster resources
85191 if : ${{ always() }}
@@ -94,16 +200,16 @@ jobs:
94200 # TODO: using some e2e test code to replace it
95201 - name : Curl with endpoints
96202 run : |
97- export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
203+ NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
98204 failed=0
99- for retry in {1..10} ; do
205+ for _ in {1..10} ; do
100206 failed=0
101207 # home
102- curl --fail http://${NODE_IP}:30000 || failed=1
208+ curl --fail " http://${NODE_IP}:30000" || failed=1
103209 # API for devlake
104- curl --fail http://${NODE_IP}:30000/api/blueprints || failed=1
210+ curl --fail " http://${NODE_IP}:30000/api/blueprints" || failed=1
105211 # API for grafana
106- curl --fail http://${NODE_IP}:30000/grafana/api/health || failed=1
212+ curl --fail " http://${NODE_IP}:30000/grafana/api/health" || failed=1
107213 if [ $failed -eq 0 ] ; then
108214 break
109215 else
@@ -115,12 +221,34 @@ jobs:
115221 exit 1
116222 fi
117223
224+ - name : Dump diagnostics on failure
225+ if : failure()
226+ run : |
227+ echo "=== Helm status for release ==="
228+ helm status deploy-test || true
229+ echo "=== Kubernetes resources (all) ==="
230+ kubectl get all -o wide || true
231+ echo "=== Kubernetes events (latest 200) ==="
232+ kubectl get events --sort-by=.lastTimestamp | tail -n 200 || true
233+ echo "=== Describe deployments/statefulsets ==="
234+ kubectl describe deploy || true
235+ kubectl describe statefulset || true
236+ echo "=== Describe pods ==="
237+ kubectl describe pods || true
238+ echo "=== Logs from all pods (current and previous, last 200 lines) ==="
239+ for pod in $(kubectl get pods -o jsonpath='{.items[*].metadata.name}'); do
240+ echo "----- logs for ${pod} -----"
241+ kubectl logs "$pod" --all-containers --tail=200 || true
242+ echo "----- previous logs for ${pod} -----"
243+ kubectl logs "$pod" --all-containers --previous --tail=200 || true
244+ done
245+
118246 - name : Show logs for pods
119247 if : ${{ always() }}
120248 run : |
121249 for pod in $(kubectl get pods -o jsonpath='{.items[*].metadata.name}') ; do
122- echo describe for $pod
123- kubectl describe pod $pod
124- echo logs for $pod
125- kubectl logs $pod || echo ""
250+ echo " describe for ${ pod}"
251+ kubectl describe pod " $pod"
252+ echo " logs for ${ pod}"
253+ kubectl logs " $pod" || echo ""
126254 done
0 commit comments