Compare commits
9 Commits
builder-1.
...
v1.0.28
Author | SHA1 | Date | |
---|---|---|---|
c4a3ea4d98 | |||
dd3de165f7 | |||
7c3d490685 | |||
aff61e32fc | |||
1a0207017a | |||
638dc104f8 | |||
8b420c500f | |||
078c32b929 | |||
e4a2fccef4 |
@@ -1,4 +1,4 @@
|
|||||||
name: Release Build
|
name: Build Builder Docker Image
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
@@ -21,30 +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 \
|
||||||
|
.
|
@@ -5,56 +5,12 @@ on:
|
|||||||
- v*
|
- v*
|
||||||
|
|
||||||
jobs:
|
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:
|
create-release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
# image: golang:1.21
|
# image: golang:1.21
|
||||||
image: ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest
|
image: ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest
|
||||||
needs: create-docker-image
|
needs: create-release-branch
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
run: |
|
run: |
|
||||||
@@ -122,3 +78,95 @@ jobs:
|
|||||||
--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:
|
||||||
|
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
|
20
README.md
20
README.md
@@ -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" \
|
||||||
@@ -142,13 +142,27 @@ curl -X POST http://localhost:8080/api/v1/echo \
|
|||||||
|
|
||||||
## 🚀 CI/CD
|
## 🚀 CI/CD
|
||||||
|
|
||||||
При создании тега (например, `v1.1.0`) автоматически:
|
При создании тега (например, `v1.1.20`) автоматически:
|
||||||
|
|
||||||
1. Собираются бинарники для всех платформ
|
1. Собираются бинарники для всех платформ
|
||||||
2. Создается Docker образ для Linux AMD64/ARM64
|
2. Создается Docker образ для Linux AMD64/ARM64
|
||||||
3. Образ публикуется в Docker Hub
|
3. Образ публикуется в Docker Hub
|
||||||
4. Создается релиз в Gitea с бинарниками
|
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
|
MIT License
|
Binary file not shown.
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
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:-kuznetcovay}"/my-build-golang-runner:latest \
|
||||||
--push \
|
--push \
|
||||||
-f Dockerfile_for_runner_image \
|
-f Dockerfile_for_runner_image \
|
||||||
.
|
.
|
124
build.yaml
Normal file
124
build.yaml
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
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
|
@@ -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. ** Cкрипт мониторинга:**
|
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
|
||||||
```
|
```
|
||||||
|
4
main.go
4
main.go
@@ -7,7 +7,7 @@ import (
|
|||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
)
|
)
|
||||||
|
|
||||||
const version = "1.0.0"
|
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,
|
||||||
|
17
makefile
17
makefile
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
BIN_DIR=bin
|
BIN_DIR=bin
|
||||||
APP_NAME=hello-api
|
APP_NAME=hello-api
|
||||||
VERSION=1.0.0
|
VERSION=1.0.28
|
||||||
|
|
||||||
build:
|
build:
|
||||||
mkdir -p $(BIN_DIR)
|
mkdir -p $(BIN_DIR)
|
||||||
@@ -17,9 +17,12 @@ test:
|
|||||||
# Задача для создания релиза
|
# Задача для создания релиза
|
||||||
# Использование: make release VERSION=1.0.25
|
# Использование: make release VERSION=1.0.25
|
||||||
release:
|
release:
|
||||||
# @if [ -z "$(VERSION)" ]; then \
|
@if [ -z "$(VERSION)" ]; then \
|
||||||
# echo "Ошибка: Необходимо указать версию"; \
|
echo "Ошибка: Необходимо указать версию в формате v1.0.25"; \
|
||||||
# echo "Использование: make release VERSION=1.0.25"; \
|
echo "Использование: make release VERSION=1.0.25"; \
|
||||||
# exit 1; \
|
exit 1; \
|
||||||
# fi
|
fi
|
||||||
@./scripts/release-interactive.sh $(VERSION)
|
@./scripts/release-interactive.sh $(VERSION)
|
||||||
|
|
||||||
|
release-interactive:
|
||||||
|
@./scripts/release-interactive.sh
|
@@ -37,7 +37,7 @@ get_version_interactive() {
|
|||||||
echo " Текущая версия: $CURRENT_VERSION"
|
echo " Текущая версия: $CURRENT_VERSION"
|
||||||
echo " Новая версия: $VERSION"
|
echo " Новая версия: $VERSION"
|
||||||
echo ""
|
echo ""
|
||||||
read -p "Продолжить? (y/N): " CONFIRM
|
read -r -p "Продолжить? (y/N): " CONFIRM
|
||||||
|
|
||||||
if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then
|
if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then
|
||||||
echo "❌ Релиз отменен"
|
echo "❌ Релиз отменен"
|
||||||
@@ -92,6 +92,24 @@ fi
|
|||||||
|
|
||||||
echo "✅ Версия обновлена в main.go"
|
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 команды
|
# Выполняем git команды
|
||||||
echo "📦 Добавляем изменения в git..."
|
echo "📦 Добавляем изменения в git..."
|
||||||
git add .
|
git add .
|
||||||
@@ -109,6 +127,7 @@ git push --tags
|
|||||||
echo "🎉 Релиз v$VERSION успешно завершен!"
|
echo "🎉 Релиз v$VERSION успешно завершен!"
|
||||||
echo "📋 Выполненные действия:"
|
echo "📋 Выполненные действия:"
|
||||||
echo " - Обновлена версия в main.go"
|
echo " - Обновлена версия в main.go"
|
||||||
|
echo " - Обновлена версия в makefile"
|
||||||
echo " - Создан коммит с сообщением 'Release v$VERSION'"
|
echo " - Создан коммит с сообщением 'Release v$VERSION'"
|
||||||
echo " - Создан тег v$VERSION"
|
echo " - Создан тег v$VERSION"
|
||||||
echo " - Изменения отправлены в удаленный репозиторий"
|
echo " - Изменения отправлены в удаленный репозиторий"
|
@@ -1,76 +0,0 @@
|
|||||||
#!/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 " - Изменения отправлены в удаленный репозиторий"
|
|
Reference in New Issue
Block a user