first commit

This commit is contained in:
2026-09-09 16:50:00 -03:00
commit b2a368d71a
104 changed files with 7462 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -Eeuo pipefail
source "$(dirname "$0")/common.sh"
require_command docker
validate_environment
REGISTRY="${REGISTRY:?Defina REGISTRY, por exemplo: tim.azurecr.io}"
IMAGE_NAME="${IMAGE_NAME:-agent-framework-evaluator}"
IMAGE_TAG="${IMAGE_TAG:-$(git -C "${ROOT_DIR}" rev-parse --short HEAD 2>/dev/null || date +%Y%m%d%H%M%S)}"
IMAGE="${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
PLATFORM="${PLATFORM:-linux/amd64}"
echo "Construindo ${IMAGE} para ${PLATFORM}..."
docker build --platform "${PLATFORM}" -t "${IMAGE}" "${ROOT_DIR}"
echo "Enviando ${IMAGE}..."
docker push "${IMAGE}"
echo "IMAGE=${IMAGE}"

16
deploy/scripts/common.sh Normal file
View File

@@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -Eeuo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
ENVIRONMENT="${ENVIRONMENT:-${1:-dev}}"
NAMESPACE="${NAMESPACE:-agent-evaluator-${ENVIRONMENT}}"
OVERLAY_DIR="${ROOT_DIR}/deploy/k8s/overlays/${ENVIRONMENT}"
require_command() {
command -v "$1" >/dev/null 2>&1 || { echo "Erro: comando '$1' não encontrado." >&2; exit 1; }
}
validate_environment() {
case "${ENVIRONMENT}" in dev|hml|prod) ;; *) echo "Ambiente inválido: ${ENVIRONMENT}. Use dev, hml ou prod." >&2; exit 1;; esac
[[ -d "${OVERLAY_DIR}" ]] || { echo "Overlay não encontrado: ${OVERLAY_DIR}" >&2; exit 1; }
}

View File

@@ -0,0 +1,51 @@
#!/usr/bin/env bash
set -Eeuo pipefail
source "$(dirname "$0")/common.sh"
require_command kubectl
validate_environment
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/deploy/env/evaluator.env}"
WALLET_DIR="${WALLET_DIR:-${ROOT_DIR}/deploy/wallet}"
[[ -f "${ENV_FILE}" ]] || { echo "Arquivo de variáveis não encontrado: ${ENV_FILE}" >&2; exit 1; }
[[ -d "${WALLET_DIR}" ]] || { echo "Diretório do wallet não encontrado: ${WALLET_DIR}" >&2; exit 1; }
kubectl create namespace "${NAMESPACE}" --dry-run=client -o yaml | kubectl apply -f -
kubectl -n "${NAMESPACE}" create secret generic evaluator-secrets \
--from-env-file="${ENV_FILE}" \
--dry-run=client -o yaml | kubectl apply -f -
wallet_args=()
while IFS= read -r -d '' file; do
wallet_args+=("--from-file=$(basename "${file}")=${file}")
done < <(find "${WALLET_DIR}" -maxdepth 1 -type f -print0)
((${#wallet_args[@]} > 0)) || { echo "Nenhum arquivo encontrado em ${WALLET_DIR}" >&2; exit 1; }
kubectl -n "${NAMESPACE}" create secret generic evaluator-wallet \
"${wallet_args[@]}" \
--dry-run=client -o yaml | kubectl apply -f -
LANGFUSE_CREDENTIALS_FILE="${LANGFUSE_CREDENTIALS_FILE:-${ROOT_DIR}/deploy/langfuse/langfuse_credentials.yaml}"
if [[ -f "${LANGFUSE_CREDENTIALS_FILE}" ]]; then
kubectl -n "${NAMESPACE}" create secret generic evaluator-langfuse \
--from-file=langfuse_credentials.yaml="${LANGFUSE_CREDENTIALS_FILE}" \
--dry-run=client -o yaml | kubectl apply -f -
echo "Credenciais Langfuse atualizadas no secret evaluator-langfuse."
else
echo "Arquivo de credenciais Langfuse não encontrado: ${LANGFUSE_CREDENTIALS_FILE}" >&2
exit 1
fi
GCP_CREDENTIALS_FILE="${GCP_CREDENTIALS_FILE:-${ROOT_DIR}/deploy/gcp/GCP_ACCESS_KEY.json}"
if [[ -f "${GCP_CREDENTIALS_FILE}" ]]; then
kubectl -n "${NAMESPACE}" create secret generic evaluator-gcp \
--from-file=GCP_ACCESS_KEY.json="${GCP_CREDENTIALS_FILE}" \
--dry-run=client -o yaml | kubectl apply -f -
echo "Credencial GCP atualizada no secret evaluator-gcp."
else
echo "Aviso: credencial GCP não encontrada em ${GCP_CREDENTIALS_FILE}; secret evaluator-gcp não foi alterado." >&2
fi
echo "Secrets atualizados no namespace ${NAMESPACE}."

30
deploy/scripts/deploy.sh Normal file
View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -Eeuo pipefail
source "$(dirname "$0")/common.sh"
require_command kubectl
validate_environment
REGISTRY="${REGISTRY:?Defina REGISTRY, por exemplo: tim.azurecr.io}"
IMAGE_NAME="${IMAGE_NAME:-agent-framework-evaluator}"
IMAGE_TAG="${IMAGE_TAG:?Defina IMAGE_TAG com a versão já publicada}"
IMAGE="${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
RUN_INIT_DB="${RUN_INIT_DB:-true}"
TIMEOUT="${TIMEOUT:-300s}"
kubectl kustomize "${OVERLAY_DIR}" \
| sed "s#REPLACE_REGISTRY/agent-framework-evaluator:[^[:space:]]*#${IMAGE}#g" \
| kubectl apply -f -
if [[ "${RUN_INIT_DB}" == "true" ]]; then
job_name="evaluator-init-db-${ENVIRONMENT}-$(date +%s)"
sed -e "s#agent-evaluator#${NAMESPACE}#g" \
-e "s#name: evaluator-init-db#name: ${job_name}#" \
-e "s#agent-framework-evaluator:latest#${IMAGE}#" \
"${ROOT_DIR}/deploy/k8s/base/init-db-job.yaml" | kubectl apply -f -
kubectl -n "${NAMESPACE}" wait --for=condition=complete "job/${job_name}" --timeout="${TIMEOUT}" || {
kubectl -n "${NAMESPACE}" logs "job/${job_name}" --all-containers=true || true
exit 1
}
fi
kubectl -n "${NAMESPACE}" get cronjob,pod,jobs

11
deploy/scripts/run-now.sh Normal file
View File

@@ -0,0 +1,11 @@
#!/usr/bin/env bash
set -Eeuo pipefail
source "$(dirname "$0")/common.sh"
require_command kubectl
validate_environment
CRONJOB="${CRONJOB:-evaluator-batch}"
JOB_NAME="${JOB_NAME:-evaluator-manual-${ENVIRONMENT}-$(date +%Y%m%d%H%M%S)}"
kubectl -n "${NAMESPACE}" create job --from="cronjob/${CRONJOB}" "${JOB_NAME}"
echo "Job criado: ${JOB_NAME}"
echo "Logs: kubectl -n ${NAMESPACE} logs -f job/${JOB_NAME}"

8
deploy/scripts/status.sh Normal file
View File

@@ -0,0 +1,8 @@
#!/usr/bin/env bash
set -Eeuo pipefail
source "$(dirname "$0")/common.sh"
require_command kubectl
validate_environment
kubectl -n "${NAMESPACE}" get cronjob,jobs,pods,deploy,svc
printf '\nEventos recentes:\n'
kubectl -n "${NAMESPACE}" get events --sort-by=.lastTimestamp | tail -30

View File

@@ -0,0 +1,10 @@
#!/usr/bin/env bash
set -Eeuo pipefail
source "$(dirname "$0")/common.sh"
require_command kubectl
validate_environment
kubectl delete -k "${OVERLAY_DIR}" --ignore-not-found
if [[ "${DELETE_NAMESPACE:-false}" == "true" ]]; then
kubectl delete namespace "${NAMESPACE}" --ignore-not-found
fi