Compare commits
6 Commits
v1.1.0
...
builder-1.
Author | SHA1 | Date | |
---|---|---|---|
6d9a869a6f | |||
a3867ba3de | |||
bde6e734b3 | |||
e018e30975 | |||
bf25c33b3f | |||
c1e0f6e04f |
@@ -1,59 +0,0 @@
|
||||
name: Release Build
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: golang:1.21
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
run: |
|
||||
git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea
|
||||
cd hello_gitea
|
||||
git checkout ${{ github.ref }}
|
||||
|
||||
- name: Setup Go
|
||||
run: |
|
||||
# Install jq for JSON parsing
|
||||
apt-get update && apt-get install -y jq
|
||||
git --version
|
||||
go version
|
||||
jq --version
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cd hello_gitea
|
||||
mkdir -p bin
|
||||
go build -o bin/hello-api-${{ github.ref_name }} main.go
|
||||
ls -la bin/
|
||||
|
||||
- name: Create Release
|
||||
run: |
|
||||
cd hello_gitea
|
||||
# Create release using Gitea API
|
||||
curl -X POST \
|
||||
-H "Authorization: token ${{ secrets.GITEATOKEN }}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"tag_name": "${{ github.ref_name }}",
|
||||
"name": "Release ${{ github.ref_name }}",
|
||||
"body": "Automated release",
|
||||
"draft": false,
|
||||
"prerelease": false
|
||||
}' \
|
||||
"https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases"
|
||||
|
||||
# Upload asset
|
||||
RELEASE_ID=$(curl -s -H "Authorization: token ${{ secrets.GITEATOKEN }}" \
|
||||
"https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/tags/${{ github.ref_name }}" | \
|
||||
jq -r '.id')
|
||||
|
||||
curl -X POST \
|
||||
-H "Authorization: token ${{ secrets.GITEATOKEN }}" \
|
||||
-H "Content-Type: application/octet-stream" \
|
||||
--data-binary @bin/hello-api-${{ github.ref_name }} \
|
||||
"https://direct-dev.ru/gitea/api/v1/repos/GiteaAdmin/hello_gitea/releases/$RELEASE_ID/assets?name=hello-api-${{ github.ref_name }}"
|
@@ -8,10 +8,13 @@ jobs:
|
||||
create-docker-image:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: golang:1.21
|
||||
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 }}"
|
||||
@@ -24,12 +27,11 @@ jobs:
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
run: |
|
||||
# Install Docker CLI
|
||||
apt-get update && apt-get install -y docker.io
|
||||
# Docker is already installed in docker:dind image
|
||||
docker --version
|
||||
|
||||
# Setup Docker Buildx for multi-platform builds
|
||||
docker buildx create --name multiplatform --use
|
||||
docker buildx create --use
|
||||
docker buildx inspect --bootstrap
|
||||
|
||||
- name: Login to Docker Hub
|
||||
@@ -50,7 +52,8 @@ jobs:
|
||||
create-release:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: golang:1.21
|
||||
# image: golang:1.21
|
||||
image: ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest
|
||||
needs: create-docker-image
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
|
51
.gitea/workflows/build_build.yaml
Normal file
51
.gitea/workflows/build_build.yaml
Normal file
@@ -0,0 +1,51 @@
|
||||
name: Release Build
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- builder-*
|
||||
|
||||
jobs:
|
||||
create-builder-docker-image:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: docker:28.3.2-dind
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
run: |
|
||||
# Install git
|
||||
apk add --no-cache git
|
||||
|
||||
echo "=== GitHub Variables ==="
|
||||
echo "github.ref = ${{ github.ref }}"
|
||||
echo "github.ref_name = ${{ github.ref_name }}"
|
||||
echo "github.sha = ${{ github.sha }}"
|
||||
echo "github.repository = ${{ github.repository }}"
|
||||
echo "========================"
|
||||
git clone https://oauth2:${{ secrets.GITEATOKEN }}@direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git hello_gitea
|
||||
cd hello_gitea
|
||||
git checkout ${{ github.ref }}
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
run: |
|
||||
# Docker is already installed in docker:dind image
|
||||
docker --version
|
||||
# Setup Docker Buildx for multi-platform builds
|
||||
docker buildx create --use
|
||||
docker buildx inspect --bootstrap
|
||||
|
||||
- name: Login to Docker Hub
|
||||
run: |
|
||||
echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USERNAME }} --password-stdin
|
||||
|
||||
- name: Build multi-platform Docker images
|
||||
run: |
|
||||
cd hello_gitea
|
||||
# Build multi-platform images using buildx
|
||||
docker buildx build \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:${{ github.ref_name }} \
|
||||
--tag ${{ secrets.DOCKERHUB_USERNAME }}/my-build-golang-runner:latest \
|
||||
--push \
|
||||
-f Dockerfile.builder \
|
||||
.
|
||||
|
13
Dockerfile.builder
Normal file
13
Dockerfile.builder
Normal file
@@ -0,0 +1,13 @@
|
||||
# Используем образ Go с поддержкой мультиплатформенности
|
||||
FROM golang:1.24
|
||||
|
||||
# Устанавливаем пакеты (одинаково работают на amd64/arm64)
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
git \
|
||||
ca-certificates \
|
||||
jq && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# (Опционально) Можно добавить команду по умолчанию
|
||||
CMD ["bash"]
|
155
README.md
155
README.md
@@ -1,3 +1,154 @@
|
||||
# hello_gitea
|
||||
# Hello Gitea API
|
||||
|
||||
test repo to try with actions - v1.0.11
|
||||
Простой REST API сервер, построенный на Go с использованием Gin framework.
|
||||
|
||||
## 🚀 Возможности
|
||||
|
||||
- ✅ REST API с JSON ответами
|
||||
- ✅ Health check endpoint
|
||||
- ✅ CORS поддержка
|
||||
- ✅ Мультиплатформенная сборка
|
||||
- ✅ Docker образы для Linux AMD64/ARM64
|
||||
- ✅ Автоматические релизы через Gitea Actions
|
||||
|
||||
## 📦 Установка
|
||||
|
||||
### Из бинарного файла
|
||||
|
||||
1. Скачайте бинарный файл для вашей платформы из [релизов](https://direct-dev.ru/gitea/GiteaAdmin/hello_gitea/releases)
|
||||
2. Распакуйте архив
|
||||
3. Запустите: `./hello-api-<platform>`
|
||||
|
||||
### Из Docker образа
|
||||
|
||||
```bash
|
||||
docker pull <username>/hello-api:latest
|
||||
docker run -p 8080:8080 <username>/hello-api:latest
|
||||
```
|
||||
|
||||
### Из исходного кода
|
||||
|
||||
```bash
|
||||
git clone https://direct-dev.ru/gitea/GiteaAdmin/hello_gitea.git
|
||||
cd hello_gitea
|
||||
go mod download
|
||||
go run main.go
|
||||
```
|
||||
|
||||
## 🔧 Конфигурация
|
||||
|
||||
Сервер запускается на порту 8080 по умолчанию. Можно изменить через переменную окружения:
|
||||
|
||||
```bash
|
||||
export PORT=3000
|
||||
./hello-api
|
||||
```
|
||||
|
||||
## 📡 API Endpoints
|
||||
|
||||
### GET /
|
||||
Основной endpoint
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"message": "Hello, World!",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
### GET /health
|
||||
Health check endpoint
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"status": "ok",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
### GET /api/v1/info
|
||||
Информация о сервисе
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"service": "hello-api",
|
||||
"status": "running",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
### POST /api/v1/echo
|
||||
Echo endpoint - возвращает отправленное сообщение
|
||||
|
||||
**Запрос:**
|
||||
```json
|
||||
{
|
||||
"message": "Hello from client!"
|
||||
}
|
||||
```
|
||||
|
||||
**Ответ:**
|
||||
```json
|
||||
{
|
||||
"echo": "Hello from client!",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
## 🛠 Разработка
|
||||
|
||||
### Зависимости
|
||||
|
||||
- Go 1.21+
|
||||
- Gin framework
|
||||
|
||||
### Сборка
|
||||
|
||||
```bash
|
||||
# Для текущей платформы
|
||||
go build -o hello-api main.go
|
||||
|
||||
# Для Linux AMD64
|
||||
GOOS=linux GOARCH=amd64 go build -o hello-api-linux-amd64 main.go
|
||||
|
||||
# Для Linux ARM64
|
||||
GOOS=linux GOARCH=arm64 go build -o hello-api-linux-arm64 main.go
|
||||
|
||||
# Для Windows
|
||||
GOOS=windows GOARCH=amd64 go build -o hello-api-windows-amd64.exe main.go
|
||||
|
||||
# Для macOS
|
||||
GOOS=darwin GOARCH=amd64 go build -o hello-api-darwin-amd64 main.go
|
||||
GOOS=darwin GOARCH=arm64 go build -o hello-api-darwin-arm64 main.go
|
||||
```
|
||||
|
||||
### Тестирование
|
||||
|
||||
```bash
|
||||
# Запуск сервера
|
||||
go run main.go
|
||||
|
||||
# Тестирование API
|
||||
curl http://localhost:8080/
|
||||
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" \
|
||||
-d '{"message":"Hello!"}'
|
||||
```
|
||||
|
||||
## 🚀 CI/CD
|
||||
|
||||
При создании тега (например, `v1.1.0`) автоматически:
|
||||
|
||||
1. Собираются бинарники для всех платформ
|
||||
2. Создается Docker образ для Linux AMD64/ARM64
|
||||
3. Образ публикуется в Docker Hub
|
||||
4. Создается релиз в Gitea с бинарниками
|
||||
|
||||
## 📄 Лицензия
|
||||
|
||||
MIT License
|
8
build_image_for_runner.sh
Normal file
8
build_image_for_runner.sh
Normal file
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
docker buildx build \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--tag ${DOCKERHUB_USERNAME}/my-build-golang-runner:latest \
|
||||
--push \
|
||||
-f Dockerfile_for_runner_image \
|
||||
.
|
1647
docs/gitea-actions-guide.md
Normal file
1647
docs/gitea-actions-guide.md
Normal file
File diff suppressed because it is too large
Load Diff
14
makefile
14
makefile
@@ -1,4 +1,4 @@
|
||||
.PHONY: build clean test
|
||||
.PHONY: build clean test release
|
||||
|
||||
BIN_DIR=bin
|
||||
APP_NAME=hello-api
|
||||
@@ -12,4 +12,14 @@ clean:
|
||||
rm -rf $(BIN_DIR)
|
||||
|
||||
test:
|
||||
go test -v ./...
|
||||
go test -v ./...
|
||||
|
||||
# Задача для создания релиза
|
||||
# Использование: make release VERSION=1.0.25
|
||||
release:
|
||||
# @if [ -z "$(VERSION)" ]; then \
|
||||
# echo "Ошибка: Необходимо указать версию"; \
|
||||
# echo "Использование: make release VERSION=1.0.25"; \
|
||||
# exit 1; \
|
||||
# fi
|
||||
@./scripts/release-interactive.sh $(VERSION)
|
114
scripts/release-interactive.sh
Executable file
114
scripts/release-interactive.sh
Executable file
@@ -0,0 +1,114 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Интерактивный скрипт для автоматизации релиза
|
||||
# Использование: ./scripts/release-interactive.sh [version]
|
||||
# Если версия не указана, скрипт запросит её интерактивно
|
||||
|
||||
set -e # Остановить выполнение при ошибке
|
||||
|
||||
# Функция для получения версии интерактивно
|
||||
get_version_interactive() {
|
||||
echo "🚀 Создание нового релиза"
|
||||
echo ""
|
||||
|
||||
# Показываем текущую версию
|
||||
CURRENT_VERSION=$(grep 'const version = "' main.go | sed 's/const version = "\([^"]*\)"/\1/')
|
||||
echo "📋 Текущая версия: $CURRENT_VERSION"
|
||||
echo ""
|
||||
|
||||
# Запрашиваем новую версию
|
||||
read -p "Введите новую версию (формат X.Y.Z): " VERSION
|
||||
|
||||
# Проверяем, что версия не пустая
|
||||
if [ -z "$VERSION" ]; then
|
||||
echo "❌ Версия не может быть пустой"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверяем формат версии
|
||||
if [[ ! $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echo "❌ Неверный формат версии. Используйте формат X.Y.Z (например, 1.0.25)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Подтверждение
|
||||
echo ""
|
||||
echo "📝 Подтверждение:"
|
||||
echo " Текущая версия: $CURRENT_VERSION"
|
||||
echo " Новая версия: $VERSION"
|
||||
echo ""
|
||||
read -p "Продолжить? (y/N): " CONFIRM
|
||||
|
||||
if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then
|
||||
echo "❌ Релиз отменен"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверяем, передана ли версия как аргумент
|
||||
if [ $# -eq 0 ]; then
|
||||
# Версия не указана, запрашиваем интерактивно
|
||||
get_version_interactive
|
||||
else
|
||||
# Версия указана как аргумент
|
||||
VERSION=$1
|
||||
|
||||
# Проверка формата версии
|
||||
if [[ ! $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||
echo "Ошибка: Неверный формат версии. Используйте формат X.Y.Z (например, 1.0.25)"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "🚀 Начинаем релиз версии v$VERSION..."
|
||||
|
||||
# Проверяем, что мы в git репозитории
|
||||
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
echo "Ошибка: Не найден git репозиторий"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Проверяем, что нет незакоммиченных изменений
|
||||
# if ! git diff-index --quiet HEAD --; then
|
||||
# echo "Ошибка: Есть незакоммиченные изменения. Сначала закоммитьте их."
|
||||
# exit 1
|
||||
# fi
|
||||
|
||||
# Обновляем версию в main.go
|
||||
echo "📝 Обновляем версию в main.go..."
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
# macOS
|
||||
sed -i '' "s/const version = \"[^\"]*\"/const version = \"$VERSION\"/" main.go
|
||||
else
|
||||
# Linux
|
||||
sed -i "s/const version = \"[^\"]*\"/const version = \"$VERSION\"/" main.go
|
||||
fi
|
||||
|
||||
# Проверяем, что изменение применилось
|
||||
if ! grep -q "const version = \"$VERSION\"" main.go; then
|
||||
echo "Ошибка: Не удалось обновить версию в main.go"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Версия обновлена в main.go"
|
||||
|
||||
# Выполняем git команды
|
||||
echo "📦 Добавляем изменения в git..."
|
||||
git add .
|
||||
|
||||
echo "💾 Создаем коммит..."
|
||||
git commit -m "Release v$VERSION"
|
||||
|
||||
echo "🏷️ Создаем тег..."
|
||||
git tag -a "v$VERSION" -m "Release v$VERSION"
|
||||
|
||||
echo "🚀 Отправляем изменения и теги..."
|
||||
git push
|
||||
git push --tags
|
||||
|
||||
echo "🎉 Релиз v$VERSION успешно завершен!"
|
||||
echo "📋 Выполненные действия:"
|
||||
echo " - Обновлена версия в main.go"
|
||||
echo " - Создан коммит с сообщением 'Release v$VERSION'"
|
||||
echo " - Создан тег v$VERSION"
|
||||
echo " - Изменения отправлены в удаленный репозиторий"
|
76
scripts/release.sh
Executable file
76
scripts/release.sh
Executable 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 " - Изменения отправлены в удаленный репозиторий"
|
Reference in New Issue
Block a user