Estrutura de Submissão e Fluxo de Trabalho
Para implementar um sistema de correção automática, é fundamental estabelecer um padrão de entrega. O modelo sugerido utiliza o Gitee (ou qualquer servidor Git) como repositório central:
- Padronização de Projeto: O docente disponibiliza um repositório base com a estrutura de diretórios definida. Isso evita que cada estudante crie uma organização própria, facilitando a automação.
- Organização por Branches: Cada aluno deve criar uma branch seguindo o padrão
ID_XXX(onde XXX são os últimos dígitos da matrícula) e realizar opushde seu código para essa branch específica. - Conformidade de Interface: Os nomes de arquivos, funções e formatos de entrada/saída devem seguir rigorosamente a especificação fornecida para que os scripts de teste funcionem corretaemnte.
Script de Orquestração: grade_engine.sh
Este script é responsável por clonar o repositório, iterar sobre as branches de cada aluno e consolidar os resultados em um arquivo CSV. Ele deve ser mantido na raiz do ambiente de correção.
#!/bin/bash
# Script: grade_engine.sh
# Finalidade: Gerenciar a clonagem e iteração entre as branches dos alunos
ARQUIVO_NOTAS="relatorio_final.csv"
DIRETORIO_ATUAL=$(pwd)
export DIRETORIO_ATUAL
if [ $# -ne 1 ]; then
echo -e "Uso correto: $0 [URL_DO_REPOSITORIO]"
exit 1
fi
REPO_URL=$1
NOME_REPO=$(basename "$REPO_URL" .git)
# Limpeza de execuções anteriores
if [ -d "$NOME_REPO" ]; then
rm -rf "$NOME_REPO"
fi
echo "Clonando repositório: $REPO_URL..."
git clone "$REPO_URL"
if [ ! -d "$NOME_REPO" ]; then
echo "Erro: Falha ao clonar o repositório."
exit 1
fi
# Inicializa o arquivo de resultados
echo "ID_ALUNO,NOTA_FINAL" > "$ARQUIVO_NOTAS"
cd "$NOME_REPO" || exit
# Obtém branches remotas que seguem o padrão de identificação (ex: 'ID')
git branch -r | grep 'origin/ID' | sed 's/origin\///' > "$DIRETORIO_ATUAL/lista_alunos.txt"
index=1
while read -r branch; do
echo "Processando aluno $index: $branch"
# Troca para a branch do aluno de forma silenciosa
git checkout -q "$branch"
# Chama o gerenciador de testes
source "$DIRETORIO_ATUAL/eval_manager.sh"
# Registra o resultado
echo "$branch,$NOTA_FINAL" >> "$DIRETORIO_ATUAL/$ARQUIVO_NOTAS"
((index++))
done < "$DIRETORIO_ATUAL/lista_alunos.txt"
echo "Processo concluído. Resultados salvos em $ARQUIVO_NOTAS."
Gerenciador de Avaliação: eval_manager.sh
Este script coordena a execução de diferentes verificadores (checkers) e calcula a média ponderada ou soma das notas parciais.
#!/bin/bash
# Script: eval_manager.sh
# Finalidade: Consolidar métricas de avaliação parciais
NOTA_FINAL=0
# Exemplo de Verificador 1: Verificação de arquivos C
source "$DIRETORIO_ATUAL/check_files.sh" "*.c"
PONTOS_C=$RESULTADO_PARCIAL
# Exemplo de Verificador 2: Verificação de scripts Python
source "$DIRETORIO_ATUAL/check_files.sh" "*.py"
PONTOS_PY=$RESULTADO_PARCIAL
# Lógica de composição da nota (Soma simples ou Pesos)
NOTA_FINAL=$((PONTOS_C + PONTOS_PY))
echo "Pontuação da Branch: $NOTA_FINAL"
export NOTA_FINAL
Verificador Unitário: check_files.sh
Um exemplo de verificador que realiza uma análise estática simples, como contar linhas de código ou verificar a existência de arquivos obrigatórios.
#!/bin/bash
# Script: check_files.sh
# Finalidade: Validar existência de arquivos e métricas básicas
RESULTADO_PARCIAL=0
PADRAO_BUSCA=$1
if [ -z "$PADRAO_BUSCA" ]; then
echo "Erro: Padrão de busca não definido."
return
fi
# Localiza o arquivo no subdiretório
ARQUIVO_ALVO=$(find . -name "$PADRAO_BUSCA" | head -n 1)
if [ -z "$ARQUIVO_ALVO" ]; then
echo "Arquivo $PADRAO_BUSCA não localizado."
RESULTADO_PARCIAL=0
else
# Exemplo: A nota é baseada na contagem de linhas (SLOC)
LINHAS=$(wc -l < "$ARQUIVO_ALVO")
echo "Arquivo $ARQUIVO_ALVO possui $LINHAS linhas."
RESULTADO_PARCIAL=$LINHAS
fi
export RESULTADO_PARCIAL
Organização do Ambiente de Trabalho
Para garantir o funcionamento dos scripts, a árvore de diretórios deve ser organizada da seguinte forma:
/ambiente_correcao
│
├── grade_engine.sh # Script principal
├── eval_manager.sh # Orquestrador de notas
├── check_files.sh # Verificador específico
├── /tools # Ferramentas auxiliares (compiladores, linters)
├── /NomeDoRepositorio # Criado dinamicamente via Git clone
└── relatorio_final.csv # Saída gerada após a execução
Possibilidades de Extensão
A arquitetura modular permite que os profesores implementem verificadores mais complexos, tais como:
- Compilação Automatizada: Scripts que tentam compilar o código e atribuem nota zero em caso de erro de sintaxe.
- Testes de Unidade: Execução de binários contra um conjunto de entradas predefinidas, comparando a saída gerada com o resultado esperado.
- Integração Contínua (CI): Embora esta abordagem utilize scripts locais, o mesmo conceito pode ser adaptado para ferramentas como Jenkins ou Gitee Go, disparando a correção a cada
pushdo aluno.