Files
iot-hub/.gitea/workflows/build-deploy.yml
T
Kayashov.SM c6fa6f3870
build-and-deploy / build (push) Successful in 1m42s
build-and-deploy / deploy (push) Successful in 1m11s
CI/CD: разделить build-and-deploy на build и deploy job'ы для отдельного перезапуска
2026-08-28 20:14:28 +04:00

89 lines
4.2 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CI/CD: собрать образ, запушить в Docker Hub, задеплоить в кластер Kubernetes через Helm.
# Раннер (act_runner) уже настроен с доступом ко всем namespace/репозиториям и все нужные
# секреты уже есть в Gitea — пайплайн просто их использует, без дополнительной настройки RBAC.
#
# Секреты (Settings -> Actions -> Secrets), уже существуют:
# DOCKERHUB_USER — логин Docker Hub
# DOCKERHUB_TOKEN — пароль/access-токен Docker Hub
# KUBE_CONFIG — содержимое kubeconfig целиком (как есть, текстом; если у вас он хранится
# в base64 — добавьте `| base64 -d` в шаге "kubeconfig" ниже)
#
# Образ публикуется как docker.io/$DOCKERHUB_USER/iot-hub. Если нужно другое имя репозитория —
# поменяйте переменную IMAGE ниже.
#
# Если раннер зарегистрирован не под label "ubuntu-latest" — поменяйте runs-on.
name: build-and-deploy
on:
push:
branches:
- main
- master
# Раньше это был один job на все шаги: падение на любом шаге (например, на helm upgrade)
# заставляло пересобирать и перезаливать образ заново, хотя он уже был в registry. Теперь два
# последовательных job'а — build и deploy (deploy: needs: build) — можно перезапускать по
# отдельности прямо из UI Gitea Actions (кнопка "rerun" на странице конкретного job'а, не
# только на всём ране). Единственное, что build передаёт deploy — тег образа, а это просто
# $GITHUB_SHA, общий для всех job'ов одного workflow — отдельно артефакты передавать не нужно.
# Учтите: каждый job стартует в свежем контейнере, поэтому checkout нужен в обоих job'ах.
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Логин в Docker Hub
run: echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USER" --password-stdin
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Сборка и публикация образа
run: |
IMAGE="docker.io/$DOCKERHUB_USER/iot-hub"
docker build -t "$IMAGE:${GITHUB_SHA}" -t "$IMAGE:latest" .
docker push "$IMAGE:${GITHUB_SHA}"
docker push "$IMAGE:latest"
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: kubeconfig
run: |
mkdir -p "$HOME/.kube"
# Секрет может лежать как обычный YAML-текст или как base64 — определяем автоматически.
if echo "$KUBE_CONFIG" | grep -q "apiVersion"; then
echo "$KUBE_CONFIG" > "$HOME/.kube/config"
else
echo "$KUBE_CONFIG" | base64 -d > "$HOME/.kube/config"
fi
env:
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
- name: Установка Helm
run: |
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod +x get_helm.sh
./get_helm.sh
rm get_helm.sh
- name: Helm upgrade --install
run: |
IMAGE="docker.io/$DOCKERHUB_USER/iot-hub"
helm upgrade --install iot-hub deployment/iot-hub \
-n iot --create-namespace \
--set image.repository="$IMAGE" \
--set image.tag="${GITHUB_SHA}" \
--wait --timeout 3m
env:
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}