apiVersion: tekton.dev/v1 kind: Task metadata: name: rust-nx-analysis spec: params: - name: context type: string description: Context directory default: "" - name: source type: string default: "source" description: Source directory (sub directory of context) - name: workspaceName type: string description: Nx workspace name to lint and test - name: targetProjects type: string description: Comma-separated list of Nx workspace project names to lint and test (e.g., "api-client-request,openapi-project") workspaces: - name: base description: Git-cloned source code with Nx monorepo results: - name: coverage-dir description: Comma-separated paths to generated coverage directories - name: coverage-html description: Comma-separated paths to generated HTML coverage report directories steps: - name: analyze image: rust:1.86-slim workingDir: /workspace/base/$(params.context)/$(params.source)/$(params.workspaceName) env: - name: HOME value: /workspace/base/$(params.context)/home script: | #!/bin/bash set -e echo "πŸš€ Starting Rust + Nx Analysis" ############################## # Install system dependencies ############################## apt-get update && apt-get install -y curl libssl-dev pkg-config build-essential jq curl -fsSL https://deb.nodesource.com/setup_20.x | bash - apt-get install -y nodejs ############################## # Install Rust tools ############################## rustup component add clippy # Install cargo-tarpaulin via prebuilt binary export PATH="$HOME/.cargo/bin:$PATH" cargo install cargo-tarpaulin --locked ############################## # Install pnpm globally ############################## npm install -g pnpm@10.8.1 ############################## # Install Nx dependencies ############################## pnpm install --frozen-lockfile ############################## # Version checks ############################## echo "βœ… Version Info:" rustc --version cargo --version node --version npm --version pnpm --version ############################## # Lint and Test ############################## export NX_SOCKET_DIR=/tmp/nx-socket # Convert comma-separated targetProjects to space-separated for Bash PROJECTS=$(echo "$(params.targetProjects)" | tr ',' ' ') echo "πŸ” Running lint for projects: $PROJECTS" pnpm nx run-many --target=lint --projects="$(params.targetProjects)" --parallel=4 echo "πŸ§ͺ Running tests for projects: $PROJECTS" pnpm nx run-many --target=test --projects="$(params.targetProjects)" --parallel=4 ############################## # Coverage ############################## COVERAGE_DIRS="" HTML_DIRS="" for project in $PROJECTS; do echo "πŸ“Š Generating coverage for project: $project" PROJECT_PATH=$(pnpm nx show project "$project" --json | jq -r '.root') cd "$PROJECT_PATH" # Run tarpaulin for coverage cargo tarpaulin --out Html --output-dir coverage --timeout 120 COVERAGE_DIR="coverage" HTML_DIR="$COVERAGE_DIR/html" # Append to results (comma-separated) if [ -z "$COVERAGE_DIRS" ]; then COVERAGE_DIRS="$PROJECT_PATH/$COVERAGE_DIR" HTML_DIRS="$PROJECT_PATH/$HTML_DIR" else COVERAGE_DIRS="$COVERAGE_DIRS,$PROJECT_PATH/$COVERAGE_DIR" HTML_DIRS="$HTML_DIRS,$PROJECT_PATH/$HTML_DIR" fi if [ -d "$HTML_DIR" ]; then echo "πŸ“„ HTML coverage report generated at $HTML_DIR" else echo "⚠️ HTML coverage report not found for $project" fi # λŒμ•„κ°€κΈ° cd /workspace/base/$(params.context)/$(params.source)/$(params.workspaceName) done ############################## # Output to Tekton results ############################## echo "$COVERAGE_DIRS" > /tekton/results/coverage-dir echo "$HTML_DIRS" > /tekton/results/coverage-html echo "πŸŽ‰ Rust + Nx Analysis Task Completed!"