diff --git a/.gitea/workflows/build_build.yaml b/.gitea/workflows/build-builder.yaml similarity index 84% rename from .gitea/workflows/build_build.yaml rename to .gitea/workflows/build-builder.yaml index e38ee3f..e79d640 100644 --- a/.gitea/workflows/build_build.yaml +++ b/.gitea/workflows/build-builder.yaml @@ -1,4 +1,4 @@ -name: Release Build +name: Build Builder Docker Image on: push: tags: @@ -21,31 +21,35 @@ jobs: echo "github.sha = ${{ github.sha }}" echo "github.repository = ${{ github.repository }}" echo "========================" + echo "Cloning..." git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea cd hello_gitea + echo "Checkout to ${{ github.ref }} ..." git checkout ${{ github.ref }} - name: Setup Docker Buildx run: | # Docker is already installed in docker:dind image + echo "look at docker version" docker --version # Setup Docker Buildx for multi-platform builds + echo "setup buildx" docker buildx create --use docker buildx inspect --bootstrap - name: Login to Docker Hub run: | + echo "login to docker hub ..." 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 + echo "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 \ -f Dockerfile.builder \ - . - + . \ No newline at end of file diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 5b9e3c6..b131bb0 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -5,130 +5,130 @@ on: - v* jobs: - # create-release: - # runs-on: ubuntu-latest - # container: - # # image: golang:1.21 - # image: ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest - # needs: create-release-branch - # 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 }} + create-release: + runs-on: ubuntu-latest + container: + # image: golang:1.21 + image: ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest + needs: create-release-branch + 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: Setup Go + run: | + # Install jq for JSON parsing + apt-get update && apt-get install -y jq + git --version + go version + jq --version - # - name: Build all binaries - # run: | - # cd hello_gitea - # mkdir -p bin + - name: Build all binaries + run: | + cd hello_gitea + mkdir -p bin - # # Build for all platforms - # GOOS=linux GOARCH=amd64 go build -o bin/hello-api-linux-amd64 main.go - # GOOS=linux GOARCH=arm64 go build -o bin/hello-api-linux-arm64 main.go - # GOOS=windows GOARCH=amd64 go build -o bin/hello-api-windows-amd64.exe main.go - # GOOS=darwin GOARCH=amd64 go build -o bin/hello-api-darwin-amd64 main.go - # GOOS=darwin GOARCH=arm64 go build -o bin/hello-api-darwin-arm64 main.go + # Build for all platforms + GOOS=linux GOARCH=amd64 go build -o bin/hello-api-linux-amd64 main.go + GOOS=linux GOARCH=arm64 go build -o bin/hello-api-linux-arm64 main.go + GOOS=windows GOARCH=amd64 go build -o bin/hello-api-windows-amd64.exe main.go + GOOS=darwin GOARCH=amd64 go build -o bin/hello-api-darwin-amd64 main.go + GOOS=darwin GOARCH=arm64 go build -o bin/hello-api-darwin-arm64 main.go - # # Create archives - # cd bin - # tar -czf hello-api-linux-amd64.tar.gz hello-api-linux-amd64 - # tar -czf hello-api-linux-arm64.tar.gz hello-api-linux-arm64 - # tar -czf hello-api-windows-amd64.tar.gz hello-api-windows-amd64.exe - # tar -czf hello-api-darwin-amd64.tar.gz hello-api-darwin-amd64 - # tar -czf hello-api-darwin-arm64.tar.gz hello-api-darwin-arm64 + # Create archives + cd bin + tar -czf hello-api-linux-amd64.tar.gz hello-api-linux-amd64 + tar -czf hello-api-linux-arm64.tar.gz hello-api-linux-arm64 + tar -czf hello-api-windows-amd64.tar.gz hello-api-windows-amd64.exe + tar -czf hello-api-darwin-amd64.tar.gz hello-api-darwin-amd64 + tar -czf hello-api-darwin-arm64.tar.gz hello-api-darwin-arm64 - # ls -la + ls -la - # - 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 with multi-platform binaries and Docker image", - # "draft": false, - # "prerelease": false - # }' \ - # "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases" + - 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 with multi-platform binaries and Docker image", + "draft": false, + "prerelease": false + }' \ + "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases" - # # Upload assets - # 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') + # Upload assets + 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') - # # Upload all binaries - # for file in bin/*.tar.gz; do - # echo "Uploading $file..." - # curl -X POST \ - # -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ - # -H "Content-Type: application/octet-stream" \ - # --data-binary @$file \ - # "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=$(basename $file)" - # done + # Upload all binaries + for file in bin/*.tar.gz; do + echo "Uploading $file..." + curl -X POST \ + -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ + -H "Content-Type: application/octet-stream" \ + --data-binary @$file \ + "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=$(basename $file)" + done - # create-docker-image: - # runs-on: ubuntu-latest - # container: - # image: docker:28.3.2-dind - # needs: create-release - # 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 }}/hello-api:${{ github.ref_name }} \ - # --tag ${{ secrets.DOCKERHUB_USERNAME }}/hello-api:latest \ - # --push \ - # . - - create-release-branch: + create-docker-image: runs-on: ubuntu-latest container: image: docker:28.3.2-dind - # needs: create-docker-image + needs: create-release + 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 }}/hello-api:${{ github.ref_name }} \ + --tag ${{ secrets.DOCKERHUB_USERNAME }}/hello-api:latest \ + --push \ + . + + update-to-release-branch: + runs-on: ubuntu-latest + container: + image: docker:28.3.2-dind + needs: create-docker-image steps: - name: Create Release Branch run: | @@ -137,6 +137,9 @@ jobs: echo "github.ref_name = ${{ github.ref_name }}" echo "github.sha = ${{ github.sha }}" echo "github.repository = ${{ github.repository }}" + echo "DOCKERHUB_USERNAME = ${{ secrets.DOCKERHUB_USERNAME }}" + echo "DOCKERHUB_TOKEN = ${{ secrets.DOCKERHUB_TOKEN }}" + echo "GITEATOKEN = ${{ secrets.GITEATOKEN }}" echo "========================" # Clone repository echo "Cloning repository..." diff --git a/README.md b/README.md index f3d5e3d..a198dca 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ export PORT=3000 } ``` -### GET /health +### GET /healthz Health check endpoint **Ответ:** @@ -133,7 +133,7 @@ go run main.go # Тестирование API curl http://localhost:8080/ -curl http://localhost:8080/health +curl http://localhost:8080/healthz curl http://localhost:8080/api/v1/info curl -X POST http://localhost:8080/api/v1/echo \ -H "Content-Type: application/json" \ diff --git a/docs/gitea-actions-guide.md b/docs/gitea-actions-guide.md index 9880665..ec59e39 100644 --- a/docs/gitea-actions-guide.md +++ b/docs/gitea-actions-guide.md @@ -1,13 +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 ---- +```metadata +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 +``` ## Содержание @@ -19,13 +19,13 @@ 6. [Тестирование и запуск](#тестирование-и-запуск) 7. [Мониторинг и отладка](#мониторинг-и-отладка) 8. [Заключение](#заключение) -9. [Инфраструктура](#инфраструктура) -10. [Установка Gitea в кластере K3s](#установка-gitea-в-кластере-k3s) -11. [Настройка Gitea Runner в LXC контейнере](#настройка-gitea-runner-в-lxc-контейнере) +A. [Инфраструктура](#инфраструктура) +B. [Установка Gitea в кластере K3s](#установка-gitea-в-кластере-k3s) +C. [Настройка Gitea Runner в LXC контейнере](#настройка-gitea-runner-в-lxc-контейнере) ## Введение -Gitea Actions — это встроенная система непрерывной интеграции и развертывания (CI/CD) в Gitea, которая позволяет автоматизировать процессы сборки, тестирования и развертывания ваших проектов. Большой плюс этой системы в том, что она достаточна не требовательна к ресурсам и может быть развернута в собственном изолированном окружении. +Gitea Actions — это встроенная система непрерывной интеграции и развертывания (CI/CD) в Gitea, которая позволяет автоматизировать процессы сборки, тестирования и развертывания ваших проектов. Большой плюс этой системы в том, что она достаточна не требовательна к ресурсам и может быть развернута в собственном изолированном окружении. В этой статье мы рассмотрим пример работы с данной системой, на примере того как настроить Gitea Actions для Go проекта с автоматической сборкой мультиплатформенных бинарников, созданием Docker образов и публикацией релизов. @@ -43,7 +43,7 @@ Gitea Actions — это встроенная система непрерывн Собственно функциональная часть проекта Go не блещет оригинальностью и имеет следующую простую структуру: -``` +``` text hello_gitea/ ├── main.go # Основной код приложения ├── go.mod # Зависимости Go @@ -93,7 +93,7 @@ func main() { }) // Endpoints - r.GET("/health", func(c *gin.Context) { + r.GET("/healthz", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "status": "ok", "version": version, @@ -148,8 +148,8 @@ func main() { ### Dockerfile -Помимо того, что мы будем собирать бинарники для разных платформ, мы также настроим сборку docker image в котором будем -запускать наш сервер api - это может быть полезным для развертывания нашего приложения, если мы настроим такое - например +Помимо того, что мы будем собирать бинарники для разных платформ, мы также настроим сборку docker image в котором будем +запускать наш сервер api - это может быть полезным для развертывания нашего приложения, если мы настроим такое - например через ArgoCD или flux (впрочем это тема отдельнйо статьи). Итак для контейнеризации используем многоэтапную сборку, что как вещают мудрецы является якобы полезным и правильным. @@ -191,23 +191,22 @@ EXPOSE 8080 CMD ["./hello-api"] ``` -**Ремарка:** +**Ремарка:** Тут хочется немного поразмышлять - по хорошему надо или разобраться в вариантах кэширования gitea или в качестве -базововго образа для каждого из этапов использовать предварительно собранный образ со всем необходимым. +базововго образа для каждого из этапов использовать предварительно собранный образ со всем необходимым. При каждом запуске workflow будет запускаться новый контейнер docker in docker и там запускаться построение образа естественно кэшей не будет или надо как то придумывать как их хранить на ранере и пробрасывать в dind. Ну или руками сделать нужные образы и использоват их в Dockerfile. Правда пулиться они опять же будут походу каждый раз. Короче говоря тут есть чем поразбираться и пооптимизировать ... - ## Настройка Gitea Actions ### Включение Actions в Gitea 1. **Проверьте версию Gitea** - + Gitea Actions доступны начиная с версии 1.17.0. Убедитесь, что ваш сервер Gitea поддерживает Actions. 2. **Включите Actions в настройках репозитория** - + - Перейдите в настройки репозитория - Найдите раздел "Actions" - Включите "Enable Actions" @@ -215,7 +214,7 @@ CMD ["./hello-api"] ### Создание токена доступа 1. **Создайте токен для Actions** - + - Перейдите в настройки профиля → "Applications" - Создайте новый токен с правами на репозиторий - Скопируйте токен (он понадобится позже) @@ -363,29 +362,32 @@ jobs: ### Разберемся как работает workflow **Триггеры:** + - Workflow запускается при создании тега, начинающегося с `v*` (например, `v1.0.0`) **Jobs:** -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) +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 контейнер для сборки бинарников (image: golang:1.21) - - Собирает бинарники для всех платформ (Linux, Windows, macOS) - - Создает архивы с бинарниками - - Создает релиз через Gitea API - - Загружает бинарники как assets релиза +2 **create-release:** -при каждом запуске, как я понимаю, данного job будет скачиваться и устанавливаться в контейнере, созданном на базе golang:1.21 +- Запускается после успешной сборки Docker образов +- Использует Go контейнер для сборки бинарников (image: golang:1.21) +- Собирает бинарники для всех платформ (Linux, Windows, macOS) +- Создает архивы с бинарниками +- Создает релиз через Gitea API +- Загружает бинарники как assets релиза + +при каждом запуске данного job будет скачиваться jq и устанавливаться в контейнере, созданном на базе golang:1.21 ```yaml - name: Setup Go @@ -397,28 +399,98 @@ jobs: jq --version ``` -решение как говорится в лоб: чтобы убрать эту работу при каждом выполнении workflow надо сделать свой образ +**решение в лоб:** чтобы убрать эту повторяющуюся работу при каждом выполнении workflow надо сделать свой образ - например "${DOCKERHUB_USERNAME}"/my-build-golang-runner:latest ``` Dockerfile +# базовый образ FROM golang:1.24 -# Install some packages -RUN apt-get update && apt-get install -y git ca-certificates jq +# Устанавливаем пакеты (одинаково работают на 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"] ``` -собрать его и запушить (желательно с мультиплатформенностью). конечно если вам не надо билдить образы для разных платформ тогда все попроще +Cобрать его и запушить (желательно с мультиплатформенностью) на каком-то локальном АРМ (не раннере) ```bash #!/bin/bash docker buildx build \ --platform linux/amd64,linux/arm64 \ - --tag ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest \ + --tag ${DOCKERHUB_USERNAME:-defaultdockeruser}/my-build-golang-runner:latest \ --push \ -f Dockerfile_for_runner_image \ . ``` +или сделать задачу для сборки на раннере `.gitea/workflows/build-builder.yaml` + +```yaml +name: Build Builder Docker Image +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 "========================" + echo "Cloning..." + git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea + cd hello_gitea + echo "Checkout to ${{ github.ref }} ..." + git checkout ${{ github.ref }} + + - name: Setup Docker Buildx + run: | + # Docker is already installed in docker:dind image + echo "look at docker version" + docker --version + # Setup Docker Buildx for multi-platform builds + echo "setup buildx" + docker buildx create --use + docker buildx inspect --bootstrap + + - name: Login to Docker Hub + run: | + echo "login to docker hub ..." + echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin + + - name: Build multi-platform Docker images + run: | + cd hello_gitea + echo "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 \ + -f Dockerfile.builder \ + . +``` + +эта задача будет запущена на ранере при пуше тега с префиксом `builder-` ## Настройка секретов @@ -441,12 +513,14 @@ docker buildx build \ ### Создание токенов **Gitea Token:** + 1. Перейдите в настройки профиля → "Applications" 2. Создайте новый токен с правами на репозиторий 3. Скопируйте токен 4. В разделе Actions репозитория создайте секрет уровня репозитория - я создал с именем GITEATOKEN (такой не даст сделать: GITEA_TOKEN) **Docker Hub Token:** + 1. Войдите в Docker Hub 2. Перейдите в Account Settings → Security 3. Создайте новый Access Token @@ -457,7 +531,7 @@ docker buildx build \ ### Локальное тестирование -1. **Проверим синтаксис workflow:** +1 **Проверим синтаксис workflow:** ну если мы в ide то наверное все автоматом отформатировано но тем не менее ... @@ -467,7 +541,8 @@ docker buildx build \ yamllint .gitea/workflows/build.yaml ``` -2. **Протестируем сборку локально:** +2 **Протестируем сборку локально:** + ```bash # Сборка для текущей платформы go build -o hello-api main.go @@ -477,7 +552,8 @@ docker buildx build \ GOOS=linux GOARCH=arm64 go build -o hello-api-linux-arm64 main.go ``` -3. **Тестирование Docker образа:** +3 **Тестирование Docker образа:** + ```bash # Сборка образа docker build -t hello-api:test . @@ -486,12 +562,13 @@ docker buildx build \ docker run -p 8080:8080 hello-api:test # Тестирование API - curl http://localhost:8080/health + curl http://localhost:8080/healthz ``` ### Запуск Actions -1. **Создаем тег:** +1 **Создаем тег:** + ```bash git tag v1.1.20 @@ -617,54 +694,61 @@ docker buildx build \ ``` -2. **Мониторинг выполнения:** - - Переходим в репозиторий → "Actions" - - Находим запущенный workflow - - Отслеживаем выполнение каждого job +2 **Мониторинг выполнения:** + +- Переходим в репозиторий → "Actions" +- Находим запущенный workflow +- Отслеживаем выполнение каждого job ### Ожидаемый результат После успешного выполнения: -1. **Docker образы** будут опубликованы в Docker Hub: - - `username/hello-api:v1.1.20` - - `username/hello-api:latest` +1 **Docker образы** будут опубликованы в Docker Hub: -2. **Релиз** будет создан в Gitea с бинарниками: - - `hello-api-linux-amd64.tar.gz` - - `hello-api-linux-arm64.tar.gz` - - `hello-api-windows-amd64.tar.gz` - - `hello-api-darwin-amd64.tar.gz` - - `hello-api-darwin-arm64.tar.gz` +- `username/hello-api:v1.1.20` +- `username/hello-api:latest` + +2 **Релиз** будет создан в Gitea с бинарниками: + +- `hello-api-linux-amd64.tar.gz` +- `hello-api-linux-arm64.tar.gz` +- `hello-api-windows-amd64.tar.gz` +- `hello-api-darwin-amd64.tar.gz` +- `hello-api-darwin-arm64.tar.gz` ## Мониторинг и отладка ### Просмотр логов -1. **В Gitea:** - - Переходим в репозиторий → "Actions" - - Выберем workflow - - Нажмем на job для просмотра логов +1 **В Gitea:** -2. **Отладка ошибок:** - - Проверим правильность секретов - - Убедимся в корректности путей к репозиторию - - Проверим права доступа токенов +- Переходим в репозиторий → "Actions" +- Выберем workflow +- Нажмем на job для просмотра логов + +2 **Отладка ошибок:** + +- Проверим правильность секретов +- Убедимся в корректности путей к репозиторию +- Проверим права доступа токенов ### Частые проблемы -1. **Ошибка авторизации в Docker Hub:** - - Проверим правильность `DOCKERHUB_TOKEN` - - Убедимся, что токен не истек +1 **Ошибка авторизации в Docker Hub:** -2. **Ошибка создания релиза:** - - Проверим права токена `GITEATOKEN` - - Убедимся, что тег не существует +- Проверим правильность `DOCKERHUB_TOKEN` +- Убедимся, что токен не истек -3. **Ошибка сборки:** - - Проверим зависимости в `go.mod` - - Убедимся в корректности Dockerfile +2 **Ошибка создания релиза:** +- Проверим права токена `GITEATOKEN` +- Убедимся, что тег не существует + +3 **Ошибка сборки:** + +- Проверим зависимости в `go.mod` +- Убедимся в корректности Dockerfile ## Заключение @@ -699,12 +783,13 @@ Gitea Actions предоставляет мощные возможности д ### Архитектура системы -Этот и последующие разделы описывают инфраструктуру на которой я проверял все описанное выше. -Если у вас используются другие подходы, то можете пропустить их или ознакомиться для общего развития. +Этот и последующие разделы описывают инфраструктуру, на которой я проверял все описанное выше. +Если у вас используются другие подходы, то можете пропустить чтение этих разделов +или ознакомиться для общего развития. Итак инфраструктура состоит из следующих компонентов: -``` +``` text Proxmox VE (ARM64) ├── K3s Cluster ├── Master Node @@ -720,31 +805,34 @@ Proxmox VE (ARM64) ### Требования к системе **Proxmox VE:** -- ARM64 архитектура -- Минимум 8GB RAM -- 100GB свободного места -- Поддержка LXC контейнеров + +- ARM64 архитектура (orangepi 5 Plus) +- Минимум 8GB RAM (16Gb) +- 100GB свободного места (1 Gb) +- Поддержка LXC контейнеров (+) **K3s Cluster:** + - Kubernetes 1.24+ - Helm 3.8+ - Ingress Controller (Traefik) -- Persistent Storage (Longhorn) +- Persistent Storage (NFS) **LXC Container:** + - Ubuntu 22.04 LTS - 4GB RAM - 20GB дискового пространства - Docker Engine -- Go 1.21+ ## Установка Gitea в кластере K3s ### Анализ существующего кластера -Ваш кластер уже настроен и работает. Вот текущая конфигурация: +Текущая конфигурация: **Узлы кластера:** + ```bash kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME @@ -754,6 +842,7 @@ k3s-control-03 Ready control-plane,etcd,master 544d v1.33.2+k3s1 10.x ``` **Существующие компоненты:** + - Kubernetes v1.33.2+k3s1 - 3 узла control-plane с etcd - Traefik Ingress Controller @@ -804,7 +893,7 @@ valkey-data-gitea-valkey-cluster-2 Bound pvc-368f0ab9-7851-423f-afb9-443287 Доступ к gitea лучше сделать через ingress или на худой конец через port-forward: -1. **Временный доступ через port-forward:** +1 **Временный доступ через port-forward:** ```bash # Доступ к Gitea через port-forward @@ -814,7 +903,7 @@ kubectl port-forward -n gitea svc/gitea-http 3000:3000 curl http://localhost:3000 ``` -2. **Создание IngressRoute для постоянного доступа:** +2 **Создание IngressRoute для постоянного доступа:** ```yaml # gitea-ingressroute.yaml @@ -850,20 +939,21 @@ spec: KUBECONFIG=~/.kube/config_hlab kubectl apply -f gitea-ingress.yaml ``` -Таким образом мой инстанс gitea доступен с внешнего адреса https://direct-dev.ru/gitea +Таким образом мой инстанс gitea доступен с внешнего адреса в /data/gitea/conf/app.ini [server] -ROOT_URL = https://direct-dev.ru/gitea +ROOT_URL = DOMAIN = direct-dev.ru ### Конфигурация Gitea -Gitea установлен через Helm. +Gitea установлен через Helm. **Версия:** Gitea 1.24.3 (rootless) -**Архитектура:** +**Архитектура:** + - PostgreSQL для базы данных (развернут отдельно ) - Valkey cluster (Redis) для кэширования - NFS Storage Class для persistent storage @@ -892,7 +982,6 @@ helm repo update helm upgrade gitea gitea-charts/gitea -n gitea -f gitea-values.yaml ``` - **Проверка конфигурации:** ```bash @@ -949,27 +1038,31 @@ redis-cluster: enabled: false ``` +Как видите я организовал доступ через внешний IP к URL `https://direct-dev.ru/gitea`, то есть через префикс роута, опыт работы с actions показал, что лучше бы организовать было через поддомен третьего уровня: что то типа `https://gitea.direct-dev.ru` - в этом случае всякие разные предопределенные jobs типа checkout@v3 должны клонирование отрабатывать нормально. + ``` bash + # Проверка секретов kubectl get secrets -n gitea ``` -### Настройка Actions в существующем Gitea +### Настройка Actions в существующем инстансе Gitea -1. **Проверка включения Actions:** +1 **Проверка включения Actions:** ```bash # Проверка конфигурации Actions kubectl exec -n gitea deployment/gitea -c gitea -- cat /data/gitea/conf/app.ini" ``` -2. **Включение Actions через веб-интерфейс:** - - Откройте Gitea через port-forward или ingress - - Перейдите в Site Administration → Actions - - Включите "Enable Actions" - - Настройте "Default Actions URL" (например, https://gitea.com) +2 **Включение Actions через веб-интерфейс:** -3. **Проверка работы Actions:** +- Откройте Gitea через port-forward или ingress +- Перейдите в Site Administration → Actions +- Включите "Enable Actions" +- Настройте "Default Actions URL" (например, ) + +3 **Проверка работы Actions:** ```bash # Проверка логов Gitea на предмет ошибок Actions @@ -978,7 +1071,8 @@ kubectl logs -n gitea deployment/gitea | grep -i action ### Настройка DNS и SSL -Cert-Manager установлен. Инструкций вагон и маленькая тележка - не смысла повторяться. Проверим конфигурацию: +Инструкция по установке Cert-Manager не приводится - инструкций вагон и маленькая тележка - +нет смысла повторяться: ```bash # Проверка Cert-Manager @@ -990,12 +1084,13 @@ kubectl get clusterissuer 1. **Настройка DNS записи:** -```bash -# Добавить A-запись в DNS (у меня сloudflare) -gitea.your-domain.com -> внешний (белый) Ip - за ним пробросы портов если нужно ... чтобы в итоге запрос поступил на traefik +```text +Добавить A-запись в DNS (у меня сloudflare) +gitea.your-domain.com -> внешний (белый) Ip - за ним пробросы портов если нужно ... +чтобы в итоге запрос поступил на traefik ``` -2. **Создание ClusterIssuer (если не существует):** +2 **Создание ClusterIssuer (если не существует):** ```bash # Создание ClusterIssuer для Let's Encrypt - лучше через dns resolver @@ -1027,7 +1122,7 @@ EOF ### Доступ к Gitea -1. **Временный доступ через port-forward:** +1 **Временный доступ через port-forward:** ```bash # Доступ к Gitea через port-forward @@ -1036,14 +1131,14 @@ kubectl port-forward -n gitea svc/gitea-http 3000:3000 # В браузере http://localhost:3000/gitea ``` -2. **Постоянный доступ через ingressroute:** +2 **Постоянный доступ через ingressroute:** ``` bash # Проверка сертификата kubectl get certificate -n gitea ``` -3. **Проверка доступа:** +3 **Проверка доступа:** ```bash # Проверка через curl @@ -1094,7 +1189,7 @@ spec: # - Network: DHCP ``` -2. **Настройка сети:** +2 **Настройка сети:** ```bash # В контейнере @@ -1114,7 +1209,7 @@ apt update && apt upgrade -y apt install -y curl wget git vim htop ``` -2. **Установка Docker:** +2 **Установка Docker:** ```bash # Удаление старых версий @@ -1151,7 +1246,7 @@ systemctl start docker docker --version ``` -3. **Установка Go:** +3 **Установка Go:** ```bash # Скачивание Go для ARM64 @@ -1174,7 +1269,7 @@ go version mkdir -p $HOME/go/{bin,src,pkg} ``` -4. **Установка дополнительных инструментов:** +4 **Установка дополнительных инструментов:** ```bash # Установка build tools @@ -1216,7 +1311,7 @@ chmod +x /usr/local/bin/act_runner act_runner --version ``` -2. **Создание пользователя для runner:** +2 **Создание пользователя для runner:** ```bash # Создание пользователя @@ -1228,7 +1323,7 @@ mkdir -p /opt/gitea-runner chown gitea-runner:gitea-runner /opt/gitea-runner ``` -3. **Настройка конфигурации runner:** +3 **Настройка конфигурации runner:** ```bash # Переключение на пользователя runner @@ -1353,7 +1448,7 @@ EOF - Нажмите "New Runner" - Скопируйте токен регистрации -2. **Регистрация runner:** +2 **Регистрация runner:** ```bash # В контейнере LXC под пользователем gitea-runner @@ -1366,7 +1461,7 @@ act_runner register \ ``` -3. **Создание systemd сервиса:** +3 **Создание systemd сервиса:** ```bash # Создание файла сервиса @@ -1403,7 +1498,7 @@ systemctl status gitea-runner ### Настройка мониторинга -1. ** Cкрипт мониторинга:** +1. **Cкрипт мониторинга:** ```bash cat > /opt/gitea-runner/monitor.sh <<'EOF' @@ -1432,7 +1527,7 @@ EOF chmod +x /opt/gitea-runner/monitor.sh ``` -2. **Настройка cron для мониторинга:** +2 **Настройка cron для мониторинга:** ```bash # Добавление в crontab @@ -1449,7 +1544,7 @@ curl -H "Authorization: token YOUR_GITEA_TOKEN" \ https://gitea.your-domain.com/api/v1/actions/runners ``` -2. **Создание тестового workflow:** +2 **Создание тестового workflow:** ```yaml # .gitea/workflows/test-runner.yaml @@ -1517,7 +1612,7 @@ EOF systemctl restart docker ``` -2. **Настройка ограничений ресурсов:** +2 **Настройка ограничений ресурсов:** ```bash # Обновление systemd сервиса с ограничениями @@ -1580,7 +1675,6 @@ chmod +x /opt/gitea-runner/backup.sh echo "0 2 * * * /opt/gitea-runner/backup.sh" | crontab - ``` - ## Работа с кластером ### Основные команды для работы с кластером @@ -1644,4 +1738,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 -``` \ No newline at end of file +``` diff --git a/main.go b/main.go index 322879c..76d4334 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,7 @@ import ( "github.com/gin-gonic/gin" ) -const version = "1.0.27" +const version = "1.0.28" func main() { // Set Gin mode @@ -31,7 +31,7 @@ func main() { }) // Health check endpoint - r.GET("/health", func(c *gin.Context) { + r.GET("/healthz", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "status": "ok", "version": version, diff --git a/makefile b/makefile index 7556d08..69a52d7 100644 --- a/makefile +++ b/makefile @@ -2,7 +2,7 @@ BIN_DIR=bin APP_NAME=hello-api -VERSION=1.0.27 +VERSION=1.0.28 build: mkdir -p $(BIN_DIR)