Files
contracts-flask/site/templates/ci-cd.html
T

167 lines
6.8 KiB
HTML
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.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gitea Actions — настройка CI/CD</title>
<style>
:root {
--bg: #0d1117; --fg: #c9d1d9; --muted: #8b949e;
--accent: #58a6ff; --green: #3fb950; --orange: #d2991d;
--border: #30363d; --code-bg: #161b22; --card-bg: #161b22;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font: 15px/1.65 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: var(--bg); color: var(--fg); max-width: 860px; margin: 0 auto; padding: 32px 20px 80px; }
h1 { font-size: 26px; margin-bottom: 8px; }
h2 { font-size: 19px; margin-top: 36px; margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid var(--border); color: var(--accent); }
h3 { font-size: 16px; margin-top: 24px; margin-bottom: 6px; color: var(--green); }
p { margin: 8px 0; }
ul, ol { padding-left: 24px; margin: 8px 0; }
li { margin: 4px 0; }
code { background: var(--code-bg); padding: 1px 5px; border-radius: 4px; font-size: 13px; border: 1px solid var(--border); }
pre { background: var(--code-bg); padding: 12px 16px; border-radius: 6px; overflow-x: auto; font-size: 13px; border: 1px solid var(--border); margin: 12px 0; }
.nav { margin-bottom: 24px; }
.nav a { color: var(--accent); text-decoration: none; }
.nav a:hover { text-decoration: underline; }
.step { background: var(--card-bg); border: 1px solid var(--border); border-radius: 8px; padding: 16px 20px; margin: 16px 0; }
.step h3 { margin-top: 0; }
hr { border: none; border-top: 1px solid var(--border); margin: 32px 0; }
table { width: 100%; border-collapse: collapse; margin: 12px 0; border: 1px solid var(--border); }
th, td { padding: 8px; text-align: left; border: 1px solid var(--border); }
th { background: var(--code-bg); }
</style>
</head>
<body>
<div class="nav"><a href="/docs/architect">Архитектура</a></div>
<h1>🔄 Gitea Actions — настройка CI/CD</h1>
<blockquote style="border-left-color: #f85149; background: #1a0a0a; color: #f85149;">
<strong>⚠️ Не решает проблему ручного редеплоя managed-сервисов Nubes.</strong><br>
Если сервис деплоится только через Nubes UI — Gitea Actions может максимум валидировать код и синхронизировать VM-часть. Кнопку «Redeploy» всё равно жать руками.
</blockquote>
<hr>
<h2>Как это работает</h2>
<p>Gitea Actions — встроенный CI/CD (аналог GitHub Actions), доступен с Gitea 1.19+. При <code>git push</code> запускается workflow, который выполняет заданные шаги на <strong>раннере</strong> — отдельной машине, которая слушает задачи.</p>
<table>
<tr><th>Компонент</th><th>Где</th><th>Что делает</th></tr>
<tr><td>Workflow-файл</td><td><code>.gitea/workflows/*.yaml</code></td><td>Описывает шаги (steps) при пуше</td></tr>
<tr><td>Act Runner</td><td>Любая машина с доступом к Gitea</td><td>Выполняет джобы (systemd-сервис)</td></tr>
<tr><td>Gitea</td><td>Ваш инстанс</td><td>Отправляет задачи раннеру при пуше</td></tr>
</table>
<hr>
<h2>Пример workflow</h2>
<pre>name: Validate
on:
push:
branches: [master]
jobs:
check:
runs-on: linux_amd64
steps:
- name: Syntax check
run: python3 -m py_compile *.py</pre>
<p>Что можно автоматизировать:</p>
<ul>
<li>Синтаксическую проверку</li>
<li>Запуск тестов (<code>pytest</code>)</li>
<li>Синхронизацию кода на свою VM (<code>rsync</code> / <code>scp</code>)</li>
<li>Уведомления (Telegram, email)</li>
</ul>
<hr>
<h2>Как это настраивалось</h2>
<div class="step">
<h3>1. Установка act_runner на VM</h3>
<pre># Скачать бинарник
curl -sL -o /usr/local/bin/act_runner \
https://dl.gitea.com/act_runner/0.2.11/act_runner-0.2.11-linux-amd64
chmod +x /usr/local/bin/act_runner</pre>
</div>
<div class="step">
<h3>2. Получение токена</h3>
<p>В Gitea: <code>Репозиторий → Settings → Actions → Runners → Create new runner</code></p>
<p>Выдаётся токен вида <code>D0gvfu2iHfUj...</code> — он используется для регистрации.</p>
</div>
<div class="step">
<h3>3. Регистрация раннера</h3>
<pre>act_runner register \
--no-interactive \
--instance https://&lt;ваш-gitea&gt; \
--token &lt;TOKEN&gt; \
--name &lt;имя-раннера&gt; \
--labels linux_amd64:host</pre>
<p><code>linux_amd64:host</code> — означает host-режим (без Docker). Джобы выполняются прямо на машине.</p>
</div>
<div class="step">
<h3>4. Генерация конфига</h3>
<pre>act_runner generate-config > /etc/act_runner/config.yaml
# Важно: поправить labels → ["linux_amd64:host"]</pre>
</div>
<div class="step">
<h3>5. Systemd-сервис</h3>
<pre>[Unit]
Description=Gitea Actions Runner
After=network.target
[Service]
ExecStart=/usr/local/bin/act_runner daemon --config /etc/act_runner/config.yaml
WorkingDirectory=/etc/act_runner
Restart=always
RestartSec=10
User=runner
Environment=HOME=/home/runner
[Install]
WantedBy=multi-user.target</pre>
<pre>sudo systemctl daemon-reload
sudo systemctl enable act_runner --now
sudo systemctl status act_runner</pre>
</div>
<div class="step">
<h3>6. Workflow-файл</h3>
<p>Создать <code>.gitea/workflows/deploy.yaml</code> в репозитории. При пуше — workflow запустится автоматически.</p>
<p><strong>Важно:</strong> <code>runs-on</code> должен совпадать с лейблом раннера (без <code>:host</code>). То есть <code>runs-on: linux_amd64</code>.</p>
</div>
<hr>
<h2>Проверка статуса</h2>
<pre># Логи раннера на VM
sudo journalctl -u act_runner -f
# Статус сервиса
sudo systemctl status act_runner</pre>
<p>Результаты выполнения workflow видны в Gitea на вкладке <strong>Actions</strong> репозитория.</p>
<hr>
<h2>Полезные ссылки</h2>
<ul>
<li><a href="https://docs.gitea.com/usage/actions/overview/" target="_blank">Gitea Actions — Overview</a></li>
<li><a href="https://docs.gitea.com/usage/actions/act-runner" target="_blank">Act Runner — документация</a></li>
<li><a href="https://docs.gitea.com/usage/actions/quickstart/" target="_blank">Quick Start</a></li>
</ul>
</body>
</html>