2525 - name : Run Helm unit tests
2626 run : make tests
2727
28- integration :
29- name : Integration Tests (K3s)
28+ k3s- integration-tests :
29+ name : K3s Integration Tests
3030 if : github.event.pull_request.head.repo.full_name == github.repository
3131 permissions :
3232 contents : ' read'
@@ -47,106 +47,169 @@ jobs:
4747 - name : Set release name
4848 run : echo "RELEASE_NAME=eoapi-$(echo "${{ github.sha }}" | cut -c1-8)" >> "$GITHUB_ENV"
4949
50+ - name : Wait for K3s to be fully ready
51+ run : |
52+ echo "=== Waiting for K3s to be fully ready ==="
53+
54+ # Wait for core K3s components to be ready
55+ echo "Waiting for kube-system pods to be ready..."
56+ kubectl wait --for=condition=Ready pod -l k8s-app=kube-dns -n kube-system --timeout=300s
57+ kubectl wait --for=condition=Ready pod -l app.kubernetes.io/name=traefik -n kube-system --timeout=300s
58+
59+ # Wait for API server to be fully responsive
60+ echo "Checking API server responsiveness..."
61+ kubectl get nodes
62+ kubectl get pods --all-namespaces
63+
64+ # Give K3s a moment to initialize all CRDs
65+ echo "Waiting for K3s initialization to complete..."
66+ sleep 10
67+
68+ echo "✅ K3s is ready"
69+
70+
71+ - name : Wait for Traefik to be ready
72+ run : |
73+ echo "=== Waiting for Traefik to be ready ==="
74+
75+ # Wait for Traefik pods to be ready first
76+ echo "Waiting for Traefik controller to be ready..."
77+ kubectl wait --for=condition=Ready pod -l app.kubernetes.io/name=traefik -n kube-system --timeout=300s
78+
79+ # Wait for essential Traefik CRDs to be available
80+ echo "Checking for Traefik CRDs..."
81+ timeout=300
82+ counter=0
83+ required_crds=("middlewares.traefik.io" "ingressroutes.traefik.io")
84+
85+ for crd in "${required_crds[@]}"; do
86+ echo "Checking for CRD: $crd"
87+ counter=0
88+ while [ $counter -lt $timeout ]; do
89+ if kubectl get crd "$crd" &>/dev/null; then
90+ echo "✅ $crd is available"
91+ break
92+ fi
93+ echo "⏳ Waiting for $crd... ($counter/$timeout)"
94+ sleep 3
95+ counter=$((counter + 3))
96+ done
97+
98+ if [ $counter -ge $timeout ]; then
99+ echo "❌ Timeout waiting for $crd"
100+ echo "Available Traefik CRDs:"
101+ kubectl get crd | grep traefik || echo "No Traefik CRDs found"
102+ echo "All CRDs:"
103+ kubectl get crd
104+ exit 1
105+ fi
106+ done
107+
108+ echo "✅ All required Traefik CRDs are ready"
109+
110+ - name : Pre-deployment debugging
111+ run : |
112+ echo "=== Pre-deployment State Check ==="
113+
114+ # Check basic cluster state
115+ echo "Cluster nodes:"
116+ kubectl get nodes -o wide
117+ echo ""
118+
119+ echo "All namespaces:"
120+ kubectl get namespaces
121+ echo ""
122+
123+ # Check PGO status
124+ echo "PostgreSQL Operator status:"
125+ kubectl get deployment pgo -o wide || echo "PGO not found"
126+ kubectl get pods -l postgres-operator.crunchydata.com/control-plane=postgres-operator -o wide || echo "No PGO pods found"
127+ echo ""
128+
129+ # Check for any existing knative-operator
130+ echo "Looking for knative-operator before deployment:"
131+ kubectl get deployment knative-operator --all-namespaces -o wide || echo "knative-operator not found yet"
132+ echo ""
133+
134+ # Check available helm repositories
135+ echo "Helm repositories:"
136+ helm repo list
137+ echo ""
138+
139+ # Check if eoapi namespace exists (shouldn't yet)
140+ echo "eoAPI namespace check:"
141+ kubectl get namespace eoapi || echo "eoapi namespace doesn't exist yet (expected)"
142+ echo ""
143+
144+ - name : Validate deployment script
145+ run : |
146+ echo "=== Script Validation ==="
147+ echo "Checking script exists and is executable:"
148+ ls -la scripts/deploy.sh
149+ echo ""
150+ echo "Testing script help:"
151+ ./scripts/deploy.sh --help
152+ echo ""
153+ echo "✅ Script validation complete"
154+
50155 - name : Deploy eoAPI
51156 id : deploy
52- continue-on-error : true
53157 run : |
54158 echo "=== Starting eoAPI deployment ==="
55- export RELEASE_NAME="$RELEASE_NAME"
159+ echo "Working directory: $(pwd)"
160+ echo "Environment: RELEASE_NAME=${RELEASE_NAME}, PGO_VERSION=${{ env.PGO_VERSION }}"
161+
162+ echo "Setting environment variables..."
163+ export RELEASE_NAME="${RELEASE_NAME}"
56164 export PGO_VERSION="${{ env.PGO_VERSION }}"
57165 export GITHUB_SHA="${{ github.sha }}"
166+
167+ echo "=== Executing deployment script ==="
58168 ./scripts/deploy.sh --ci
59169
60- - name : Check deployment status
61- id : check
62- if : steps.deploy.outcome == 'success'
170+ - name : Validate Helm dependencies
63171 run : |
64- echo "=== Checking deployment status ==="
65- export RELEASE_NAME="$RELEASE_NAME"
66- ./scripts/test.sh check-deployment --debug
172+ echo "=== Validating Helm Dependencies Post-Deployment ==="
67173
68- - name : Debug pgstac jobs if deployment failed
69- if : steps.deploy.outcome == 'failure'
70- continue-on-error : true
71- run : |
72- echo "=== Debugging pgstac job failures ==="
73-
74- # Check pgstac-migrate job
75- echo "===== pgstac-migrate Job Status ====="
76- kubectl get jobs -l app.kubernetes.io/name=pgstac-migrate -o wide || echo "No pgstac-migrate jobs found"
77-
78- MIGRATE_PODS=$(kubectl get pods -l app.kubernetes.io/name=pgstac-migrate -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
79- if [ -n "$MIGRATE_PODS" ]; then
80- for POD in $MIGRATE_PODS; do
81- echo "--- Logs from migrate pod $POD ---"
82- kubectl logs "$POD" --tail=100 || true
83- echo "--- Description of migrate pod $POD ---"
84- kubectl describe pod "$POD"
85- done
86- fi
87-
88- # Check pgstac-load-samples job
89- echo "===== pgstac-load-samples Job Status ====="
90- kubectl get jobs -l app.kubernetes.io/name=pgstac-load-samples -o wide || echo "No pgstac-load-samples jobs found"
91-
92- SAMPLES_PODS=$(kubectl get pods -l app.kubernetes.io/name=pgstac-load-samples -o jsonpath='{.items[*].metadata.name}' 2>/dev/null)
93- if [ -n "$SAMPLES_PODS" ]; then
94- for POD in $SAMPLES_PODS; do
95- echo "--- Logs from samples pod $POD ---"
96- kubectl logs "$POD" --tail=100 || true
97- echo "--- Description of samples pod $POD ---"
98- kubectl describe pod "$POD"
99- done
100- fi
174+ # Check helm repositories
175+ echo "Configured helm repositories:"
176+ helm repo list || echo "No repositories configured"
177+ echo ""
101178
102- # Check database status
103- echo "===== Database Pod Status ===== "
104- kubectl get pods -l postgres-operator.crunchydata.com/cluster -o wide
105- kubectl get postgrescluster -o wide
179+ # Check if Chart.lock files exist
180+ echo "Chart.lock files: "
181+ find charts/ -name "Chart.lock" -exec ls -la {} \; || echo "No Chart.lock files found"
182+ echo ""
106183
107- # Check ConfigMaps
108- echo "===== Relevant ConfigMaps ====="
109- kubectl get configmaps | grep -E "initdb|pgstac" || echo "No relevant configmaps found"
184+ # Check if dependencies were downloaded
185+ echo "Downloaded chart dependencies:"
186+ find charts/ -name "charts" -type d -exec ls -la {} \; || echo "No chart dependencies found"
187+ echo ""
110188
111- # Check for any related events
112- echo "===== Related Kubernetes Events ====="
113- kubectl get events | grep -E "pgstac|initdb" || echo "No relevant events found"
189+ # Check knative-operator specifically
190+ echo "Checking for knative-operator deployment:"
191+ kubectl get deployment knative-operator --all-namespaces -o wide || echo "knative-operator deployment not found"
192+ echo ""
114193
115- # Check notification system status
116- echo "===== Notification System Status ===== "
117- kubectl get deployments -l app.kubernetes.io/name= eoapi-notifier -o wide || echo "No eoapi-notifier deployment found "
118- kubectl get ksvc -l app.kubernetes.io/component=cloudevents-sink -o wide || echo "No Knative CloudEvents sink found "
194+ # Check helm release status
195+ echo "Helm release status: "
196+ helm status "$RELEASE_NAME" -n eoapi || echo "Release status unavailable "
197+ echo ""
119198
120- exit 1
199+ # Check eoAPI namespace resources
200+ echo "Resources in eoAPI namespace:"
201+ kubectl get all -n eoapi -o wide || echo "No resources in eoapi namespace"
121202
122203 - name : Run integration tests
123- if : steps.deploy.outcome == 'success'
124204 run : |
125205 echo "=== Running integration tests ==="
126206 export RELEASE_NAME="$RELEASE_NAME"
127207 ./scripts/test.sh integration --debug
128208
129- - name : Debug deployment status
130- if : always ()
209+ - name : Debug failed deployment
210+ if : failure ()
131211 run : |
132- echo "=== Final Deployment Status ==="
133- kubectl get pods -o wide
134- kubectl get jobs -o wide
135- kubectl get services -o wide
136- kubectl get ingress
137-
138- # Check notification system final status
139- echo "=== Notification System Final Status ==="
140- kubectl get deployments -l app.kubernetes.io/name=eoapi-notifier -o wide || echo "No eoapi-notifier deployment"
141- kubectl get pods -l app.kubernetes.io/name=eoapi-notifier -o wide || echo "No eoapi-notifier pods"
142- kubectl get ksvc -l app.kubernetes.io/component=cloudevents-sink -o wide || echo "No Knative CloudEvents sink"
143- kubectl get pods -l serving.knative.dev/service -o wide || echo "No Knative CloudEvents sink pods"
144-
145- # Show notification logs if they exist
146- echo "=== eoapi-notifier Logs ==="
147- kubectl logs -l app.kubernetes.io/name=eoapi-notifier --tail=20 || echo "No eoapi-notifier logs"
148- echo "=== Knative CloudEvents Sink Logs ==="
149- kubectl logs -l serving.knative.dev/service --tail=20 || echo "No Knative CloudEvents sink logs"
212+ ./scripts/debug-deployment.sh
150213
151214
152215 - name : Cleanup
0 commit comments