diff --git a/deploy/.goreleaser.yaml b/deploy/.goreleaser.yaml index 3fce9f5..d0f5909 100644 --- a/deploy/.goreleaser.yaml +++ b/deploy/.goreleaser.yaml @@ -9,6 +9,8 @@ builds: goarch: - amd64 - arm64 + - windows + - darwin env: - CGO_ENABLED=0 ldflags: diff --git a/deploy/release-goreleaser.sh b/deploy/release-goreleaser.sh new file mode 100644 index 0000000..0aa084a --- /dev/null +++ b/deploy/release-goreleaser.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +set -euo pipefail + +# release-goreleaser.sh +# Копирует deploy/.goreleaser.yaml в корень, запускает релиз и удаляет файл. +# +# Использование: +# deploy/release-goreleaser.sh # обычный релиз на GitHub (нужен GITHUB_TOKEN) +# deploy/release-goreleaser.sh --snapshot # локальный снепшот без публикации + +ROOT_DIR="$(git rev-parse --show-toplevel 2>/dev/null || pwd)" +SRC_CFG="$ROOT_DIR/deploy/.goreleaser.yaml" +DST_CFG="$ROOT_DIR/.goreleaser.yaml" + +log() { echo -e "\033[36m[release]\033[0m $*"; } +err() { echo -e "\033[31m[error]\033[0m $*" >&2; } + +if ! command -v goreleaser >/dev/null 2>&1; then + err "goreleaser не найден. Установите: https://goreleaser.com/install/" + exit 1 +fi + +if [[ ! -f "$SRC_CFG" ]]; then + err "Не найден файл конфигурации: $SRC_CFG" + exit 1 +fi + +MODE="release" +if [[ "${1:-}" == "--snapshot" ]]; then + MODE="snapshot" + shift || true +fi + +if [[ -f "$DST_CFG" ]]; then + err "В корне уже существует .goreleaser.yaml. Удалите/переименуйте перед запуском." + exit 1 +fi + +cleanup() { + if [[ -f "$DST_CFG" ]]; then + rm -f "$DST_CFG" || true + log "Удалил временный $DST_CFG" + fi +} +trap cleanup EXIT + +log "Копирую конфиг: $SRC_CFG -> $DST_CFG" +cp "$SRC_CFG" "$DST_CFG" + +pushd "$ROOT_DIR" >/dev/null + +## Версию берём из deploy/VERSION.txt или VERSION.txt в корне +VERSION_FILE="$ROOT_DIR/deploy/VERSION.txt" +[[ -f "$VERSION_FILE" ]] || VERSION_FILE="$ROOT_DIR/VERSION.txt" +if [[ -f "$VERSION_FILE" ]]; then + VERSION_RAW="$(head -n1 "$VERSION_FILE" | tr -d ' \t\r\n')" + if [[ -n "$VERSION_RAW" ]]; then + TAG="$VERSION_RAW" + [[ "$TAG" == v* ]] || TAG="v$TAG" + export GORELEASER_CURRENT_TAG="$TAG" + log "Версия релиза: $TAG (из $(realpath --relative-to="$ROOT_DIR" "$VERSION_FILE" 2>/dev/null || echo "$VERSION_FILE"))" + fi +fi + +create_and_push_tag() { + local tag="$1" + if git rev-parse "$tag" >/dev/null 2>&1; then + log "Git tag уже существует: $tag" + else + log "Создаю git tag: $tag" + git tag -a "$tag" -m "Release $tag" + if [[ "${NO_GIT_PUSH:-false}" != "true" ]]; then + log "Пушу тег $tag на origin" + git push origin "$tag" + else + log "Пропущен пуш тега (NO_GIT_PUSH=true)" + fi + fi +} + +fetch_token_from_k8s() { + export KUBECONFIG=/home/su/.kube/config_hlab + local ns="${K8S_NAMESPACE:-flux-system}" + local name="${K8S_SECRET_NAME:-git-secrets}" + # Предпочитаем jq (как в примере), при отсутствии используем jsonpath + base64 -d + if command -v jq >/dev/null 2>&1; then + kubectl get secret "$name" -n "$ns" -o json \ + | jq -r '.data.password | @base64d' + else + kubectl get secret "$name" -n "$ns" -o jsonpath='{.data.password}' \ + | base64 -d 2>/dev/null || true + fi +} + +if [[ "$MODE" == "snapshot" ]]; then + log "Запуск goreleaser (snapshot, без публикации)" + goreleaser release --snapshot --clean --config "$DST_CFG" +else + # Если версия определена и тега нет — создадим (goreleaser ориентируется на теги) + if [[ -n "${GORELEASER_CURRENT_TAG:-}" ]]; then + create_and_push_tag "$GORELEASER_CURRENT_TAG" + fi + if [[ -z "${GITHUB_TOKEN:-}" ]]; then + log "GITHUB_TOKEN не задан — пробую получить из k8s секрета (${K8S_NAMESPACE:-flux-system}/${K8S_SECRET_NAME:-git-secrets}, ключ: password)" + if ! command -v kubectl >/dev/null 2>&1; then + err "kubectl не найден, а GITHUB_TOKEN не задан. Установите kubectl или экспортируйте GITHUB_TOKEN." + exit 1 + fi + TOKEN_FROM_K8S="$(fetch_token_from_k8s || true)" + if [[ -n "$TOKEN_FROM_K8S" && "$TOKEN_FROM_K8S" != "null" ]]; then + export GITHUB_TOKEN="$TOKEN_FROM_K8S" + log "GITHUB_TOKEN получен из секрета Kubernetes." + else + err "Не удалось получить GITHUB_TOKEN из секрета Kubernetes. Экспортируйте GITHUB_TOKEN и повторите." + exit 1 + fi + fi + log "Запуск goreleaser (публикация на GitHub)" + goreleaser release --clean --config "$DST_CFG" +fi + +popd >/dev/null + +log "Готово." + +