# Tekton Integration Testing Tekton Pipelines for running integration tests on API Gateway changes before merging to main. ## Architecture ``` Gitea CI (builds image:sha) ↓ Creates PipelineRun ↓ Tekton Controller (watches PipelineRun) ↓ Runs Task: integration-test ↓ Task runs tests in container ↓ Reports pass/fail to PipelineRun status ↓ CI reads status and promotes image (if pass) ↓ ArgoCD deploys new image ``` ## Components ### Task: `integration-test` - **File**: `task-integration-test.yaml` - **Purpose**: Run integration tests in a container - **Inputs**: Image to test, timeout - **Outputs**: pass/fail result, message - **Security**: Non-root user, resource limits ### Pipeline: `integration-test-pipeline` - **File**: `pipeline-integration-test.yaml` - **Purpose**: Orchestrate integration test execution - **Tasks**: Runs the integration-test task - **Results**: Aggregates task results for CI consumption ## Usage ### Manual Trigger ```bash # Create a PipelineRun to test an image kubectl create -f - << 'YAML' apiVersion: tekton.dev/v1 kind: PipelineRun metadata: name: integration-test-manual namespace: api spec: pipelineRef: name: integration-test-pipeline params: - name: image value: forgejo.riotpiao.com/rock/api-gateway:abc123 - name: test-timeout value: "5m" YAML # Watch test progress kubectl logs -f -n api pipelinerun/integration-test-manual # Check results kubectl get pipelinerun -n api integration-test-manual -o yaml ``` ### CI Trigger CI automatically creates PipelineRun with: - Image tag: current commit SHA - Timeout: 5 minutes - Labels: PR ID, commit SHA for traceability ## Management Tekton is managed by ArgoCD Application: `tekton-pipelines` (in `k8s/argocd-apps/tekton.yaml`) To update: 1. Edit manifest files 2. Commit to git 3. ArgoCD syncs automatically Do NOT manually apply manifests - let ArgoCD manage everything. ## Monitoring ```bash # List all PipelineRuns kubectl get pipelineruns -n api # Watch a specific run kubectl logs -f -n api pipelinerun/integration-test- # Get detailed status kubectl describe pipelinerun -n api integration-test- ``` ## Results PipelineRun status contains: - `status.conditions[0].reason`: Succeeded | Failed | Unknown - `status.taskRuns[*].status.taskResults`: Test outputs - Pod logs: Detailed test output ## Best Practices 1. **DRY**: Task and Pipeline are parameterized, reusable 2. **SOLID**: Single responsibility (Task runs tests, Pipeline orchestrates) 3. **GitOps**: Everything in git, managed by ArgoCD 4. **Security**: Non-root containers, resource limits, no hardcoded values 5. **Observability**: Clear logging, status tracking, result aggregation ## Troubleshooting **PipelineRun stuck in Running** - Check pod logs: `kubectl logs -n api pod/` - Check gateway availability: `kubectl get pods -n api -l app=api-gateway` - Increase timeout in pipeline params **Tests failing** - Check test logs: `kubectl logs -n api pipelinerun/` - Verify gateway is ready and accessible - Check downstream services (memory, S3, etc.) **Image not promoted** - CI only promotes if PipelineRun succeeds - Check PipelineRun status: `kubectl get pipelinerun -n api -o yaml` - Review CI logs in Gitea for error details