test: production ingest E2E test suite with enhanced logging #55

Open
poimen wants to merge 34 commits from feat/production-ingest-test-logging into main
2 changed files with 157 additions and 25 deletions
Showing only changes of commit ec2c1b21e6 - Show all commits
+35 -24
View File
@@ -86,65 +86,76 @@ jobs:
env: env:
KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }} KUBECONFIG_B64: ${{ secrets.KUBECONFIG_B64 }}
- name: Trigger Tekton TaskRun (integration tests) - name: Trigger Tekton PipelineRun (CI/CD)
id: tekton id: tekton
run: | run: |
SHA="${{ steps.sha.outputs.short_sha }}" SHA="${{ steps.sha.outputs.short_sha }}"
RUN_NAME="integration-test-${SHA}" RUN_NAME="poimen-ci-${SHA}"
NAMESPACE="poimen" NAMESPACE="poimen"
IMAGE="${REGISTRY}/riotpiao-poimen/poimen-memory:${SHA}" IMAGE="${REGISTRY}/riotpiao-poimen/poimen-memory:${SHA}"
REGISTRY_USER="${{ secrets.FORGEJO_REGISTRY_USER }}"
REGISTRY_TOKEN="${{ secrets.FORGEJO_REGISTRY_TOKEN }}"
echo "Triggering Tekton TaskRun: ${RUN_NAME}" echo "Triggering Tekton PipelineRun: ${RUN_NAME}"
echo "Image: ${IMAGE}" echo "Image: ${IMAGE}"
echo "" echo ""
# Create TaskRun # Create PipelineRun
cat <<YAML | kubectl create -f - cat <<YAML | kubectl create -f -
apiVersion: tekton.dev/v1 apiVersion: tekton.dev/v1
kind: TaskRun kind: PipelineRun
metadata: metadata:
name: ${RUN_NAME} name: ${RUN_NAME}
namespace: ${NAMESPACE} namespace: ${NAMESPACE}
labels: labels:
commit-sha: "${SHA}" commit-sha: "${SHA}"
spec: spec:
taskRef: pipelineRef:
name: poimen-integration-test name: poimen-ci
params: params:
- name: image - name: image
value: "${IMAGE}" value: "${IMAGE}"
- name: registry-user
value: "${REGISTRY_USER}"
- name: registry-token
value: "${REGISTRY_TOKEN}"
YAML YAML
echo "✓ TaskRun created" echo "✓ PipelineRun created"
echo "" echo ""
echo "Waiting for completion (timeout 5m)..." echo "Waiting for completion (timeout 10m)..."
# Wait for TaskRun to complete # Wait for PipelineRun to complete
if kubectl wait taskrun/${RUN_NAME} -n ${NAMESPACE} \ if kubectl wait pipelinerun/${RUN_NAME} -n ${NAMESPACE} \
--for=condition=Succeeded --timeout=5m 2>/dev/null; then --for=condition=Succeeded --timeout=600s 2>/dev/null; then
echo "result=pass" >> $GITHUB_OUTPUT echo "result=pass" >> $GITHUB_OUTPUT
echo "✓ Tests passed" echo "✓ Pipeline passed"
else else
echo "result=fail" >> $GITHUB_OUTPUT echo "result=fail" >> $GITHUB_OUTPUT
echo "✗ Tests failed or timed out" echo "✗ Pipeline failed or timed out"
fi fi
# Print test summary # Print pipeline summary
echo "" echo ""
echo "=== TaskRun Status ===" echo "=== PipelineRun Status ==="
REASON=$(kubectl get taskrun ${RUN_NAME} -n ${NAMESPACE} \ kubectl describe pipelinerun ${RUN_NAME} -n ${NAMESPACE} | tail -30
-o jsonpath='{.status.conditions[0].reason}')
SUMMARY=$(kubectl get taskrun ${RUN_NAME} -n ${NAMESPACE} \ # Print task results
-o jsonpath='{.status.results[?(@.name=="summary")].value}') echo ""
echo "Status: ${REASON}" echo "=== Task Results ==="
SUMMARY=$(kubectl get pipelinerun ${RUN_NAME} -n ${NAMESPACE} \
-o jsonpath='{.status.taskRuns[*].status.taskResults[?(@.name=="summary")].value}')
echo "Summary: ${SUMMARY}" echo "Summary: ${SUMMARY}"
# Print logs # Print logs from integration-tests task
echo "" echo ""
echo "=== Test Logs ===" echo "=== Integration Test Logs ==="
POD=$(kubectl get pod -n ${NAMESPACE} \ POD=$(kubectl get pod -n ${NAMESPACE} \
-l tekton.dev/taskRun=${RUN_NAME} -o name | head -1) -l tekton.dev/pipelineRun=${RUN_NAME} -l tekton.dev/pipelineTask=integration-tests \
-o name | head -1)
if [ -n "$POD" ]; then
kubectl logs -n ${NAMESPACE} "${POD}" -c step-test 2>/dev/null | tail -200 || true kubectl logs -n ${NAMESPACE} "${POD}" -c step-test 2>/dev/null | tail -200 || true
fi
- name: Gate on test result - name: Gate on test result
if: steps.tekton.outputs.result != 'pass' if: steps.tekton.outputs.result != 'pass'
+121
View File
@@ -0,0 +1,121 @@
---
# Tekton Pipeline: Poimen Memory Service CI/CD
#
# Orchestrates:
# 1. integration-test-task: Run integration tests against image
# 2. (Future) build-task: Build Docker image
# 3. (Future) promote-task: Promote image to :latest
#
# Parameters:
# - image: Docker image with SHA to test
# - registry-user: Registry credentials
# - registry-token: Registry credentials
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: poimen-ci
namespace: poimen
spec:
params:
- name: image
type: string
description: "Docker image SHA to test (e.g., forgejo.riotpiao.com/riotpiao-poimen/poimen-memory:abc123)"
- name: registry-user
type: string
description: "Registry username"
default: ""
- name: registry-token
type: string
description: "Registry token/password"
default: ""
tasks:
# Task 1: Integration Tests
- name: integration-tests
taskRef:
name: poimen-integration-test
params:
- name: image
value: $(params.image)
# Task 2: Gate on test results
- name: gate-on-tests
runAfter:
- integration-tests
taskSpec:
steps:
- name: check-results
image: alpine:latest
script: |
#!/bin/sh
set -e
echo "✓ Integration tests passed, proceeding with promotion"
# Task 3: Promote image (placeholder - will be implemented)
- name: promote-image
runAfter:
- gate-on-tests
taskSpec:
params:
- name: image
type: string
- name: registry-user
type: string
- name: registry-token
type: string
steps:
- name: promote
image: docker:latest
env:
- name: IMAGE
value: $(params.image)
- name: REGISTRY_USER
value: $(params.registry-user)
- name: REGISTRY_TOKEN
value: $(params.registry-token)
script: |
#!/bin/sh
set -e
echo "Promoting image to :latest..."
# Extract registry and repo from image
# e.g., forgejo.riotpiao.com/riotpiao-poimen/poimen-memory:abc123
REGISTRY=$(echo $IMAGE | cut -d/ -f1)
REPO=$(echo $IMAGE | cut -d: -f1)
SHA=$(echo $IMAGE | cut -d: -f2)
echo "Registry: $REGISTRY"
echo "Repo: $REPO"
echo "SHA: $SHA"
echo ""
# Login and promote
echo "$REGISTRY_TOKEN" | docker login -u "$REGISTRY_USER" --password-stdin "$REGISTRY"
docker pull "$IMAGE"
docker tag "$IMAGE" "${REPO}:latest"
docker push "${REPO}:latest"
echo "✓ Promoted to :latest"
params:
- name: image
value: $(params.image)
- name: registry-user
value: $(params.registry-user)
- name: registry-token
value: $(params.registry-token)
finally:
- name: cleanup
taskSpec:
steps:
- name: cleanup-tasks
image: alpine:latest
script: |
#!/bin/sh
echo "Pipeline execution complete"