2025-04-30 07:14:38 +00:00

139 lines
4.6 KiB
YAML

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
- name: CARGO_HOME
value: /workspace/base/$(params.context)/home/.cargo
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 clap_builder --version 4.5.37
cargo install clap --version 4.5.37 --features derive,color
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!"