Модуль 2.4 · Урок 3
Урок 3: GitHub Action и CI/CD интеграция
Содержание
- Чему вы научитесь
- Введение: Автоматизация в GitHub
- Архитектура: как работает Codex Action
- Настройка GitHub Action: шаг за шагом
- Шаг 1: Создать файл workflow
- Шаг 2: Написать базовый workflow
- Шаг 3: Добавить API ключ в секреты
- Шаг 4: Создать label в репозитории
- Примеры workflow для разных задач
- Пример 1: Автоматический баг-фикс
- Пример 2: Генерирование тестов
- Пример 3: Обновление документации
- Конфигурация: параметры Codex в CI
- Когда использовать: сравнение подходов
- Диаграмма: Полный workflow с GitHub Actions
- Попробуйте сами: настройка Codex Action
- Подготовка: форкните тестовый репозиторий
- Задание 1: Создать workflow файл (15 минут)
- Задание 2: Добавить секрет в GitHub (10 минут)
- Задание 3: Создать issue и протестировать (20 минут)
- Задание 4: Создать специализированный workflow (25 минут)
- Сравнение: CLI vs GitHub Action
- Локальный CLI (Урок 2)
- GitHub Action (Урок 3)
- Ограничения и лучшие практики
- Что НЕ делать в GitHub Action
- Что ХОРОШО делать в GitHub Action
- Лучшие практики
- Ключевые выводы
- Практический совет: начните с малого
- Дополнительные ресурсы
- Модуль завершен!
Чему вы научитесь
- Как работает Codex в CI/CD pipeline через GitHub Actions
- Как превратить GitHub Issues в автоматические PR с решением
- Как настроить workflow YAML для разных типов задач
- Когда использовать GitHub Action, а когда — локальный CLI
- Как контролировать и ограничивать действия агента в pipeline
Введение: Автоматизация в GitHub
Если в Уроке 2 мы управляли Codex вручную, то теперь автоматизируем весь процесс:
Разработчик создает Issue в GitHub
↓
GitHub Action срабатывает
↓
Codex анализирует код и описание
↓
Codex создает решение (коммит)
↓
Codex открывает Pull Request
↓
CI тестирует PR
↓
Результат ждет review разработчика
Это полезно для:
- Автоматического исправления ошибок (баг-фиксы, код-смеллы)
- Генерирования тестов для новых функций
- Обновления документации (README, API docs)
- Рутинной работы (обновление зависимостей, форматирование)
- Создания бойлерплейт кода для новых модулей
Важно: это не полная замена разработчику, а помощник для рутины.
Архитектура: как работает Codex Action
graph TB
subgraph GitHub["GitHub Repository"]
A["Issue:<br/>Add logging to process<br/>label: codex-fix"]
B["/.github/workflows/codex.yml"]
C["Main Branch"]
end
subgraph OpenAI["OpenAI Service"]
D["Codex-mini Model"]
end
subgraph Codex["Codex Action Runner"]
E["1. Clone repo"]
F["2. Parse issue"]
G["3. Analyze code"]
H["4. Generate solution"]
end
subgraph Result["Result"]
I["PR: feat: add logging<br/>Linked to Issue"]
end
A -->|triggers| B
B --> E
E --> C
G --> D
D --> H
H --> I
I -.->|closes| A
Настройка GitHub Action: шаг за шагом
Шаг 1: Создать файл workflow
В репозитории создайте файл:
mkdir -p .github/workflows
touch .github/workflows/codex.yml
Шаг 2: Написать базовый workflow
Файл: .github/workflows/codex.yml
name: Codex Auto-Fix
on:
issues:
types: [labeled, reopened]
jobs:
codex-fix:
# Запустится только если добавлена метка 'codex'
if: contains(github.event.issue.labels.*.name, 'codex')
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
# 1. Клонировать репозиторий
- uses: actions/checkout@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
# 2. Установить Node.js
- uses: actions/setup-node@v3
with:
node-version: 18
# 3. Установить Codex
- name: Install Codex
run: npm install -g @openai/codex
# 4. Запустить Codex
- name: Run Codex Agent
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex --issue "${{ github.event.issue.body }}" \
--number "${{ github.event.issue.number }}" \
--title "${{ github.event.issue.title }}"
# 5. Создать Pull Request
- name: Create Pull Request
uses: peter-evans/create-pull-request@v4
with:
commit-message: "fix: auto-fix from issue #${{ github.event.issue.number }}"
title: "Auto-fix: ${{ github.event.issue.title }}"
body: "Closes #${{ github.event.issue.number }}"
branch: codex/issue-${{ github.event.issue.number }}
Шаг 3: Добавить API ключ в секреты
- Перейти: Settings → Secrets and variables → Actions
- Нажать New repository secret
- Имя:
OPENAI_API_KEY - Значение: ваш API ключ от OpenAI
- Нажать Add secret
# Или через gh CLI
gh secret set OPENAI_API_KEY --body "sk-..."
Шаг 4: Создать label в репозитории
# Через gh CLI
gh label create "codex" --description "Let Codex AI fix this issue" --color "purple"
# Или в GitHub UI:
# Issues → Labels → New label
# Name: codex
# Description: Let Codex AI fix this issue
# Color: purple
Примеры workflow для разных задач
Пример 1: Автоматический баг-фикс
name: Auto-Fix Bug
on:
issues:
types: [labeled]
jobs:
fix-bug:
if: contains(github.event.issue.labels.*.name, 'bug-fix')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Codex
run: npm install -g @openai/codex
- name: Create AGENTS.md for CI context
run: |
cat > AGENTS.md << 'EOF'
# CI Context
This is a bug fix issue. Focus on:
1. Minimal changes to fix the bug
2. No refactoring
3. Add test case for the bug
4. Run full test suite
## Unsafe operations (require manual review)
- Deleting files
- Changing database schema
- Removing dependencies
EOF
- name: Fix with Codex
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex --config-mode strict \
--sandbox-mode auto-edit \
"Fix this issue: ${{ github.event.issue.body }}"
Пример 2: Генерирование тестов
name: Generate Tests
on:
issues:
types: [labeled]
jobs:
generate-tests:
if: contains(github.event.issue.labels.*.name, 'test-gen')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install Codex
run: npm install -g @openai/codex
- name: Generate Tests
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
# Извлечь имя модуля из названия issue
MODULE=$(echo "${{ github.event.issue.title }}" | grep -oP '(?<=test )[^ ]+' || echo "main")
codex --sandbox-mode auto-edit \
"Generate comprehensive pytest tests for src/${MODULE}.py. \
Aim for 80%+ code coverage. \
Run pytest after generation."
- name: Run Tests
run: pytest tests/ -v --cov=src
- name: Create PR if tests generated
if: success()
uses: peter-evans/create-pull-request@v4
with:
commit-message: "test: auto-generated tests for ${{ github.event.issue.title }}"
title: "Tests: ${{ github.event.issue.title }}"
body: "Auto-generated by Codex\n\nCloses #${{ github.event.issue.number }}"
branch: codex/tests-${{ github.event.issue.number }}
Пример 3: Обновление документации
name: Update Documentation
on:
issues:
types: [labeled]
jobs:
update-docs:
if: contains(github.event.issue.labels.*.name, 'docs')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Codex
run: npm install -g @openai/codex
- name: Update Docs
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex --sandbox-mode suggest \
"Based on the current code, update docs/: \
${{ github.event.issue.title }} \
${{ github.event.issue.body }}"
- name: Create PR
uses: peter-evans/create-pull-request@v4
with:
commit-message: "docs: ${{ github.event.issue.title }}"
title: "Docs: ${{ github.event.issue.title }}"
branch: codex/docs-${{ github.event.issue.number }}
Конфигурация: параметры Codex в CI
Важные параметры для CI/CD:
# .github/workflows/codex.yml
env:
CODEX_SANDBOX_MODE: auto-edit # Безопасный режим в CI
CODEX_MODEL: codex-mini-latest # Экономная модель
CODEX_MAX_TOKENS: 2000 # Ограничить размер ответов
CODEX_TIMEOUT: 300 # 5 минут максимум
CODEX_STRICT_MODE: true # Запрещать опасные операции
Опасные операции, которые нужно запрещать в CI:
{
"forbidden_commands": [
"rm -rf",
"git push",
"git reset --hard",
"pip uninstall -y",
"npm uninstall -g",
"DROP TABLE",
"DELETE FROM"
],
"require_confirmation": [
"npm install",
"pip install",
"git commit",
"pytest",
"make deploy"
]
}
Когда использовать: сравнение подходов
| Сценарий | Локальный CLI | GitHub Action | Примечание |
|---|---|---|---|
| Быстрая разработка | [+] | [-] | Интерактивнее, быстрее |
| Рутинные баг-фиксы | [!] | [+] | Automation экономит время |
| Критичный код | [+] | [-] | Нужен личный контроль |
| Генерирование тестов | [!] | [+] | Хорошо в workflow |
| Рефакторинг архитектуры | [+] | [-] | Слишком сложно для агента |
| Обновление docs | [-] | [+] | Идеально для automation |
| Code review feedback | [+] | [+] | Оба хороши |
Диаграмма: Полный workflow с GitHub Actions
graph LR
A["1. Issue создана<br/>title: 'Add logging'<br/>label: codex"] -->|triggers| B["GitHub Action"]
B --> C["2. Clone repo<br/>Install Codex"]
C --> D["3. Parse issue<br/>Extract requirements"]
D --> E["4. Analyze code<br/>Find files to change"]
E --> F["5. Generate solution<br/>Call OpenAI API"]
F --> G["6. Auto-edit mode<br/>Apply changes"]
G --> H["7. Run tests<br/>pytest/npm test"]
H -->|success| I["8. Create PR<br/>Link to issue"]
H -->|failure| J["8. Create draft PR<br/>Mark as failed"]
I --> K["Ready for review"]
J --> K
Попробуйте сами: настройка Codex Action
Подготовка: форкните тестовый репозиторий
# Или создайте новый приватный репозиторий для теста
mkdir test-codex-action
cd test-codex-action
git init
# Создать Python проект
mkdir -p src tests
cat > src/calculator.py << 'EOF'
def add(a, b):
return a + b
def subtract(a, b):
return a - b
EOF
cat > tests/test_calculator.py << 'EOF'
from src.calculator import add, subtract
def test_add():
assert add(2, 3) == 5
def test_subtract():
assert subtract(5, 2) == 3
EOF
git add .
git commit -m "initial: simple calculator"
git remote add origin https://github.com/YOUR_USERNAME/test-codex-action.git
git push -u origin main
Задание 1: Создать workflow файл (15 минут)
-
Создать структуру:
mkdir -p .github/workflows -
Создать файл
codex.yml:cat > .github/workflows/codex.yml << 'EOF' name: Codex Auto-Fix on: issues: types: [labeled] jobs: auto-fix: if: contains(github.event.issue.labels.*.name, 'codex') runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 18 - name: Install Codex run: npm install -g @openai/codex - name: Create AGENTS.md run: | cat > AGENTS.md << 'AGENTS' # Project: Simple Calculator ## Language & Tools - Python 3.10 - pytest for testing - black for formatting ## Testing Commands - pytest tests/ -v - python -m pytest ## Before Changes Run: pytest tests/ -v ## After Changes Run: pytest tests/ -v AGENTS - name: Run Codex env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} run: | codex "Issue: ${{ github.event.issue.title }}\n${{ github.event.issue.body }}" EOF -
Отправить в репозиторий:
git add .github/workflows/codex.yml git commit -m "ci: add codex auto-fix workflow" git push
Задание 2: Добавить секрет в GitHub (10 минут)
- Перейти на GitHub → Settings → Secrets and variables → Actions
- Нажать “New repository secret”
- Name:
OPENAI_API_KEY - Value: ваш API ключ (sk-…)
- Нажать “Add secret”
Проверить:
# Через gh CLI
gh secret list
# Должен показать OPENAI_API_KEY
Задание 3: Создать issue и протестировать (20 минут)
-
На GitHub создайте Issue:
- Title: “Add logging to calculator functions”
- Body: “Add logging using Python logging module to all functions in src/calculator.py”
-
Добавить label
codex -
Наблюдать в Actions:
- GitHub → Actions
- Смотреть workflow выполнение
- Проверить логи в “Run Codex” шаге
-
Проверить результат:
- Должна появиться ветка
codex/issue-X - Смотреть changes в Pull Requests
- Проверить, что тесты прошли
- Должна появиться ветка
Задание 4: Создать специализированный workflow (25 минут)
Создайте workflow для генерирования документации:
cat > .github/workflows/codex-docs.yml << 'EOF'
name: Codex Generate Docs
on:
issues:
types: [labeled]
jobs:
generate-docs:
if: contains(github.event.issue.labels.*.name, 'codex-docs')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- name: Install Codex
run: npm install -g @openai/codex
- name: Generate Docs
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
codex --sandbox-mode auto-edit \
"Create comprehensive documentation in README.md for: ${{ github.event.issue.title }}\n\nDetails: ${{ github.event.issue.body }}"
- name: Validate Markdown
run: |
if [ -f README.md ]; then
echo "[+] README.md generated successfully"
fi
- name: Create PR
uses: peter-evans/create-pull-request@v4
with:
commit-message: "docs: ${{ github.event.issue.title }}"
title: "Docs: ${{ github.event.issue.title }}"
branch: codex/docs-${{ github.event.issue.number }}
body: "Auto-generated documentation\n\nCloses #${{ github.event.issue.number }}"
EOF
Затем:
git add .github/workflows/codex-docs.yml
git commit -m "ci: add documentation generation workflow"
git push
Точка контроля: Workflow должен выполниться успешно и создать PR с изменениями.
Сравнение: CLI vs GitHub Action
Локальный CLI (Урок 2)
[+] Интерактивный TUI интерфейс
[+] Быстрая обратная связь
[+] Полный контроль каждого шага
[-] Требует ручного запуска
[-] Занимает время разработчика
GitHub Action (Урок 3)
[+] Полная автоматизация
[+] Запускается на events (issue, PR, schedule)
[+] Экономит время разработчика
[+] Фиксирует процесс (код в git)
[-] Менее гибко
[-] Медленнее (из-за setup)
[-] Требует тестирования перед использованием
Ограничения и лучшие практики
Что НЕ делать в GitHub Action
- [-] Полный рефакторинг архитектуры — слишком сложно, нужен человек
- [-] Удаление больших частей кода — опасно без ревью
- [-] Автоматический deploy — всегда нужен контроль
- [-] Обновление версий в production — требуется ручной контроль
- [-] Добавление новых dependencies — может сломать совместимость
Что ХОРОШО делать в GitHub Action
- [+] Простые баг-фиксы (если test suite покрывает)
- [+] Генерирование тестов для существующего кода
- [+] Обновление документации (README, docs)
- [+] Форматирование кода (prettier, black, isort)
- [+] Обновление changelog на основе commit messages
- [+] Создание бойлерплейта для новых модулей
Лучшие практики
-
Всегда используй
auto-editилиsuggestв CI — никогдаfull-auto -
Ограничивай max-tokens чтобы не переплатить за API:
- name: Run Codex env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} CODEX_MAX_TOKENS: 1500 -
Требуй review перед merge:
- uses: peter-evans/create-pull-request@v4 with: draft: true # Создать как draft PR -
Логируй все действия для аудита:
- name: Log Action Details run: | echo "Issue: ${{ github.event.issue.number }}" echo "Labels: ${{ github.event.issue.labels.*.name }}" echo "Timestamp: $(date)" >> /tmp/codex-log.txt -
Тестируй workflow на приватном репозитории перед использованием в production
Ключевые выводы
-
GitHub Actions + Codex = автоматизация превращает рутинные задачи в автоматические процессы
-
Label-based triggering позволяет разработчику выбрать, когда использовать Codex (через метку
codex) -
Три режима по сложности:
- Bug-фиксы → auto-edit режим
- Генерирование → suggest режим
- Документация → full-auto с review
-
Workflow YAML — декларативный способ описать процесс, хранится в git и легко версионируется
-
Всегда нужен human review перед merge, даже для “простых” автоматических изменений
Практический совет: начните с малого
День 1: Настроить workflow для обновления документации
День 2: Добавить workflow для генерирования тестов
День 3: Настроить workflow для баг-фиксов
День 4: Мониторить, собрать обратную связь
День 5: Расширить, добавить больше label'ов
Не пытайтесь автоматизировать ВСЕ сразу. Начните с одной простой задачи, убедитесь что это работает, затем добавляйте постепенно.
Дополнительные ресурсы
- Codex CLI GitHub: https://github.com/openai/codex
- GitHub Actions Docs: https://docs.github.com/en/actions
- OpenAI API Pricing: https://openai.com/api/pricing/
- AGENTS.md Specification: https://github.com/openai/codex/blob/main/AGENTS.md
Модуль завершен!
Вы прошли все три урока:
- [+] Установка и конфигурация Codex CLI
- [+] Агентный режим с мультифайловыми изменениями
- [+] GitHub Actions для CI/CD automation
Следующий шаг: применить эти знания в реальном проекте! Начните с локального CLI (Урок 2), а когда почувствуете уверенность — переходите на GitHub Actions (Урок 3).
Успехов в автоматизации разработки!