Files
architector/.gitea/workflows/deploy.yml
T

106 lines
4.5 KiB
YAML

name: Deploy
# Ручной запуск из вкладки Actions в Gitea — как "Run pipeline" в GitLab
# с выбором, что именно катить: back / front / всё сразу.
on:
workflow_dispatch:
inputs:
target:
description: "Что деплоим"
type: choice
default: all
options:
- back
- front
- all
jobs:
build-backend:
if: ${{ inputs.target == 'back' || inputs.target == 'all' }}
runs-on: ubuntu-latest
# node:20-bookworm вместо docker:24-cli: Alpine-образы (docker:24-cli,
# alpine/helm) виснут/рвутся на скачивании с некоторых внешних CDN
# (dl-cdn.alpinelinux.org, get.helm.sh — Docker Hub, npm registry,
# github.com, download.docker.com при этом работают нормально; похоже
# на что-то в сети/фаерволе, специфичное для конкретных CDN, не на IPv6
# как казалось сначала). node:20-bookworm (Debian) уже проверенно
# работает + там сразу есть node для actions/checkout.
# Docker CLI ставим статическим бинарником с download.docker.com —
# без apt/apk, без лишних сетевых плясок.
container:
image: node:20-bookworm
outputs:
tag: ${{ steps.vars.outputs.tag }}
steps:
- uses: actions/checkout@v4
- id: vars
run: echo "tag=${{ gitea.sha }}" >> "$GITEA_OUTPUT"
- name: Install docker CLI
run: |
curl -4 -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-27.3.1.tgz -o /tmp/docker.tgz
tar xzf /tmp/docker.tgz --strip-components=1 -C /usr/local/bin docker/docker
docker version --format 'client ok: {{.Client.Version}}'
- name: Docker login
run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u "${{ secrets.DOCKERHUB_USER }}" --password-stdin
- name: Build backend image
run: docker build -f deployment/charts/back/Dockerfile --target architector -t kayashov/architector:${{ steps.vars.outputs.tag }} .
- name: Push backend image
run: docker push kayashov/architector:${{ steps.vars.outputs.tag }}
deploy-backend:
if: ${{ inputs.target == 'back' || inputs.target == 'all' }}
needs: build-backend
runs-on: ubuntu-latest
# get.helm.sh и GitHub release-assets рвут соединение в этой сети (даже
# с -4) — прекращаем качать helm во время пайплайна и берём готовый
# образ с уже вшитым helm (deployment/ci/toolbox.Dockerfile). Собрать и
# запушить один раз:
# docker build -f deployment/ci/toolbox.Dockerfile -t kayashov/ci-toolbox:latest .
# docker push kayashov/ci-toolbox:latest
container:
image: kayashov/ci-toolbox:latest
steps:
- uses: actions/checkout@v4
- name: Configure kubectl access
run: |
mkdir -p ~/.kube
echo "${{ secrets.KUBE_CONFIG }}" | base64 -d > ~/.kube/config
# быстрая проверка вместо невнятной "localhost:8080" от helm,
# если секрет KUBE_CONFIG пуст/не тот
grep -q "apiVersion" ~/.kube/config || (echo "KUBE_CONFIG пуст или не base64 валидного kubeconfig — проверь секрет в Settings -> Actions -> Secrets" && exit 1)
- name: Helm upgrade backend
run: |
helm upgrade -i architector ./deployment/charts/back \
-f ./deployment/values.yaml \
--set global.version=${{ needs.build-backend.outputs.tag }} \
--namespace media
build-front:
if: ${{ inputs.target == 'front' || inputs.target == 'all' }}
runs-on: ubuntu-latest
container:
image: node:20-bookworm
steps:
- uses: actions/checkout@v4
- name: npm ci && build
working-directory: front
run: |
npm ci
npm run build
# /front-build смонтирован в раннер как тот же hostPath, что
# front-под берёт под nginx (см. deployment/ci/runner-deployment.yaml).
# Новый билд подхватится сразу, без рестарта пода.
- name: Publish static files
run: |
rm -rf /front-build/*
cp -r front/build/* /front-build/