turingears/gitlab-scanner

By turingears

Updated 4 months ago

Imagen para generar badget con la calidad del codigo proporcionada por gitlab

Image
Integration & Delivery

26

Dockerfile

Dockerfile para la construcción de la imagen Docker

FROM alpine:3.18

WORKDIR /app
RUN apk add --no-cache \
    curl \
    jq

COPY badges.sh /app/badges.sh

RUN chmod +x /app/badges.sh

CMD ["sh", "-c", "source /app/badges.sh"]

Docker run

docker run --rm \
  -v $(pwd)/gl-code-quality-report.json:/app/gl-code-quality-report.json \
  -e PRIVATE_TOKEN=${TOKEN_GT} \
  -e PIPELINE_ID=${CI_PIPELINE_ID} \
  -e PROJECT_ID=${CI_PROJECT_ID} \
  turingears/gitlab-scanner:latest

Script

Este script se utiliza para crear los badges según su severidad y luego crear o actualizar en Gitlab a través de su api.

#!/bin/bash

json_data=$(cat gl-code-quality-report.json)

blocker_count=$(echo "$json_data" | jq '[.[] | select(.severity == "blocker")] | length')
critical_count=$(echo "$json_data" | jq '[.[] | select(.severity == "critical")] | length')
major_count=$(echo "$json_data" | jq '[.[] | select(.severity == "major")] | length')
minor_count=$(echo "$json_data" | jq '[.[] | select(.severity == "minor")] | length')
info_count=$(echo "$json_data" | jq '[.[] | select(.severity == "info")] | length')

generate_badge() {
    local count="$1"
    local severity="$2"
    local color="$3"
    local badge_name="Code Quality ($severity)"
    local link_url="https://gitlab.com/%{project_path}/-/pipelines/${PIPELINE_ID}/codequality_report"
    local image_url

    if [ $count -gt 0 ]; then
        image_url="https://img.shields.io/badge/Code_Quality_${severity}-${count}_found-${color}"
    else
        image_url="https://img.shields.io/badge/Code_Quality_${severity}-passed-ligthgreen"
    fi

    update_or_create_badge "$badge_name" "$link_url" "$image_url"
}

update_or_create_badge() {
    local badge_name="$1"
    local link_url="$2"
    local image_url="$3"

    GITLAB_API_URL="https://gitlab.com/api/v4"
    PROJECT_ID=${PROJECT_ID}
    PRIVATE_TOKEN=${PRIVATE_TOKEN}

    LIST_ENDPOINT="$GITLAB_API_URL/projects/$PROJECT_ID/badges"

    response=$(curl --silent -H "PRIVATE-TOKEN: $PRIVATE_TOKEN" "$LIST_ENDPOINT")

    badge_id=$(echo "$response" | jq -r ".[] | select(.name==\"$badge_name\") | .id")

    if [ -n "$badge_id" ]; then
        UPDATE_ENDPOINT="$LIST_ENDPOINT/$badge_id"
        curl -X PUT "$UPDATE_ENDPOINT" \
            --silent -H "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
            --data-urlencode "name=$badge_name" \
            --data-urlencode "link_url=$link_url" \
            --data-urlencode "image_url=$image_url" > /dev/null 2>&1

        echo "Badge '$badge_name' actualizado exitosamente."
    else
        curl -X POST "$LIST_ENDPOINT" \
            --silent -H "PRIVATE-TOKEN: $PRIVATE_TOKEN" \
            --data-urlencode "name=$badge_name" \
            --data-urlencode "link_url=$link_url" \
            --data-urlencode "image_url=$image_url" > /dev/null 2>&1

        echo "Badge '$badge_name' creado exitosamente."
    fi
}

generate_badge "$blocker_count" "Blocker" "ff0000"
generate_badge "$critical_count" "Critical" "red"
generate_badge "$major_count" "Major" "orange"
generate_badge "$minor_count" "Minor" "yellow"
generate_badge "$info_count" "Info" "blue"

Docker Pull Command

docker pull turingears/gitlab-scanner