135 lines
4.5 KiB
YAML
135 lines
4.5 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
|
|
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
|
|
mkdir -p ~/.cargo/bin
|
|
curl -L https://github.com/xd009642/tarpaulin/releases/latest/download/cargo-tarpaulin-x86_64-unknown-linux-gnu.tar.gz | tar xz -C ~/.cargo/bin
|
|
chmod +x ~/.cargo/bin/cargo-tarpaulin
|
|
|
|
##############################
|
|
# 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!" |