diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 2c4a21a..6bba95b 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -52,7 +52,8 @@ jobs: create-release: runs-on: ubuntu-latest container: - image: golang:1.21 + # image: golang:1.21 + image: ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest needs: create-docker-image steps: - name: Checkout repository diff --git a/.gitea/workflows/build_build.yaml b/.gitea/workflows/build_build.yaml new file mode 100644 index 0000000..883f831 --- /dev/null +++ b/.gitea/workflows/build_build.yaml @@ -0,0 +1,50 @@ +name: Release Build +on: + push: + tags: + - builder-* + +jobs: + create-builder-docker-image: + runs-on: ubuntu-latest + container: + image: docker:28.3.2-dind + steps: + - name: Checkout repository + run: | + # Install git + apk add --no-cache git + + echo "=== GitHub Variables ===" + echo "github.ref = ${{ github.ref }}" + echo "github.ref_name = ${{ github.ref_name }}" + echo "github.sha = ${{ github.sha }}" + echo "github.repository = ${{ github.repository }}" + echo "========================" + git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea + cd hello_gitea + git checkout ${{ github.ref }} + + - name: Setup Docker Buildx + run: | + # Docker is already installed in docker:dind image + docker --version + # Setup Docker Buildx for multi-platform builds + docker buildx create --use + docker buildx inspect --bootstrap + + - name: Login to Docker Hub + run: | + echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + + - name: Build multi-platform Docker images + run: | + cd hello_gitea + # Build multi-platform images using buildx + docker buildx build \ + --platform linux/amd64,linux/arm64 \ + --tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:${{ github.ref_name }} \ + --tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest \ + --push \ + . + diff --git a/Dockerfile_for_runner_image b/Dockerfile_for_runner_image new file mode 100644 index 0000000..5bd8e4d --- /dev/null +++ b/Dockerfile_for_runner_image @@ -0,0 +1,13 @@ +# Используем образ Go с поддержкой мультиплатформенности +FROM golang:1.24 + +# Устанавливаем пакеты (одинаково работают на amd64/arm64) +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + git \ + ca-certificates \ + jq && \ + rm -rf /var/lib/apt/lists/* + +# (Опционально) Можно добавить команду по умолчанию +CMD ["bash"] \ No newline at end of file diff --git a/build_image_for_runner.sh b/build_image_for_runner.sh new file mode 100644 index 0000000..0a80c85 --- /dev/null +++ b/build_image_for_runner.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +docker buildx build \ + --platform linux/amd64,linux/arm64 \ + --tag ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest \ + --push \ + -f Dockerfile_for_runner_image \ + . \ No newline at end of file diff --git a/build_old.yaml b/build_old.yaml deleted file mode 100644 index b550f5a..0000000 --- a/build_old.yaml +++ /dev/null @@ -1,59 +0,0 @@ -name: Release Build -on: - push: - tags: - - v* - -jobs: - release: - runs-on: ubuntu-latest - container: - image: golang:1.21 - steps: - - name: Checkout repository - run: | - git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea - cd hello_gitea - git checkout ${{ github.ref }} - - - name: Setup Go - run: | - # Install jq for JSON parsing - apt-get update && apt-get install -y jq - git --version - go version - jq --version - - - name: Build - run: | - cd hello_gitea - mkdir -p bin - go build -o bin/hello-api-${{ github.ref_name }} main.go - ls -la bin/ - - - name: Create Release - run: | - cd hello_gitea - # Create release using Gitea API - curl -X POST \ - -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ - -H "Content-Type: application/json" \ - -d '{ - "tag_name": "${{ github.ref_name }}", - "name": "Release ${{ github.ref_name }}", - "body": "Automated release", - "draft": false, - "prerelease": false - }' \ - "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases" - - # Upload asset - RELEASE_ID=$(curl -s -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ - "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/tags/${{ github.ref_name }}" | \ - jq -r '.id') - - curl -X POST \ - -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ - -H "Content-Type: application/octet-stream" \ - --data-binary @bin/hello-api-${{ github.ref_name }} \ - "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=hello-api-${{ github.ref_name }}" \ No newline at end of file diff --git a/cert.yaml b/cert.yaml deleted file mode 100644 index 8b1b49c..0000000 --- a/cert.yaml +++ /dev/null @@ -1,15 +0,0 @@ -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - annotations: - name: root-somedomain-ru - namespace: default -spec: - commonName: somedomain.ru - dnsNames: - - somedomain.ru - - www.somedomain.ru - issuerRef: - kind: ClusterIssuer - name: letsencrypt-dns-cloudflare - secretName: le-root-somedomain-ru diff --git a/docs/gitea-actions-guide.md b/docs/gitea-actions-guide.md index 47db366..9880665 100644 --- a/docs/gitea-actions-guide.md +++ b/docs/gitea-actions-guide.md @@ -1,10 +1,13 @@ # Настройка Gitea Actions для Go проекта: Полное руководство +--- **readTime:** 15-20 минут **date:** 2025-07-27 18:00 **author:** Direct-Dev(aka Антон Кузнецов) **level:** Средний **tags:** #gitea #gitea-actions #ci-cd #go #docker #devops #automation #k3s +**version:** 1.0.0 +--- ## Содержание @@ -357,33 +360,71 @@ jobs: done ``` -### Объяснение workflow +### Разберемся как работает workflow **Триггеры:** - Workflow запускается при создании тега, начинающегося с `v*` (например, `v1.0.0`) **Jobs:** -1. **create-docker-image:** - - Использует Docker-in-Docker контейнер - - Настраивает Docker Buildx для мультиплатформенной сборки - - Авторизуется в Docker Hub - - Собирает образы для Linux AMD64 и ARM64 - - Публикует образы с тегом версии и `latest` +1. **create-docker-image:** - создание образов docker с нашим проектом + - Используем Docker-in-Docker контейнер (image: docker:28.3.2-dind) + - Настраиваем Docker Buildx для мультиплатформенной сборки (docker buildx create --use docker buildx inspect --bootstrap) + - Авторизуемч в Docker Hub (echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin) + - Собирает образы для Linux AMD64 и ARM64 (docker buildx build \ ...) + - Публикует образы с тегом версии и `latest` (--push) + +чтобы авторизация сработала на докерхабе надо внести секреты DOCKERHUB_TOKEN, DOCKERHUB_USERNAME или вцелом для всей gitea в настройках или в настройках конкретного репозитория +я использовал докерхаб, но можно заморочиться и настроить работу с приватным репозиторием ... 2. **create-release:** - Запускается после успешной сборки Docker образов - - Использует Go контейнер для сборки бинарников + - Использует Go контейнер для сборки бинарников (image: golang:1.21) - Собирает бинарники для всех платформ (Linux, Windows, macOS) - Создает архивы с бинарниками - Создает релиз через Gitea API - Загружает бинарники как assets релиза +при каждом запуске, как я понимаю, данного job будет скачиваться и устанавливаться в контейнере, созданном на базе golang:1.21 + +```yaml + - name: Setup Go + run: | + # Install jq for JSON parsing + apt-get update && apt-get install -y jq + git --version + go version + jq --version +``` + +решение как говорится в лоб: чтобы убрать эту работу при каждом выполнении workflow надо сделать свой образ + +``` Dockerfile +FROM golang:1.24 + +# Install some packages +RUN apt-get update && apt-get install -y git ca-certificates jq +``` + +собрать его и запушить (желательно с мультиплатформенностью). конечно если вам не надо билдить образы для разных платформ тогда все попроще + +```bash +#!/bin/bash + +docker buildx build \ + --platform linux/amd64,linux/arm64 \ + --tag ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest \ + --push \ + -f Dockerfile_for_runner_image \ + . +``` + + ## Настройка секретов ### Необходимые секреты -В настройках репозитория → "Secrets and variables" → "Actions" добавьте следующие секреты: +В настройках репозитория (или инстанса) → "Secrets and variables" → "Actions" добавьте следующие секреты: 1. **GITEATOKEN** - Токен доступа к Gitea API @@ -403,24 +444,30 @@ jobs: 1. Перейдите в настройки профиля → "Applications" 2. Создайте новый токен с правами на репозиторий 3. Скопируйте токен +4. В разделе Actions репозитория создайте секрет уровня репозитория - я создал с именем GITEATOKEN (такой не даст сделать: GITEA_TOKEN) **Docker Hub Token:** 1. Войдите в Docker Hub 2. Перейдите в Account Settings → Security 3. Создайте новый Access Token 4. Скопируйте токен +5. В разделе Actions настроек инстанса gitea создайте секреты уровня инстанса (если много пользователей работает в gitea, то можно внести в уровень репозитория) я создал с именами DOCKERHUB_USERNAME, DOCKERHUB_TOKEN ## Тестирование и запуск ### Локальное тестирование -1. **Проверьте синтаксис workflow:** +1. **Проверим синтаксис workflow:** + +ну если мы в ide то наверное все автоматом отформатировано +но тем не менее ... + ```bash # Убедитесь, что YAML синтаксис корректен yamllint .gitea/workflows/build.yaml ``` -2. **Протестируйте сборку локально:** +2. **Протестируем сборку локально:** ```bash # Сборка для текущей платформы go build -o hello-api main.go @@ -444,23 +491,143 @@ jobs: ### Запуск Actions -1. **Создайте тег:** +1. **Создаем тег:** ```bash - git tag v1.0.0 - git push origin v1.0.0 + + git tag v1.1.20 + git push origin v1.1.20 + + # или скрипт + + + #!/bin/bash + + # Интерактивный скрипт для автоматизации релиза + # Использование: ./scripts/release-interactive.sh [version] + # Если версия не указана, скрипт запросит её интерактивно + + set -e # Остановить выполнение при ошибке + + # Функция для получения версии интерактивно + get_version_interactive() { + echo "🚀 Создание нового релиза" + echo "" + + # Показываем текущую версию + CURRENT_VERSION=$(grep 'const version = "' main.go | sed 's/const version = "\([^"]*\)"/\1/') + echo "📋 Текущая версия: $CURRENT_VERSION" + echo "" + + # Запрашиваем новую версию + read -p "Введите новую версию (формат X.Y.Z): " VERSION + + # Проверяем, что версия не пустая + if [ -z "$VERSION" ]; then + echo "❌ Версия не может быть пустой" + exit 1 + fi + + # Проверяем формат версии + if [[ ! $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "❌ Неверный формат версии. Используйте формат X.Y.Z (например, 1.0.25)" + exit 1 + fi + + # Подтверждение + echo "" + echo "📝 Подтверждение:" + echo " Текущая версия: $CURRENT_VERSION" + echo " Новая версия: $VERSION" + echo "" + read -p "Продолжить? (y/N): " CONFIRM + + if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then + echo "❌ Релиз отменен" + exit 0 + fi + } + + # Проверяем, передана ли версия как аргумент + if [ $# -eq 0 ]; then + # Версия не указана, запрашиваем интерактивно + get_version_interactive + else + # Версия указана как аргумент + VERSION=$1 + + # Проверка формата версии + if [[ ! $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Ошибка: Неверный формат версии. Используйте формат X.Y.Z (например, 1.0.25)" + exit 1 + fi + fi + + echo "🚀 Начинаем релиз версии v$VERSION..." + + # Проверяем, что мы в git репозитории + if ! git rev-parse --git-dir > /dev/null 2>&1; then + echo "Ошибка: Не найден git репозиторий" + exit 1 + fi + + # Проверяем, что нет незакоммиченных изменений + # if ! git diff-index --quiet HEAD --; then + # echo "Ошибка: Есть незакоммиченные изменения. Сначала закоммитьте их." + # exit 1 + # fi + + # Обновляем версию в main.go + echo "📝 Обновляем версию в main.go..." + if [[ "$OSTYPE" == "darwin"* ]]; then + # macOS + sed -i '' "s/const version = \"[^\"]*\"/const version = \"$VERSION\"/" main.go + else + # Linux + sed -i "s/const version = \"[^\"]*\"/const version = \"$VERSION\"/" main.go + fi + + # Проверяем, что изменение применилось + if ! grep -q "const version = \"$VERSION\"" main.go; then + echo "Ошибка: Не удалось обновить версию в main.go" + exit 1 + fi + + echo "✅ Версия обновлена в main.go" + + # Выполняем git команды + echo "📦 Добавляем изменения в git..." + git add . + + echo "💾 Создаем коммит..." + git commit -m "Release v$VERSION" + + echo "🏷️ Создаем тег..." + git tag -a "v$VERSION" -m "Release v$VERSION" + + echo "🚀 Отправляем изменения и теги..." + git push + git push --tags + + echo "🎉 Релиз v$VERSION успешно завершен!" + echo "📋 Выполненные действия:" + echo " - Обновлена версия в main.go" + echo " - Создан коммит с сообщением 'Release v$VERSION'" + echo " - Создан тег v$VERSION" + echo " - Изменения отправлены в удаленный репозиторий" + ``` 2. **Мониторинг выполнения:** - - Перейдите в репозиторий → "Actions" - - Найдите запущенный workflow - - Отслеживайте выполнение каждого job + - Переходим в репозиторий → "Actions" + - Находим запущенный workflow + - Отслеживаем выполнение каждого job ### Ожидаемый результат После успешного выполнения: 1. **Docker образы** будут опубликованы в Docker Hub: - - `username/hello-api:v1.0.0` + - `username/hello-api:v1.1.20` - `username/hello-api:latest` 2. **Релиз** будет создан в Gitea с бинарниками: @@ -475,47 +642,29 @@ jobs: ### Просмотр логов 1. **В Gitea:** - - Перейдите в репозиторий → "Actions" - - Выберите workflow - - Нажмите на job для просмотра логов + - Переходим в репозиторий → "Actions" + - Выберем workflow + - Нажмем на job для просмотра логов 2. **Отладка ошибок:** - - Проверьте правильность секретов - - Убедитесь в корректности путей к репозиторию - - Проверьте права доступа токенов + - Проверим правильность секретов + - Убедимся в корректности путей к репозиторию + - Проверим права доступа токенов ### Частые проблемы 1. **Ошибка авторизации в Docker Hub:** - - Проверьте правильность `DOCKERHUB_TOKEN` - - Убедитесь, что токен не истек + - Проверим правильность `DOCKERHUB_TOKEN` + - Убедимся, что токен не истек 2. **Ошибка создания релиза:** - - Проверьте права токена `GITEATOKEN` - - Убедитесь, что тег не существует + - Проверим права токена `GITEATOKEN` + - Убедимся, что тег не существует 3. **Ошибка сборки:** - - Проверьте зависимости в `go.mod` - - Убедитесь в корректности Dockerfile + - Проверим зависимости в `go.mod` + - Убедимся в корректности Dockerfile -### Оптимизация - -1. **Кэширование зависимостей:** - ```yaml - - name: Cache Go modules - uses: actions/cache@v3 - with: - path: | - ~/.cache/go-build - ~/go/pkg/mod - key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-go- - ``` - -2. **Параллельная сборка:** - - Разделите сборку бинарников на отдельные jobs - - Используйте matrix strategy для разных платформ ## Заключение @@ -537,10 +686,10 @@ jobs: ### Следующие шаги -1. Добавьте тестирование в workflow -2. Настройте автоматическое развертывание -3. Добавьте уведомления о результатах сборки -4. Настройте мониторинг и алерты +1. тестирование в workflow +2. автоматическое развертывание +3. уведомления о результатах сборки +4. мониторинг и алерты Gitea Actions предоставляет мощные возможности для автоматизации процессов разработки, и с правильной настройкой вы можете значительно упростить процесс доставки вашего ПО. @@ -1254,7 +1403,7 @@ systemctl status gitea-runner ### Настройка мониторинга -1. **Создание скрипта мониторинга:** +1. ** Cкрипт мониторинга:** ```bash cat > /opt/gitea-runner/monitor.sh <<'EOF' @@ -1305,9 +1454,13 @@ curl -H "Authorization: token YOUR_GITEA_TOKEN" \ ```yaml # .gitea/workflows/test-runner.yaml name: Test Runner +# on: +# push: +# branches: [main] on: push: - branches: [main] + tags: + - v* jobs: test: @@ -1427,15 +1580,14 @@ chmod +x /opt/gitea-runner/backup.sh echo "0 2 * * * /opt/gitea-runner/backup.sh" | crontab - ``` -Теперь у вас есть полностью настроенная инфраструктура с Gitea в K3s кластере и Gitea Runner в LXC контейнере на Proxmox ARM64! -## Работа с вашим кластером +## Работа с кластером ### Основные команды для работы с кластером ```bash # Установка переменной окружения для работы с кластером -export KUBECONFIG=~/.kube/config_hlab +export KUBECONFIG=~/.kube/{configfile} # Проверка состояния кластера kubectl get nodes -o wide @@ -1452,7 +1604,11 @@ kubectl get storageclass # Проверка ingress и сервисов kubectl get svc -n default | grep traefik -kubectl get ingress -A +kubectl get crds +kubectl get ingressroutes.traefik.io -A + +# Проверка сертификатов +kubectl get certificates -A -o wide ``` ### Мониторинг и обслуживание @@ -1488,10 +1644,4 @@ kubectl logs -n gitea statefulset/gitea-valkey-cluster -c valkey # Проверка сетевой связности kubectl exec -n gitea deployment/gitea -- ping gitea-postgres kubectl exec -n gitea deployment/gitea -- ping gitea-valkey-cluster -``` - ---- - -**Автор:** [Ваше имя] -**Дата:** [Дата публикации] -**Версия:** 1.0.0 \ No newline at end of file +``` \ No newline at end of file