Release v1.0.28
All checks were successful
Release Build / create-release (push) Successful in 6m40s
Release Build / create-docker-image (push) Successful in 3m28s
Release Build / update-to-release-branch (push) Successful in 7s

This commit is contained in:
2025-07-28 12:42:44 +06:00
parent dd3de165f7
commit c4a3ea4d98
6 changed files with 345 additions and 244 deletions

View File

@@ -1,4 +1,4 @@
name: Release Build name: Build Builder Docker Image
on: on:
push: push:
tags: tags:
@@ -21,31 +21,35 @@ jobs:
echo "github.sha = ${{ github.sha }}" echo "github.sha = ${{ github.sha }}"
echo "github.repository = ${{ github.repository }}" echo "github.repository = ${{ github.repository }}"
echo "========================" echo "========================"
echo "Cloning..."
git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea
cd hello_gitea cd hello_gitea
echo "Checkout to ${{ github.ref }} ..."
git checkout ${{ github.ref }} git checkout ${{ github.ref }}
- name: Setup Docker Buildx - name: Setup Docker Buildx
run: | run: |
# Docker is already installed in docker:dind image # Docker is already installed in docker:dind image
echo "look at docker version"
docker --version docker --version
# Setup Docker Buildx for multi-platform builds # Setup Docker Buildx for multi-platform builds
echo "setup buildx"
docker buildx create --use docker buildx create --use
docker buildx inspect --bootstrap docker buildx inspect --bootstrap
- name: Login to Docker Hub - name: Login to Docker Hub
run: | run: |
echo "login to docker hub ..."
echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
- name: Build multi-platform Docker images - name: Build multi-platform Docker images
run: | run: |
cd hello_gitea cd hello_gitea
# Build multi-platform images using buildx echo "Build multi-platform images using buildx ..."
docker buildx build \ docker buildx build \
--platform linux/amd64,linux/arm64 \ --platform linux/amd64,linux/arm64 \
--tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:${{ github.ref_name }} \ --tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:${{ github.ref_name }} \
--tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest \ --tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest \
--push \ --push \
-f Dockerfile.builder \ -f Dockerfile.builder \
. .

View File

@@ -5,130 +5,130 @@ on:
- v* - v*
jobs: jobs:
# create-release: create-release:
# runs-on: ubuntu-latest runs-on: ubuntu-latest
# container: container:
# # image: golang:1.21 # image: golang:1.21
# image: ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest image: ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest
# needs: create-release-branch needs: create-release-branch
# steps: steps:
# - name: Checkout repository - name: Checkout repository
# run: | run: |
# git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea
# cd hello_gitea cd hello_gitea
# git checkout ${{ github.ref }} git checkout ${{ github.ref }}
# - name: Setup Go - name: Setup Go
# run: | run: |
# # Install jq for JSON parsing # Install jq for JSON parsing
# apt-get update && apt-get install -y jq apt-get update && apt-get install -y jq
# git --version git --version
# go version go version
# jq --version jq --version
# - name: Build all binaries - name: Build all binaries
# run: | run: |
# cd hello_gitea cd hello_gitea
# mkdir -p bin mkdir -p bin
# # Build for all platforms # Build for all platforms
# GOOS=linux GOARCH=amd64 go build -o bin/hello-api-linux-amd64 main.go 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=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=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=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 GOOS=darwin GOARCH=arm64 go build -o bin/hello-api-darwin-arm64 main.go
# # Create archives # Create archives
# cd bin cd bin
# tar -czf hello-api-linux-amd64.tar.gz hello-api-linux-amd64 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-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-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-amd64.tar.gz hello-api-darwin-amd64
# tar -czf hello-api-darwin-arm64.tar.gz hello-api-darwin-arm64 tar -czf hello-api-darwin-arm64.tar.gz hello-api-darwin-arm64
# ls -la ls -la
# - name: Create Release - name: Create Release
# run: | run: |
# cd hello_gitea cd hello_gitea
# # Create release using Gitea API # Create release using Gitea API
# curl -X POST \ curl -X POST \
# -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ -H "Authorization: token ${{ secrets.GITEATOKEN }}" \
# -H "Content-Type: application/json" \ -H "Content-Type: application/json" \
# -d '{ -d '{
# "tag_name": "${{ github.ref_name }}", "tag_name": "${{ github.ref_name }}",
# "name": "Release ${{ github.ref_name }}", "name": "Release ${{ github.ref_name }}",
# "body": "Automated release with multi-platform binaries and Docker image", "body": "Automated release with multi-platform binaries and Docker image",
# "draft": false, "draft": false,
# "prerelease": false "prerelease": false
# }' \ }' \
# "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases" "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases"
# # Upload assets # Upload assets
# RELEASE_ID=$(curl -s -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ 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 }}" | \ "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/tags/${{ github.ref_name }}" | \
# jq -r '.id') jq -r '.id')
# # Upload all binaries # Upload all binaries
# for file in bin/*.tar.gz; do for file in bin/*.tar.gz; do
# echo "Uploading $file..." echo "Uploading $file..."
# curl -X POST \ curl -X POST \
# -H "Authorization: token ${{ secrets.GITEATOKEN }}" \ -H "Authorization: token ${{ secrets.GITEATOKEN }}" \
# -H "Content-Type: application/octet-stream" \ -H "Content-Type: application/octet-stream" \
# --data-binary @$file \ --data-binary @$file \
# "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=$(basename $file)" "https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=$(basename $file)"
# done done
# create-docker-image: 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:
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: container:
image: docker:28.3.2-dind 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: steps:
- name: Create Release Branch - name: Create Release Branch
run: | run: |
@@ -137,6 +137,9 @@ jobs:
echo "github.ref_name = ${{ github.ref_name }}" echo "github.ref_name = ${{ github.ref_name }}"
echo "github.sha = ${{ github.sha }}" echo "github.sha = ${{ github.sha }}"
echo "github.repository = ${{ github.repository }}" echo "github.repository = ${{ github.repository }}"
echo "DOCKERHUB_USERNAME = ${{ secrets.DOCKERHUB_USERNAME }}"
echo "DOCKERHUB_TOKEN = ${{ secrets.DOCKERHUB_TOKEN }}"
echo "GITEATOKEN = ${{ secrets.GITEATOKEN }}"
echo "========================" echo "========================"
# Clone repository # Clone repository
echo "Cloning repository..." echo "Cloning repository..."

View File

@@ -57,7 +57,7 @@ export PORT=3000
} }
``` ```
### GET /health ### GET /healthz
Health check endpoint Health check endpoint
**Ответ:** **Ответ:**
@@ -133,7 +133,7 @@ go run main.go
# Тестирование API # Тестирование API
curl http://localhost:8080/ curl http://localhost:8080/
curl http://localhost:8080/health curl http://localhost:8080/healthz
curl http://localhost:8080/api/v1/info curl http://localhost:8080/api/v1/info
curl -X POST http://localhost:8080/api/v1/echo \ curl -X POST http://localhost:8080/api/v1/echo \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \

View File

@@ -1,13 +1,13 @@
# Настройка Gitea Actions для Go проекта: Полное руководство # Настройка Gitea Actions для Go проекта: Полное руководство
--- ```metadata
**readTime:** 15-20 минут readTime: 15-20 минут
**date:** 2025-07-27 18:00 date: 2025-07-27 18:00
**author:** Direct-Dev(aka Антон Кузнецов) author: Direct-Dev(aka Антон Кузнецов)
**level:** Средний level: Средний
**tags:** #gitea #gitea-actions #ci-cd #go #docker #devops #automation #k3s tags: #gitea #gitea-actions #ci-cd #go #docker #devops #automation #k3s
**version:** 1.0.0 version: 1.0.0
--- ```
## Содержание ## Содержание
@@ -19,13 +19,13 @@
6. [Тестирование и запуск](#тестирование-и-запуск) 6. [Тестирование и запуск](#тестирование-и-запуск)
7. [Мониторинг и отладка](#мониторинг-и-отладка) 7. [Мониторинг и отладка](#мониторинг-и-отладка)
8. [Заключение](#заключение) 8. [Заключение](#заключение)
9. [Инфраструктура](#инфраструктура) A. [Инфраструктура](#инфраструктура)
10. [Установка Gitea в кластере K3s](#установка-gitea-в-кластере-k3s) B. [Установка Gitea в кластере K3s](#установка-gitea-в-кластере-k3s)
11. [Настройка Gitea Runner в LXC контейнере](#настройка-gitea-runner-в-lxc-контейнере) C. [Настройка Gitea Runner в LXC контейнере](#настройка-gitea-runner-в-lxc-контейнере)
## Введение ## Введение
Gitea Actions — это встроенная система непрерывной интеграции и развертывания (CI/CD) в Gitea, которая позволяет автоматизировать процессы сборки, тестирования и развертывания ваших проектов. Большой плюс этой системы в том, что она достаточна не требовательна к ресурсам и может быть развернута в собственном изолированном окружении. Gitea Actions — это встроенная система непрерывной интеграции и развертывания (CI/CD) в Gitea, которая позволяет автоматизировать процессы сборки, тестирования и развертывания ваших проектов. Большой плюс этой системы в том, что она достаточна не требовательна к ресурсам и может быть развернута в собственном изолированном окружении.
В этой статье мы рассмотрим пример работы с данной системой, на примере того как настроить Gitea Actions для Go проекта с автоматической сборкой мультиплатформенных бинарников, созданием Docker образов и публикацией релизов. В этой статье мы рассмотрим пример работы с данной системой, на примере того как настроить Gitea Actions для Go проекта с автоматической сборкой мультиплатформенных бинарников, созданием Docker образов и публикацией релизов.
@@ -43,7 +43,7 @@ Gitea Actions — это встроенная система непрерывн
Собственно функциональная часть проекта Go не блещет оригинальностью и имеет следующую простую структуру: Собственно функциональная часть проекта Go не блещет оригинальностью и имеет следующую простую структуру:
``` ``` text
hello_gitea/ hello_gitea/
├── main.go # Основной код приложения ├── main.go # Основной код приложения
├── go.mod # Зависимости Go ├── go.mod # Зависимости Go
@@ -93,7 +93,7 @@ func main() {
}) })
// Endpoints // Endpoints
r.GET("/health", func(c *gin.Context) { r.GET("/healthz", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": "ok", "status": "ok",
"version": version, "version": version,
@@ -148,8 +148,8 @@ func main() {
### Dockerfile ### Dockerfile
Помимо того, что мы будем собирать бинарники для разных платформ, мы также настроим сборку docker image в котором будем Помимо того, что мы будем собирать бинарники для разных платформ, мы также настроим сборку docker image в котором будем
запускать наш сервер api - это может быть полезным для развертывания нашего приложения, если мы настроим такое - например запускать наш сервер api - это может быть полезным для развертывания нашего приложения, если мы настроим такое - например
через ArgoCD или flux (впрочем это тема отдельнйо статьи). через ArgoCD или flux (впрочем это тема отдельнйо статьи).
Итак для контейнеризации используем многоэтапную сборку, что как вещают мудрецы является якобы полезным и правильным. Итак для контейнеризации используем многоэтапную сборку, что как вещают мудрецы является якобы полезным и правильным.
@@ -191,23 +191,22 @@ EXPOSE 8080
CMD ["./hello-api"] CMD ["./hello-api"]
``` ```
**Ремарка:** **Ремарка:**
Тут хочется немного поразмышлять - по хорошему надо или разобраться в вариантах кэширования gitea или в качестве Тут хочется немного поразмышлять - по хорошему надо или разобраться в вариантах кэширования gitea или в качестве
базововго образа для каждого из этапов использовать предварительно собранный образ со всем необходимым. базововго образа для каждого из этапов использовать предварительно собранный образ со всем необходимым.
При каждом запуске workflow будет запускаться новый контейнер docker in docker и там запускаться построение образа естественно кэшей не будет или надо как то придумывать как их хранить на ранере и пробрасывать в dind. Ну или руками сделать нужные образы и использоват их в Dockerfile. Правда пулиться они опять же будут походу каждый раз. Короче говоря тут есть чем поразбираться и пооптимизировать ... При каждом запуске workflow будет запускаться новый контейнер docker in docker и там запускаться построение образа естественно кэшей не будет или надо как то придумывать как их хранить на ранере и пробрасывать в dind. Ну или руками сделать нужные образы и использоват их в Dockerfile. Правда пулиться они опять же будут походу каждый раз. Короче говоря тут есть чем поразбираться и пооптимизировать ...
## Настройка Gitea Actions ## Настройка Gitea Actions
### Включение Actions в Gitea ### Включение Actions в Gitea
1. **Проверьте версию Gitea** 1. **Проверьте версию Gitea**
Gitea Actions доступны начиная с версии 1.17.0. Убедитесь, что ваш сервер Gitea поддерживает Actions. Gitea Actions доступны начиная с версии 1.17.0. Убедитесь, что ваш сервер Gitea поддерживает Actions.
2. **Включите Actions в настройках репозитория** 2. **Включите Actions в настройках репозитория**
- Перейдите в настройки репозитория - Перейдите в настройки репозитория
- Найдите раздел "Actions" - Найдите раздел "Actions"
- Включите "Enable Actions" - Включите "Enable Actions"
@@ -215,7 +214,7 @@ CMD ["./hello-api"]
### Создание токена доступа ### Создание токена доступа
1. **Создайте токен для Actions** 1. **Создайте токен для Actions**
- Перейдите в настройки профиля → "Applications" - Перейдите в настройки профиля → "Applications"
- Создайте новый токен с правами на репозиторий - Создайте новый токен с правами на репозиторий
- Скопируйте токен (он понадобится позже) - Скопируйте токен (он понадобится позже)
@@ -363,29 +362,32 @@ jobs:
### Разберемся как работает workflow ### Разберемся как работает workflow
**Триггеры:** **Триггеры:**
- Workflow запускается при создании тега, начинающегося с `v*` (например, `v1.0.0`) - Workflow запускается при создании тега, начинающегося с `v*` (например, `v1.0.0`)
**Jobs:** **Jobs:**
1. **create-docker-image:** - создание образов docker с нашим проектом 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-in-Docker контейнер (image: docker:28.3.2-dind)
- Авторизуемч в Docker Hub (echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin) - Настраиваем Docker Buildx для мультиплатформенной сборки (docker buildx create --use docker buildx inspect --bootstrap)
- Собирает образы для Linux AMD64 и ARM64 (docker buildx build \ ...) - Авторизуемч в Docker Hub (echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin)
- Публикует образы с тегом версии и `latest` (--push) - Собирает образы для Linux AMD64 и ARM64 (docker buildx build \ ...)
- Публикует образы с тегом версии и `latest` (--push)
чтобы авторизация сработала на докерхабе надо внести секреты DOCKERHUB_TOKEN, DOCKERHUB_USERNAME или вцелом для всей gitea в настройках или в настройках конкретного репозитория чтобы авторизация сработала на докерхабе надо внести секреты DOCKERHUB_TOKEN, DOCKERHUB_USERNAME или вцелом для всей gitea в настройках или в настройках конкретного репозитория
я использовал докерхаб, но можно заморочиться и настроить работу с приватным репозиторием ... я использовал докерхаб, но можно заморочиться и настроить работу с приватным репозиторием ...
2. **create-release:** 2 **create-release:**
- Запускается после успешной сборки Docker образов
- Использует Go контейнер для сборки бинарников (image: golang:1.21)
- Собирает бинарники для всех платформ (Linux, Windows, macOS)
- Создает архивы с бинарниками
- Создает релиз через Gitea API
- Загружает бинарники как assets релиза
при каждом запуске, как я понимаю, данного job будет скачиваться и устанавливаться в контейнере, созданном на базе golang:1.21 - Запускается после успешной сборки Docker образов
- Использует Go контейнер для сборки бинарников (image: golang:1.21)
- Собирает бинарники для всех платформ (Linux, Windows, macOS)
- Создает архивы с бинарниками
- Создает релиз через Gitea API
- Загружает бинарники как assets релиза
при каждом запуске данного job будет скачиваться jq и устанавливаться в контейнере, созданном на базе golang:1.21
```yaml ```yaml
- name: Setup Go - name: Setup Go
@@ -397,28 +399,98 @@ jobs:
jq --version jq --version
``` ```
решение как говорится в лоб: чтобы убрать эту работу при каждом выполнении workflow надо сделать свой образ **решение в лоб:** чтобы убрать эту повторяющуюся работу при каждом выполнении workflow надо сделать свой образ - например "${DOCKERHUB_USERNAME}"/my-build-golang-runner:latest
``` Dockerfile ``` Dockerfile
# базовый образ
FROM golang:1.24 FROM golang:1.24
# Install some packages # Устанавливаем пакеты (одинаково работают на amd64/arm64)
RUN apt-get update && apt-get install -y git ca-certificates jq 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 ```bash
#!/bin/bash #!/bin/bash
docker buildx build \ docker buildx build \
--platform linux/amd64,linux/arm64 \ --platform linux/amd64,linux/arm64 \
--tag ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest \ --tag ${DOCKERHUB_USERNAME:-defaultdockeruser}/my-build-golang-runner:latest \
--push \ --push \
-f Dockerfile_for_runner_image \ -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:** **Gitea Token:**
1. Перейдите в настройки профиля → "Applications" 1. Перейдите в настройки профиля → "Applications"
2. Создайте новый токен с правами на репозиторий 2. Создайте новый токен с правами на репозиторий
3. Скопируйте токен 3. Скопируйте токен
4. В разделе Actions репозитория создайте секрет уровня репозитория - я создал с именем GITEATOKEN (такой не даст сделать: GITEA_TOKEN) 4. В разделе Actions репозитория создайте секрет уровня репозитория - я создал с именем GITEATOKEN (такой не даст сделать: GITEA_TOKEN)
**Docker Hub Token:** **Docker Hub Token:**
1. Войдите в Docker Hub 1. Войдите в Docker Hub
2. Перейдите в Account Settings → Security 2. Перейдите в Account Settings → Security
3. Создайте новый Access Token 3. Создайте новый Access Token
@@ -457,7 +531,7 @@ docker buildx build \
### Локальное тестирование ### Локальное тестирование
1. **Проверим синтаксис workflow:** 1 **Проверим синтаксис workflow:**
ну если мы в ide то наверное все автоматом отформатировано ну если мы в ide то наверное все автоматом отформатировано
но тем не менее ... но тем не менее ...
@@ -467,7 +541,8 @@ docker buildx build \
yamllint .gitea/workflows/build.yaml yamllint .gitea/workflows/build.yaml
``` ```
2. **Протестируем сборку локально:** 2 **Протестируем сборку локально:**
```bash ```bash
# Сборка для текущей платформы # Сборка для текущей платформы
go build -o hello-api main.go 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 GOOS=linux GOARCH=arm64 go build -o hello-api-linux-arm64 main.go
``` ```
3. **Тестирование Docker образа:** 3 **Тестирование Docker образа:**
```bash ```bash
# Сборка образа # Сборка образа
docker build -t hello-api:test . docker build -t hello-api:test .
@@ -486,12 +562,13 @@ docker buildx build \
docker run -p 8080:8080 hello-api:test docker run -p 8080:8080 hello-api:test
# Тестирование API # Тестирование API
curl http://localhost:8080/health curl http://localhost:8080/healthz
``` ```
### Запуск Actions ### Запуск Actions
1. **Создаем тег:** 1 **Создаем тег:**
```bash ```bash
git tag v1.1.20 git tag v1.1.20
@@ -617,54 +694,61 @@ docker buildx build \
``` ```
2. **Мониторинг выполнения:** 2 **Мониторинг выполнения:**
- Переходим в репозиторий → "Actions"
- Находим запущенный workflow - Переходим в репозиторий → "Actions"
- Отслеживаем выполнение каждого job - Находим запущенный workflow
- Отслеживаем выполнение каждого job
### Ожидаемый результат ### Ожидаемый результат
После успешного выполнения: После успешного выполнения:
1. **Docker образы** будут опубликованы в Docker Hub: 1 **Docker образы** будут опубликованы в Docker Hub:
- `username/hello-api:v1.1.20`
- `username/hello-api:latest`
2. **Релиз** будет создан в Gitea с бинарниками: - `username/hello-api:v1.1.20`
- `hello-api-linux-amd64.tar.gz` - `username/hello-api:latest`
- `hello-api-linux-arm64.tar.gz`
- `hello-api-windows-amd64.tar.gz` 2 **Релиз** будет создан в Gitea с бинарниками:
- `hello-api-darwin-amd64.tar.gz`
- `hello-api-darwin-arm64.tar.gz` - `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:** 1 **В Gitea:**
- Переходим в репозиторий → "Actions"
- Выберем workflow
- Нажмем на job для просмотра логов
2. **Отладка ошибок:** - Переходим в репозиторий → "Actions"
- Проверим правильность секретов - Выберем workflow
- Убедимся в корректности путей к репозиторию - Нажмем на job для просмотра логов
- Проверим права доступа токенов
2 **Отладка ошибок:**
- Проверим правильность секретов
- Убедимся в корректности путей к репозиторию
- Проверим права доступа токенов
### Частые проблемы ### Частые проблемы
1. **Ошибка авторизации в Docker Hub:** 1 **Ошибка авторизации в Docker Hub:**
- Проверим правильность `DOCKERHUB_TOKEN`
- Убедимся, что токен не истек
2. **Ошибка создания релиза:** - Проверим правильность `DOCKERHUB_TOKEN`
- Проверим права токена `GITEATOKEN` - Убедимся, что токен не истек
- Убедимся, что тег не существует
3. **Ошибка сборки:** 2 **Ошибка создания релиза:**
- Проверим зависимости в `go.mod`
- Убедимся в корректности Dockerfile
- Проверим права токена `GITEATOKEN`
- Убедимся, что тег не существует
3 **Ошибка сборки:**
- Проверим зависимости в `go.mod`
- Убедимся в корректности Dockerfile
## Заключение ## Заключение
@@ -699,12 +783,13 @@ Gitea Actions предоставляет мощные возможности д
### Архитектура системы ### Архитектура системы
Этот и последующие разделы описывают инфраструктуру на которой я проверял все описанное выше. Этот и последующие разделы описывают инфраструктуру, на которой я проверял все описанное выше.
Если у вас используются другие подходы, то можете пропустить их или ознакомиться для общего развития. Если у вас используются другие подходы, то можете пропустить чтение этих разделов
или ознакомиться для общего развития.
Итак инфраструктура состоит из следующих компонентов: Итак инфраструктура состоит из следующих компонентов:
``` ``` text
Proxmox VE (ARM64) Proxmox VE (ARM64)
├── K3s Cluster ├── K3s Cluster
├── Master Node ├── Master Node
@@ -720,31 +805,34 @@ Proxmox VE (ARM64)
### Требования к системе ### Требования к системе
**Proxmox VE:** **Proxmox VE:**
- ARM64 архитектура
- Минимум 8GB RAM - ARM64 архитектура (orangepi 5 Plus)
- 100GB свободного места - Минимум 8GB RAM (16Gb)
- Поддержка LXC контейнеров - 100GB свободного места (1 Gb)
- Поддержка LXC контейнеров (+)
**K3s Cluster:** **K3s Cluster:**
- Kubernetes 1.24+ - Kubernetes 1.24+
- Helm 3.8+ - Helm 3.8+
- Ingress Controller (Traefik) - Ingress Controller (Traefik)
- Persistent Storage (Longhorn) - Persistent Storage (NFS)
**LXC Container:** **LXC Container:**
- Ubuntu 22.04 LTS - Ubuntu 22.04 LTS
- 4GB RAM - 4GB RAM
- 20GB дискового пространства - 20GB дискового пространства
- Docker Engine - Docker Engine
- Go 1.21+
## Установка Gitea в кластере K3s ## Установка Gitea в кластере K3s
### Анализ существующего кластера ### Анализ существующего кластера
Ваш кластер уже настроен и работает. Вот текущая конфигурация: Текущая конфигурация:
**Узлы кластера:** **Узлы кластера:**
```bash ```bash
kubectl get nodes -o wide kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME 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 - Kubernetes v1.33.2+k3s1
- 3 узла control-plane с etcd - 3 узла control-plane с etcd
- Traefik Ingress Controller - Traefik Ingress Controller
@@ -804,7 +893,7 @@ valkey-data-gitea-valkey-cluster-2 Bound pvc-368f0ab9-7851-423f-afb9-443287
Доступ к gitea лучше сделать через ingress или на худой конец через port-forward: Доступ к gitea лучше сделать через ingress или на худой конец через port-forward:
1. **Временный доступ через port-forward:** 1 **Временный доступ через port-forward:**
```bash ```bash
# Доступ к Gitea через port-forward # Доступ к Gitea через port-forward
@@ -814,7 +903,7 @@ kubectl port-forward -n gitea svc/gitea-http 3000:3000
curl http://localhost:3000 curl http://localhost:3000
``` ```
2. **Создание IngressRoute для постоянного доступа:** 2 **Создание IngressRoute для постоянного доступа:**
```yaml ```yaml
# gitea-ingressroute.yaml # gitea-ingressroute.yaml
@@ -850,20 +939,21 @@ spec:
KUBECONFIG=~/.kube/config_hlab kubectl apply -f gitea-ingress.yaml KUBECONFIG=~/.kube/config_hlab kubectl apply -f gitea-ingress.yaml
``` ```
Таким образом мой инстанс gitea доступен с внешнего адреса https://direct-dev.ru/gitea Таким образом мой инстанс gitea доступен с внешнего адреса <https://direct-dev.ru/gitea>
в /data/gitea/conf/app.ini в /data/gitea/conf/app.ini
[server] [server]
ROOT_URL = https://direct-dev.ru/gitea ROOT_URL = <https://direct-dev.ru/gitea>
DOMAIN = direct-dev.ru DOMAIN = direct-dev.ru
### Конфигурация Gitea ### Конфигурация Gitea
Gitea установлен через Helm. Gitea установлен через Helm.
**Версия:** Gitea 1.24.3 (rootless) **Версия:** Gitea 1.24.3 (rootless)
**Архитектура:** **Архитектура:**
- PostgreSQL для базы данных (развернут отдельно ) - PostgreSQL для базы данных (развернут отдельно )
- Valkey cluster (Redis) для кэширования - Valkey cluster (Redis) для кэширования
- NFS Storage Class для persistent storage - NFS Storage Class для persistent storage
@@ -892,7 +982,6 @@ helm repo update
helm upgrade gitea gitea-charts/gitea -n gitea -f gitea-values.yaml helm upgrade gitea gitea-charts/gitea -n gitea -f gitea-values.yaml
``` ```
**Проверка конфигурации:** **Проверка конфигурации:**
```bash ```bash
@@ -949,27 +1038,31 @@ redis-cluster:
enabled: false enabled: false
``` ```
Как видите я организовал доступ через внешний IP к URL `https://direct-dev.ru/gitea`, то есть через префикс роута, опыт работы с actions показал, что лучше бы организовать было через поддомен третьего уровня: что то типа `https://gitea.direct-dev.ru` - в этом случае всякие разные предопределенные jobs типа checkout@v3 должны клонирование отрабатывать нормально.
``` bash ``` bash
# Проверка секретов # Проверка секретов
kubectl get secrets -n gitea kubectl get secrets -n gitea
``` ```
### Настройка Actions в существующем Gitea ### Настройка Actions в существующем инстансе Gitea
1. **Проверка включения Actions:** 1 **Проверка включения Actions:**
```bash ```bash
# Проверка конфигурации Actions # Проверка конфигурации Actions
kubectl exec -n gitea deployment/gitea -c gitea -- cat /data/gitea/conf/app.ini" kubectl exec -n gitea deployment/gitea -c gitea -- cat /data/gitea/conf/app.ini"
``` ```
2. **Включение Actions через веб-интерфейс:** 2 **Включение Actions через веб-интерфейс:**
- Откройте Gitea через port-forward или ingress
- Перейдите в Site Administration → Actions
- Включите "Enable Actions"
- Настройте "Default Actions URL" (например, https://gitea.com)
3. **Проверка работы Actions:** - Откройте Gitea через port-forward или ingress
- Перейдите в Site Administration → Actions
- Включите "Enable Actions"
- Настройте "Default Actions URL" (например, <https://gitea.com>)
3 **Проверка работы Actions:**
```bash ```bash
# Проверка логов Gitea на предмет ошибок Actions # Проверка логов Gitea на предмет ошибок Actions
@@ -978,7 +1071,8 @@ kubectl logs -n gitea deployment/gitea | grep -i action
### Настройка DNS и SSL ### Настройка DNS и SSL
Cert-Manager установлен. Инструкций вагон и маленькая тележка - не смысла повторяться. Проверим конфигурацию: Инструкция по установке Cert-Manager не приводится - инструкций вагон и маленькая тележка -
нет смысла повторяться:
```bash ```bash
# Проверка Cert-Manager # Проверка Cert-Manager
@@ -990,12 +1084,13 @@ kubectl get clusterissuer
1. **Настройка DNS записи:** 1. **Настройка DNS записи:**
```bash ```text
# Добавить A-запись в DNS (у меня сloudflare) Добавить A-запись в DNS (у меня сloudflare)
gitea.your-domain.com -> внешний (белый) Ip - за ним пробросы портов если нужно ... чтобы в итоге запрос поступил на traefik gitea.your-domain.com -> внешний (белый) Ip - за ним пробросы портов если нужно ...
чтобы в итоге запрос поступил на traefik
``` ```
2. **Создание ClusterIssuer (если не существует):** 2 **Создание ClusterIssuer (если не существует):**
```bash ```bash
# Создание ClusterIssuer для Let's Encrypt - лучше через dns resolver # Создание ClusterIssuer для Let's Encrypt - лучше через dns resolver
@@ -1027,7 +1122,7 @@ EOF
### Доступ к Gitea ### Доступ к Gitea
1. **Временный доступ через port-forward:** 1 **Временный доступ через port-forward:**
```bash ```bash
# Доступ к Gitea через port-forward # Доступ к Gitea через port-forward
@@ -1036,14 +1131,14 @@ kubectl port-forward -n gitea svc/gitea-http 3000:3000
# В браузере http://localhost:3000/gitea # В браузере http://localhost:3000/gitea
``` ```
2. **Постоянный доступ через ingressroute:** 2 **Постоянный доступ через ingressroute:**
``` bash ``` bash
# Проверка сертификата # Проверка сертификата
kubectl get certificate -n gitea kubectl get certificate -n gitea
``` ```
3. **Проверка доступа:** 3 **Проверка доступа:**
```bash ```bash
# Проверка через curl # Проверка через curl
@@ -1094,7 +1189,7 @@ spec:
# - Network: DHCP # - Network: DHCP
``` ```
2. **Настройка сети:** 2 **Настройка сети:**
```bash ```bash
# В контейнере # В контейнере
@@ -1114,7 +1209,7 @@ apt update && apt upgrade -y
apt install -y curl wget git vim htop apt install -y curl wget git vim htop
``` ```
2. **Установка Docker:** 2 **Установка Docker:**
```bash ```bash
# Удаление старых версий # Удаление старых версий
@@ -1151,7 +1246,7 @@ systemctl start docker
docker --version docker --version
``` ```
3. **Установка Go:** 3 **Установка Go:**
```bash ```bash
# Скачивание Go для ARM64 # Скачивание Go для ARM64
@@ -1174,7 +1269,7 @@ go version
mkdir -p $HOME/go/{bin,src,pkg} mkdir -p $HOME/go/{bin,src,pkg}
``` ```
4. **Установка дополнительных инструментов:** 4 **Установка дополнительных инструментов:**
```bash ```bash
# Установка build tools # Установка build tools
@@ -1216,7 +1311,7 @@ chmod +x /usr/local/bin/act_runner
act_runner --version act_runner --version
``` ```
2. **Создание пользователя для runner:** 2 **Создание пользователя для runner:**
```bash ```bash
# Создание пользователя # Создание пользователя
@@ -1228,7 +1323,7 @@ mkdir -p /opt/gitea-runner
chown gitea-runner:gitea-runner /opt/gitea-runner chown gitea-runner:gitea-runner /opt/gitea-runner
``` ```
3. **Настройка конфигурации runner:** 3 **Настройка конфигурации runner:**
```bash ```bash
# Переключение на пользователя runner # Переключение на пользователя runner
@@ -1353,7 +1448,7 @@ EOF
- Нажмите "New Runner" - Нажмите "New Runner"
- Скопируйте токен регистрации - Скопируйте токен регистрации
2. **Регистрация runner:** 2 **Регистрация runner:**
```bash ```bash
# В контейнере LXC под пользователем gitea-runner # В контейнере LXC под пользователем gitea-runner
@@ -1366,7 +1461,7 @@ act_runner register \
``` ```
3. **Создание systemd сервиса:** 3 **Создание systemd сервиса:**
```bash ```bash
# Создание файла сервиса # Создание файла сервиса
@@ -1403,7 +1498,7 @@ systemctl status gitea-runner
### Настройка мониторинга ### Настройка мониторинга
1. ** рипт мониторинга:** 1. **Cкрипт мониторинга:**
```bash ```bash
cat > /opt/gitea-runner/monitor.sh <<'EOF' cat > /opt/gitea-runner/monitor.sh <<'EOF'
@@ -1432,7 +1527,7 @@ EOF
chmod +x /opt/gitea-runner/monitor.sh chmod +x /opt/gitea-runner/monitor.sh
``` ```
2. **Настройка cron для мониторинга:** 2 **Настройка cron для мониторинга:**
```bash ```bash
# Добавление в crontab # Добавление в crontab
@@ -1449,7 +1544,7 @@ curl -H "Authorization: token YOUR_GITEA_TOKEN" \
https://gitea.your-domain.com/api/v1/actions/runners https://gitea.your-domain.com/api/v1/actions/runners
``` ```
2. **Создание тестового workflow:** 2 **Создание тестового workflow:**
```yaml ```yaml
# .gitea/workflows/test-runner.yaml # .gitea/workflows/test-runner.yaml
@@ -1517,7 +1612,7 @@ EOF
systemctl restart docker systemctl restart docker
``` ```
2. **Настройка ограничений ресурсов:** 2 **Настройка ограничений ресурсов:**
```bash ```bash
# Обновление systemd сервиса с ограничениями # Обновление systemd сервиса с ограничениями
@@ -1580,7 +1675,6 @@ chmod +x /opt/gitea-runner/backup.sh
echo "0 2 * * * /opt/gitea-runner/backup.sh" | crontab - 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-postgres
kubectl exec -n gitea deployment/gitea -- ping gitea-valkey-cluster kubectl exec -n gitea deployment/gitea -- ping gitea-valkey-cluster
``` ```

View File

@@ -7,7 +7,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
const version = "1.0.27" const version = "1.0.28"
func main() { func main() {
// Set Gin mode // Set Gin mode
@@ -31,7 +31,7 @@ func main() {
}) })
// Health check endpoint // Health check endpoint
r.GET("/health", func(c *gin.Context) { r.GET("/healthz", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"status": "ok", "status": "ok",
"version": version, "version": version,

View File

@@ -2,7 +2,7 @@
BIN_DIR=bin BIN_DIR=bin
APP_NAME=hello-api APP_NAME=hello-api
VERSION=1.0.27 VERSION=1.0.28
build: build:
mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)