Skip to main content

running-tests

Run linters, formatting checks, and e2e tests for tektoncd/catalog. Use when verifying a code change, preparing a PR, debugging a test failure, or checking overall project health. Covers yamllint, gofmt, single-task e2e via run-test.sh, and full CI e2e suite with Kind cluster.

Datos de origen

Repositorio
tektoncd/catalog
Última actividad en el origen
8 de junio de 2026 a las 07:38
Idioma detectado de SKILL.md
inglés
Estrellas
735
Forks
602

Opciones de instalación

De forma predeterminada está seleccionado el prompt que primero revisa el origen. Puedes cambiar a un comando directo o descargar una copia local.

Revisa los archivos de origen

Lee SKILL.md y los archivos complementarios que muestra SkillsMP antes de decidir si quieres instalarlo.

Mostrando SKILL.md

SKILL.md
Instrucciones de origen · Vista previa de solo lectura
name
running-tests
description
Run linters, formatting checks, and e2e tests for tektoncd/catalog. Use when verifying a code change, preparing a PR, debugging a test failure, or checking overall project health. Covers yamllint, gofmt, single-task e2e via run-test.sh, and full CI e2e suite with Kind cluster.
license
Apache-2.0
compatibility
Requires yamllint, go, kubectl; e2e tests also require kind, ko, and a container runtime
metadata
{"project":"tekton-catalog"}
allowed-tools
Bash(yamllint:*) Bash(gofmt:*) Bash(go test:*) Bash(./test/*) Bash(./hack/*) Bash(kubectl:*) Read Grep
# Running Tests ## Linting ### YAML Lint All YAML files must pass yamllint with the project's `.yamllint` config: ```bash # Lint all YAML files in the repo yamllint -c .yamllint $(find . -type f -regex ".*y[a]ml" -print) # Lint a specific task directory yamllint -c .yamllint task/git-clone/0.9/ # Install yamllint if not present pip install yamllint ``` The `.yamllint` config ignores `vendor/` and `hack/`, disables line-length and document-start rules, and treats `truthy` and `comments` as warnings. ### Go Formatting Go files (test infrastructure only) must be formatted: ```bash # Check for formatting issues gofmt -d $(find * -name '*.go' ! -path 'vendor/*' ! -path 'third_party/*') ``` If `gofmt` produces any diff, the CI will reject the PR. ## e2e Tests ### Single Task Test Test a single task locally using the test runner script. Requires a running Kubernetes cluster with Tekton Pipelines installed: ```bash # Syntax: ./test/run-test.sh <kind> <name> <version> ./test/run-test.sh task git-clone 0.9 ./test/run-test.sh task kaniko 0.6 ./test/run-test.sh task buildah 0.7 ``` The test runner: 1. Creates a random namespace 2. Applies the task YAML 3. Applies all YAML files in `<kind>/<name>/<version>/tests/` 4. Waits for TaskRun/PipelineRun completion 5. Reports pass/fail **Note**: CI only tests tasks that were added or modified in the PR, unless `TEST_RUN_ALL_TESTS` is set. ### Test Directory Structure Each task version can have a `tests/` directory: ``` task/<name>/<version>/tests/ run.yaml # TaskRun or PipelineRun to execute pre-apply-task-hook.sh # optional: runs before applying the Task pre-apply-taskrun-hook.sh # optional: runs before applying test YAMLs fixtures/ # optional: go-rest-api-test rules rules.yaml ``` ### Pre-Apply Hook Scripts Hook scripts run via `source`, so they can export environment variables: #### pre-apply-task-hook.sh Runs before the Task is applied. Use for: - Modifying the Task YAML for test purposes - Setting up prerequisites in the namespace - Creating ConfigMaps, Secrets, or other resources #### pre-apply-taskrun-hook.sh Runs before TaskRun/PipelineRun YAMLs are applied. Use for: - Creating test resources (PVCs, Secrets) - Setting up services (registries, mock APIs) - Modifying TaskRun parameters ### Helper Functions Available in hook scripts (sourced from plumbing): | Function | Purpose | |----------|---------| | `add_sidecar_registry` | Adds a container registry sidecar for image builder tasks | | `add_sidecar_secure_registry` | Adds a TLS-secured registry sidecar with cert ConfigMap | | `add_task` | Installs another catalog task into the test namespace. Args: `<name> <version>` (use `latest` for latest version) | ### Fixtures-Based Testing For tasks that call external REST APIs (e.g. GitHub, Jira), use [go-rest-api-test](https://github.com/chmouel/go-rest-api-test) fixtures: 1. Create `tests/fixtures/` directory with YAML rules: ```yaml --- headers: method: POST path: /repos/{repo:[^/]+/[^/]+}/issues/{issue:[0-9]+}/comments response: status: 200 output: '{"status": 200}' content-type: text/json ``` 2. The test runner auto-detects the `fixtures/` directory and spins up a go-rest-api-test sidecar on `http://localhost:8080` 3. Override the API host URL parameter in your TaskRun: ```yaml params: - name: GITHUB_HOST_URL value: http://localhost:8080 ``` **Requirement**: The task must support overriding the API URL via a parameter. ## Full CI Suite ### Local Kind Cluster Spin up a full CI-like environment locally: ```bash ./hack/setup-kind.sh \ --registry-url registry.local:5000 \ --cluster-suffix cluster.local \ --nodes 1 \ --pipeline-version v1.9.0 \ --e2e-script ./test/e2e-tests.sh \ --e2e-env ./test/e2e-tests-kind-gha.env ``` This script: 1. Creates a Kind cluster with a local registry 2. Installs Tekton Pipelines at the specified version 3. Runs the e2e test suite ### CI Pipeline GitHub Actions (`.github/workflows/ci.yaml`) runs: - **linting** job: `yamllint` + `gofmt` - **e2e-tests** job: matrix of Tekton Pipeline versions: - `latest` (v1.9.0) - `lts-latest` (v1.9.0) - `lts-latest-minus-one` (v1.6.0) - `lts-latest-minus-two` (v1.3.0) - `lts-latest-minus-three` (v1.0.0) ### Replicating CI Locally ```bash # Linting (always run before pushing) yamllint -c .yamllint $(find . -type f -regex ".*y[a]ml" -print) gofmt -d $(find * -name '*.go' ! -path 'vendor/*' ! -path 'third_party/*') # Single task e2e (requires cluster) ./test/run-test.sh task <name> <version> ``` Both linting checks must pass before requesting a review. ## Interpreting Test Failures - **yamllint failures**: Fix YAML formatting issues (indentation, trailing whitespace, truthy values) - **gofmt failures**: Run `gofmt -w <file>` to auto-fix - **e2e test timeout**: Check if the TaskRun is stuck — inspect pod logs with `kubectl logs` and events with `kubectl describe taskrun` - **Pre-apply hook failures**: Check that all required tools are available in the test-runner image - **Fixtures test failures**: Verify the fixture rules match the actual API calls made by the task ## Debugging Running TaskRuns When a TaskRun is failing or stuck: ```bash # List TaskRuns in the test namespace kubectl get taskrun -n <namespace> # Describe a specific TaskRun (shows conditions, events, pod name) kubectl describe taskrun <name> -n <namespace> # Get the pod created by the TaskRun kubectl get pods -n <namespace> -l tekton.dev/taskRun=<name> # Stream logs from a running step container kubectl logs -n <namespace> <pod-name> -c step-<step-name> -f # If pod is in Pending/ImagePullBackOff — check events kubectl describe pod <pod-name> -n <namespace> # Check if Tekton controller is healthy kubectl get pods -n tekton-pipelines # Get all events in namespace sorted by time kubectl get events -n <namespace> --sort-by='.lastTimestamp' ``` Common failure patterns: - **Pending pod**: Usually a resource quota, missing PVC, or node scheduling issue - **ImagePullBackOff**: Bad image reference — check digest/tag and registry access - **step container OOMKilled**: Increase resource limits or reduce workload - **Script exit code non-zero**: Read step logs for the actual error - **Timeout**: TaskRun default timeout is 1h; check if the script is hung (e.g. waiting for input, network call blocked) ## Kind Cluster Lifecycle ### Setup ```bash # Full setup with Tekton Pipelines (used by CI) ./hack/setup-kind.sh \ --registry-url registry.local:5000 \ --cluster-suffix cluster.local \ --nodes 1 \ --pipeline-version v1.9.0 \ --e2e-script ./test/e2e-tests.sh \ --e2e-env ./test/e2e-tests-kind-gha.env # Minimal setup for local testing (just cluster + Tekton) kind create cluster --name tekton-catalog-test kubectl apply --filename https://github.com/tektoncd/pipeline/releases/download/v1.0.0/release.yaml kubectl wait --for=condition=ready pod -l app=tekton-pipelines-controller -n tekton-pipelines --timeout=60s ``` ### Teardown ```bash # Delete the Kind cluster kind delete cluster --name tekton-catalog-test # If using the CI script's default cluster name kind delete cluster --name tekton # Clean up leftover Docker networks (if Kind didn't clean up) docker network prune -f ``` ### Iterating Without Full Teardown When debugging a single task, you can reuse the cluster: ```bash # Delete all TaskRuns in a namespace kubectl delete taskrun --all -n <namespace> # Delete and recreate just the task under test kubectl delete task <name> -n <namespace> kubectl apply -f task/<name>/<version>/<name>.yaml -n <namespace> # Re-run the test ./test/run-test.sh task <name> <version> ``` ## Environment Variables | Variable | Default | Purpose | |----------|---------|---------| | `PIPELINE_VERSION` | `v1.1.0` | Tekton Pipelines version for e2e tests | | `KO_DOCKER_REPO` | _(required for Kind)_ | Image registry for ko builds | | `TEST_RUN_ALL_TESTS` | _(unset)_ | Set to run tests for all tasks, not just changed ones | | `MAX_NUMBERS_OF_PARALLEL_TASKS` | `3` | Max parallel e2e test tasks (0-indexed, so 3 = 4 parallel) |
Ver en GitHub