89 lines
4.2 KiB
YAML
89 lines
4.2 KiB
YAML
# 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 }}
|