Перейти к содержимому
NEWЧат с 15 ИИ-моделями — попробуйте бесплатно / имейте совесть, когда будете делиться или копировать
>AISTUDY_

Модуль 2.4 · Урок 3

Урок 3: GitHub Action и CI/CD интеграция

Практика
Содержание
2.4 / Урок 3 из 3

Чему вы научитесь

  • Как работает 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 ключ в секреты

  1. Перейти: Settings → Secrets and variables → Actions
  2. Нажать New repository secret
  3. Имя: OPENAI_API_KEY
  4. Значение: ваш API ключ от OpenAI
  5. Нажать 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"
  ]
}

Когда использовать: сравнение подходов

СценарийЛокальный CLIGitHub 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 минут)

  1. Создать структуру:

    mkdir -p .github/workflows
  2. Создать файл 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
  3. Отправить в репозиторий:

    git add .github/workflows/codex.yml
    git commit -m "ci: add codex auto-fix workflow"
    git push

Задание 2: Добавить секрет в GitHub (10 минут)

  1. Перейти на GitHub → Settings → Secrets and variables → Actions
  2. Нажать “New repository secret”
  3. Name: OPENAI_API_KEY
  4. Value: ваш API ключ (sk-…)
  5. Нажать “Add secret”

Проверить:

# Через gh CLI
gh secret list
# Должен показать OPENAI_API_KEY

Задание 3: Создать issue и протестировать (20 минут)

  1. На GitHub создайте Issue:

    • Title: “Add logging to calculator functions”
    • Body: “Add logging using Python logging module to all functions in src/calculator.py”
  2. Добавить label codex

  3. Наблюдать в Actions:

    • GitHub → Actions
    • Смотреть workflow выполнение
    • Проверить логи в “Run Codex” шаге
  4. Проверить результат:

    • Должна появиться ветка 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

  1. [-] Полный рефакторинг архитектуры — слишком сложно, нужен человек
  2. [-] Удаление больших частей кода — опасно без ревью
  3. [-] Автоматический deploy — всегда нужен контроль
  4. [-] Обновление версий в production — требуется ручной контроль
  5. [-] Добавление новых dependencies — может сломать совместимость

Что ХОРОШО делать в GitHub Action

  1. [+] Простые баг-фиксы (если test suite покрывает)
  2. [+] Генерирование тестов для существующего кода
  3. [+] Обновление документации (README, docs)
  4. [+] Форматирование кода (prettier, black, isort)
  5. [+] Обновление changelog на основе commit messages
  6. [+] Создание бойлерплейта для новых модулей

Лучшие практики

  1. Всегда используй auto-edit или suggest в CI — никогда full-auto

  2. Ограничивай max-tokens чтобы не переплатить за API:

    - name: Run Codex
      env:
        OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        CODEX_MAX_TOKENS: 1500
  3. Требуй review перед merge:

    - uses: peter-evans/create-pull-request@v4
      with:
        draft: true  # Создать как draft PR
  4. Логируй все действия для аудита:

    - 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
  5. Тестируй workflow на приватном репозитории перед использованием в production

Ключевые выводы

  1. GitHub Actions + Codex = автоматизация превращает рутинные задачи в автоматические процессы

  2. Label-based triggering позволяет разработчику выбрать, когда использовать Codex (через метку codex)

  3. Три режима по сложности:

    • Bug-фиксы → auto-edit режим
    • Генерирование → suggest режим
    • Документация → full-auto с review
  4. Workflow YAML — декларативный способ описать процесс, хранится в git и легко версионируется

  5. Всегда нужен human review перед merge, даже для “простых” автоматических изменений

Практический совет: начните с малого

День 1: Настроить workflow для обновления документации
День 2: Добавить workflow для генерирования тестов
День 3: Настроить workflow для баг-фиксов
День 4: Мониторить, собрать обратную связь
День 5: Расширить, добавить больше label'ов

Не пытайтесь автоматизировать ВСЕ сразу. Начните с одной простой задачи, убедитесь что это работает, затем добавляйте постепенно.

Дополнительные ресурсы

Модуль завершен!

Вы прошли все три урока:

  1. [+] Установка и конфигурация Codex CLI
  2. [+] Агентный режим с мультифайловыми изменениями
  3. [+] GitHub Actions для CI/CD automation

Следующий шаг: применить эти знания в реальном проекте! Начните с локального CLI (Урок 2), а когда почувствуете уверенность — переходите на GitHub Actions (Урок 3).

Успехов в автоматизации разработки!

Скачать урок

Есть идея или нашли ошибку?

// Обсуждение

Можно писать анонимно. Укажите email, чтобы получать уведомления об ответах.