2 Commits

Author SHA1 Message Date
6d9a869a6f 3-ый релиз образа для билда
All checks were successful
Release Build / create-builder-docker-image (push) Successful in 2m17s
2025-07-28 07:57:50 +06:00
a3867ba3de 2-ый релиз образа для билда
Some checks failed
Release Build / create-builder-docker-image (push) Failing after 20s
2025-07-28 07:55:58 +06:00
11 changed files with 263 additions and 493 deletions

View File

@@ -5,12 +5,56 @@ on:
- v*
jobs:
create-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 }}/hello-api:${{ github.ref_name }} \
--tag ${{ secrets.DOCKERHUB_USERNAME }}/hello-api:latest \
--push \
.
create-release:
runs-on: ubuntu-latest
container:
# image: golang:1.21
image: ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest
needs: create-release-branch
image: ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest
needs: create-docker-image
steps:
- name: Checkout repository
run: |
@@ -78,95 +122,3 @@ jobs:
--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 \
.
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: |
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 "DOCKERHUB_USERNAME = ${{ secrets.DOCKERHUB_USERNAME }}"
echo "DOCKERHUB_TOKEN = ${{ secrets.DOCKERHUB_TOKEN }}"
echo "GITEATOKEN = ${{ secrets.GITEATOKEN }}"
echo "========================"
# Clone repository
echo "Cloning repository..."
git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea
cd hello_gitea
# Configure git
echo "Configuring git..."
git config user.email "info@direct-dev.ru"
git config user.name "Direct-Dev-Robot"
# Check if release branch exists
echo "Checking if release branch exists..."
if git ls-remote --heads origin release | grep -q release; then
echo "Release branch exists, checking out..."
git checkout release
echo "release branch exists - pulling release branch..."
git pull origin release
else
echo "release branch does not exist - creating new release branch..."
git checkout -b release
fi
# Reset to the tag commit
echo "Resetting to the tag commit ${{ github.ref_name }} ..."
git reset --hard ${{ github.ref_name }}
# Push changes to release branch
echo "Pushing changes to release branch..."
git push origin release --force

View File

@@ -1,4 +1,4 @@
name: Build Builder Docker Image
name: Release Build
on:
push:
tags:
@@ -21,31 +21,26 @@ 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
echo "Build multi-platform images using buildx ..."
# 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 }} \
@@ -53,3 +48,4 @@ jobs:
--push \
-f Dockerfile.builder \
.

View File

@@ -57,7 +57,7 @@ export PORT=3000
}
```
### GET /healthz
### GET /health
Health check endpoint
**Ответ:**
@@ -133,7 +133,7 @@ go run main.go
# Тестирование API
curl http://localhost:8080/
curl http://localhost:8080/healthz
curl http://localhost:8080/health
curl http://localhost:8080/api/v1/info
curl -X POST http://localhost:8080/api/v1/echo \
-H "Content-Type: application/json" \
@@ -142,27 +142,13 @@ curl -X POST http://localhost:8080/api/v1/echo \
## 🚀 CI/CD
При создании тега (например, `v1.1.20`) автоматически:
При создании тега (например, `v1.1.0`) автоматически:
1. Собираются бинарники для всех платформ
2. Создается Docker образ для Linux AMD64/ARM64
3. Образ публикуется в Docker Hub
4. Создается релиз в Gitea с бинарниками
Дополнительно `.gitea/workflows/build_build.yaml` предназначен для автоматизации процесса сборки и публикации Docker-образов билдера - то есть образа который будет использоваться в основном процессе сборки и релиза. Этот workflow запускается (триггерится) автоматически при пуше тега, начинающегося с `builder-` (например, `builder-v1.2.3`), в репозиторий на сервере Gitea.
Когда такой тег появляется, workflow выполняет следующие задачи:
- Клонирует репозиторий и переключается на соответствующую версию кода.
- Настраивает окружение для сборки Docker-образов с поддержкой мультиплатформенности (amd64 и arm64).
- Выполняет аутентификацию в Docker Hub.
- Собирает и публикует Docker-образы для разных архитектур (tag DOCKERHUB_USERNAME/my-build-golang-runnerr:builder-v1.2.3 и tag DOCKERHUB_USERNAME/my-build-golang-runner:latest.
- Для сборки используется специальный Dockerfile (`Dockerfile.builder`) для создания образа билдера.
Таким образом, данный файл обеспечивает автоматическую сборку и публикацию артефактов проекта при выпуске новых версий, что упрощает процесс релиза и гарантирует наличие актуальных образов и бинарников для пользователей.
## 📄 Лицензия
MIT License

BIN
bin/hello-api-1.0.0 Executable file

Binary file not shown.

View File

@@ -1,124 +0,0 @@
name: Release Build
on:
push:
tags:
- v*
jobs:
create-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 }}/hello-api:${{ github.ref_name }} \
--tag ${{ secrets.DOCKERHUB_USERNAME }}/hello-api:latest \
--push \
.
create-release:
runs-on: ubuntu-latest
container:
# image: golang:1.21
image: ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest
needs: create-docker-image
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 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
# 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
- 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 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

View File

@@ -2,7 +2,7 @@
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag "${DOCKERHUB_USERNAME:-kuznetcovay}"/my-build-golang-runner:latest \
--tag ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest \
--push \
-f Dockerfile_for_runner_image \
.

View File

@@ -1,13 +1,13 @@
# Настройка Gitea Actions для Go проекта: Полное руководство
```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
```
---
**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,9 +19,9 @@ version: 1.0.0
6. [Тестирование и запуск](#тестирование-и-запуск)
7. [Мониторинг и отладка](#мониторинг-и-отладка)
8. [Заключение](#заключение)
A. [Инфраструктура](#инфраструктура)
B. [Установка Gitea в кластере K3s](#установка-gitea-в-кластере-k3s)
C. [Настройка Gitea Runner в LXC контейнере](#настройка-gitea-runner-в-lxc-контейнере)
9. [Инфраструктура](#инфраструктура)
10. [Установка Gitea в кластере K3s](#установка-gitea-в-кластере-k3s)
11. [Настройка Gitea Runner в LXC контейнере](#настройка-gitea-runner-в-lxc-контейнере)
## Введение
@@ -43,7 +43,7 @@ Gitea Actions — это встроенная система непрерывн
Собственно функциональная часть проекта Go не блещет оригинальностью и имеет следующую простую структуру:
``` text
```
hello_gitea/
├── main.go # Основной код приложения
├── go.mod # Зависимости Go
@@ -93,7 +93,7 @@ func main() {
})
// Endpoints
r.GET("/healthz", func(c *gin.Context) {
r.GET("/health", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"status": "ok",
"version": version,
@@ -197,6 +197,7 @@ CMD ["./hello-api"]
базововго образа для каждого из этапов использовать предварительно собранный образ со всем необходимым.
При каждом запуске workflow будет запускаться новый контейнер docker in docker и там запускаться построение образа естественно кэшей не будет или надо как то придумывать как их хранить на ранере и пробрасывать в dind. Ну или руками сделать нужные образы и использоват их в Dockerfile. Правда пулиться они опять же будут походу каждый раз. Короче говоря тут есть чем поразбираться и пооптимизировать ...
## Настройка Gitea Actions
### Включение Actions в Gitea
@@ -362,32 +363,29 @@ 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:**
2. **create-release:**
- Запускается после успешной сборки Docker образов
- Использует Go контейнер для сборки бинарников (image: golang:1.21)
- Собирает бинарники для всех платформ (Linux, Windows, macOS)
- Создает архивы с бинарниками
- Создает релиз через Gitea API
- Загружает бинарники как assets релиза
- Запускается после успешной сборки Docker образов
- Использует Go контейнер для сборки бинарников (image: golang:1.21)
- Собирает бинарники для всех платформ (Linux, Windows, macOS)
- Создает архивы с бинарниками
- Создает релиз через Gitea API
- Загружает бинарники как assets релиза
при каждом запуске данного job будет скачиваться jq и устанавливаться в контейнере, созданном на базе golang:1.21
при каждом запуске, как я понимаю, данного job будет скачиваться и устанавливаться в контейнере, созданном на базе golang:1.21
```yaml
- name: Setup Go
@@ -399,98 +397,28 @@ jobs:
jq --version
```
**решение в лоб:** чтобы убрать эту повторяющуюся работу при каждом выполнении workflow надо сделать свой образ - например "${DOCKERHUB_USERNAME}"/my-build-golang-runner:latest
решение как говорится в лоб: чтобы убрать эту работу при каждом выполнении workflow надо сделать свой образ
``` Dockerfile
# базовый образ
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"]
# Install some packages
RUN apt-get update && apt-get install -y git ca-certificates jq
```
Cобрать его и запушить (желательно с мультиплатформенностью) на каком-то локальном АРМ (не раннере)
собрать его и запушить (желательно с мультиплатформенностью). конечно если вам не надо билдить образы для разных платформ тогда все попроще
```bash
#!/bin/bash
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag ${DOCKERHUB_USERNAME:-defaultdockeruser}/my-build-golang-runner:latest \
--tag ${DOCKERHUB_USERNAME}/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-`
## Настройка секретов
@@ -513,14 +441,12 @@ jobs:
### Создание токенов
**Gitea Token:**
1. Перейдите в настройки профиля → "Applications"
2. Создайте новый токен с правами на репозиторий
3. Скопируйте токен
4. В разделе Actions репозитория создайте секрет уровня репозитория - я создал с именем GITEATOKEN (такой не даст сделать: GITEA_TOKEN)
**Docker Hub Token:**
1. Войдите в Docker Hub
2. Перейдите в Account Settings → Security
3. Создайте новый Access Token
@@ -531,7 +457,7 @@ jobs:
### Локальное тестирование
1 **Проверим синтаксис workflow:**
1. **Проверим синтаксис workflow:**
ну если мы в ide то наверное все автоматом отформатировано
но тем не менее ...
@@ -541,8 +467,7 @@ jobs:
yamllint .gitea/workflows/build.yaml
```
2 **Протестируем сборку локально:**
2. **Протестируем сборку локально:**
```bash
# Сборка для текущей платформы
go build -o hello-api main.go
@@ -552,8 +477,7 @@ jobs:
GOOS=linux GOARCH=arm64 go build -o hello-api-linux-arm64 main.go
```
3 **Тестирование Docker образа:**
3. **Тестирование Docker образа:**
```bash
# Сборка образа
docker build -t hello-api:test .
@@ -562,13 +486,12 @@ jobs:
docker run -p 8080:8080 hello-api:test
# Тестирование API
curl http://localhost:8080/healthz
curl http://localhost:8080/health
```
### Запуск Actions
1 **Создаем тег:**
1. **Создаем тег:**
```bash
git tag v1.1.20
@@ -694,61 +617,54 @@ jobs:
```
2 **Мониторинг выполнения:**
- Переходим в репозиторий → "Actions"
- Находим запущенный workflow
- Отслеживаем выполнение каждого job
2. **Мониторинг выполнения:**
- Переходим в репозиторий → "Actions"
- Находим запущенный workflow
- Отслеживаем выполнение каждого job
### Ожидаемый результат
После успешного выполнения:
1 **Docker образы** будут опубликованы в Docker Hub:
1. **Docker образы** будут опубликованы в Docker Hub:
- `username/hello-api:v1.1.20`
- `username/hello-api:latest`
- `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`
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:**
1. **В Gitea:**
- Переходим в репозиторий → "Actions"
- Выберем workflow
- Нажмем на job для просмотра логов
- Переходим в репозиторий → "Actions"
- Выберем workflow
- Нажмем на job для просмотра логов
2 **Отладка ошибок:**
- Проверим правильность секретов
- Убедимся в корректности путей к репозиторию
- Проверим права доступа токенов
2. **Отладка ошибок:**
- Проверим правильность секретов
- Убедимся в корректности путей к репозиторию
- Проверим права доступа токенов
### Частые проблемы
1 **Ошибка авторизации в Docker Hub:**
1. **Ошибка авторизации в Docker Hub:**
- Проверим правильность `DOCKERHUB_TOKEN`
- Убедимся, что токен не истек
- Проверим правильность `DOCKERHUB_TOKEN`
- Убедимся, что токен не истек
2. **Ошибка создания релиза:**
- Проверим права токена `GITEATOKEN`
- Убедимся, что тег не существует
2 **Ошибка создания релиза:**
3. **Ошибка сборки:**
- Проверим зависимости в `go.mod`
- Убедимся в корректности Dockerfile
- Проверим права токена `GITEATOKEN`
- Убедимся, что тег не существует
3 **Ошибка сборки:**
- Проверим зависимости в `go.mod`
- Убедимся в корректности Dockerfile
## Заключение
@@ -783,13 +699,12 @@ Gitea Actions предоставляет мощные возможности д
### Архитектура системы
Этот и последующие разделы описывают инфраструктуру, на которой я проверял все описанное выше.
Если у вас используются другие подходы, то можете пропустить чтение этих разделов
или ознакомиться для общего развития.
Этот и последующие разделы описывают инфраструктуру на которой я проверял все описанное выше.
Если у вас используются другие подходы, то можете пропустить их или ознакомиться для общего развития.
Итак инфраструктура состоит из следующих компонентов:
``` text
```
Proxmox VE (ARM64)
├── K3s Cluster
├── Master Node
@@ -805,34 +720,31 @@ Proxmox VE (ARM64)
### Требования к системе
**Proxmox VE:**
- ARM64 архитектура (orangepi 5 Plus)
- Минимум 8GB RAM (16Gb)
- 100GB свободного места (1 Gb)
- Поддержка LXC контейнеров (+)
- ARM64 архитектура
- Минимум 8GB RAM
- 100GB свободного места
- Поддержка LXC контейнеров
**K3s Cluster:**
- Kubernetes 1.24+
- Helm 3.8+
- Ingress Controller (Traefik)
- Persistent Storage (NFS)
- Persistent Storage (Longhorn)
**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
@@ -842,7 +754,6 @@ 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
@@ -893,7 +804,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
@@ -903,7 +814,7 @@ kubectl port-forward -n gitea svc/gitea-http 3000:3000
curl http://localhost:3000
```
2 **Создание IngressRoute для постоянного доступа:**
2. **Создание IngressRoute для постоянного доступа:**
```yaml
# gitea-ingressroute.yaml
@@ -939,12 +850,12 @@ spec:
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
[server]
ROOT_URL = <https://direct-dev.ru/gitea>
ROOT_URL = https://direct-dev.ru/gitea
DOMAIN = direct-dev.ru
### Конфигурация Gitea
@@ -953,7 +864,6 @@ Gitea установлен через Helm.
**Версия:** Gitea 1.24.3 (rootless)
**Архитектура:**
- PostgreSQL для базы данных (развернут отдельно )
- Valkey cluster (Redis) для кэширования
- NFS Storage Class для persistent storage
@@ -982,6 +892,7 @@ helm repo update
helm upgrade gitea gitea-charts/gitea -n gitea -f gitea-values.yaml
```
**Проверка конфигурации:**
```bash
@@ -1038,31 +949,27 @@ 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 через веб-интерфейс:**
2. **Включение Actions через веб-интерфейс:**
- Откройте Gitea через port-forward или ingress
- Перейдите в Site Administration → Actions
- Включите "Enable Actions"
- Настройте "Default Actions URL" (например, https://gitea.com)
- Откройте Gitea через port-forward или ingress
- Перейдите в Site Administration → Actions
- Включите "Enable Actions"
- Настройте "Default Actions URL" (например, <https://gitea.com>)
3 **Проверка работы Actions:**
3. **Проверка работы Actions:**
```bash
# Проверка логов Gitea на предмет ошибок Actions
@@ -1071,8 +978,7 @@ kubectl logs -n gitea deployment/gitea | grep -i action
### Настройка DNS и SSL
Инструкция по установке Cert-Manager не приводится - инструкций вагон и маленькая тележка -
нет смысла повторяться:
Cert-Manager установлен. Инструкций вагон и маленькая тележка - не смысла повторяться. Проверим конфигурацию:
```bash
# Проверка Cert-Manager
@@ -1084,13 +990,12 @@ kubectl get clusterissuer
1. **Настройка DNS записи:**
```text
Добавить A-запись в DNS (у меня сloudflare)
gitea.your-domain.com -> внешний (белый) Ip - за ним пробросы портов если нужно ...
чтобы в итоге запрос поступил на traefik
```bash
# Добавить A-запись в DNS (у меня сloudflare)
gitea.your-domain.com -> внешний (белый) Ip - за ним пробросы портов если нужно ... чтобы в итоге запрос поступил на traefik
```
2 **Создание ClusterIssuer (если не существует):**
2. **Создание ClusterIssuer (если не существует):**
```bash
# Создание ClusterIssuer для Let's Encrypt - лучше через dns resolver
@@ -1122,7 +1027,7 @@ EOF
### Доступ к Gitea
1 **Временный доступ через port-forward:**
1. **Временный доступ через port-forward:**
```bash
# Доступ к Gitea через port-forward
@@ -1131,14 +1036,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
@@ -1189,7 +1094,7 @@ spec:
# - Network: DHCP
```
2 **Настройка сети:**
2. **Настройка сети:**
```bash
# В контейнере
@@ -1209,7 +1114,7 @@ apt update && apt upgrade -y
apt install -y curl wget git vim htop
```
2 **Установка Docker:**
2. **Установка Docker:**
```bash
# Удаление старых версий
@@ -1246,7 +1151,7 @@ systemctl start docker
docker --version
```
3 **Установка Go:**
3. **Установка Go:**
```bash
# Скачивание Go для ARM64
@@ -1269,7 +1174,7 @@ go version
mkdir -p $HOME/go/{bin,src,pkg}
```
4 **Установка дополнительных инструментов:**
4. **Установка дополнительных инструментов:**
```bash
# Установка build tools
@@ -1311,7 +1216,7 @@ chmod +x /usr/local/bin/act_runner
act_runner --version
```
2 **Создание пользователя для runner:**
2. **Создание пользователя для runner:**
```bash
# Создание пользователя
@@ -1323,7 +1228,7 @@ mkdir -p /opt/gitea-runner
chown gitea-runner:gitea-runner /opt/gitea-runner
```
3 **Настройка конфигурации runner:**
3. **Настройка конфигурации runner:**
```bash
# Переключение на пользователя runner
@@ -1448,7 +1353,7 @@ EOF
- Нажмите "New Runner"
- Скопируйте токен регистрации
2 **Регистрация runner:**
2. **Регистрация runner:**
```bash
# В контейнере LXC под пользователем gitea-runner
@@ -1461,7 +1366,7 @@ act_runner register \
```
3 **Создание systemd сервиса:**
3. **Создание systemd сервиса:**
```bash
# Создание файла сервиса
@@ -1498,7 +1403,7 @@ systemctl status gitea-runner
### Настройка мониторинга
1. **Cкрипт мониторинга:**
1. ** рипт мониторинга:**
```bash
cat > /opt/gitea-runner/monitor.sh <<'EOF'
@@ -1527,7 +1432,7 @@ EOF
chmod +x /opt/gitea-runner/monitor.sh
```
2 **Настройка cron для мониторинга:**
2. **Настройка cron для мониторинга:**
```bash
# Добавление в crontab
@@ -1544,7 +1449,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
@@ -1612,7 +1517,7 @@ EOF
systemctl restart docker
```
2 **Настройка ограничений ресурсов:**
2. **Настройка ограничений ресурсов:**
```bash
# Обновление systemd сервиса с ограничениями
@@ -1675,6 +1580,7 @@ chmod +x /opt/gitea-runner/backup.sh
echo "0 2 * * * /opt/gitea-runner/backup.sh" | crontab -
```
## Работа с кластером
### Основные команды для работы с кластером

View File

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

View File

@@ -2,7 +2,7 @@
BIN_DIR=bin
APP_NAME=hello-api
VERSION=1.0.28
VERSION=1.0.0
build:
mkdir -p $(BIN_DIR)
@@ -17,12 +17,9 @@ test:
# Задача для создания релиза
# Использование: make release VERSION=1.0.25
release:
@if [ -z "$(VERSION)" ]; then \
echo "Ошибка: Необходимо указать версию в формате v1.0.25"; \
echo "Использование: make release VERSION=1.0.25"; \
exit 1; \
fi
# @if [ -z "$(VERSION)" ]; then \
# echo "Ошибка: Необходимо указать версию"; \
# echo "Использование: make release VERSION=1.0.25"; \
# exit 1; \
# fi
@./scripts/release-interactive.sh $(VERSION)
release-interactive:
@./scripts/release-interactive.sh

View File

@@ -37,7 +37,7 @@ get_version_interactive() {
echo " Текущая версия: $CURRENT_VERSION"
echo " Новая версия: $VERSION"
echo ""
read -r -p "Продолжить? (y/N): " CONFIRM
read -p "Продолжить? (y/N): " CONFIRM
if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then
echo "❌ Релиз отменен"
@@ -92,24 +92,6 @@ fi
echo "✅ Версия обновлена в main.go"
# Обновляем версию в makefile
echo "📝 Обновляем версию в makefile..."
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' "s/^VERSION=.*/VERSION=$VERSION/" makefile
else
# Linux
sed -i "s/^VERSION=.*/VERSION=$VERSION/" makefile
fi
# Проверяем, что изменение применилось
if ! grep -q "^VERSION=$VERSION" makefile; then
echo "Ошибка: Не удалось обновить версию в makefile"
exit 1
fi
echo "✅ Версия обновлена в makefile"
# Выполняем git команды
echo "📦 Добавляем изменения в git..."
git add .
@@ -127,7 +109,6 @@ git push --tags
echo "🎉 Релиз v$VERSION успешно завершен!"
echo "📋 Выполненные действия:"
echo " - Обновлена версия в main.go"
echo " - Обновлена версия в makefile"
echo " - Создан коммит с сообщением 'Release v$VERSION'"
echo " - Создан тег v$VERSION"
echo " - Изменения отправлены в удаленный репозиторий"

76
scripts/release.sh Executable file
View File

@@ -0,0 +1,76 @@
#!/bin/bash
# Скрипт для автоматизации релиза
# Использование: ./scripts/release.sh <version>
# Пример: ./scripts/release.sh 1.0.25
set -e # Остановить выполнение при ошибке
# Проверка аргументов
if [ $# -eq 0 ]; then
echo "Ошибка: Необходимо указать версию"
echo "Использование: $0 <version>"
echo "Пример: $0 1.0.25"
exit 1
fi
VERSION=$1
# Проверка формата версии (простая проверка)
if [[ ! $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "Ошибка: Неверный формат версии. Используйте формат X.Y.Z (например, 1.0.25)"
exit 1
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 " - Изменения отправлены в удаленный репозиторий"