OpenAI Codex w CI/CD: Automatyzacja pipeline z SDK

OpenAI Codex w CI/CD: Automatyzacja pipeline z SDK

Codex to nie tylko narzędzie dla programisty przy klawiaturze. SDK i tryb exec pozwalają wbudować AI bezpośrednio w pipeline CI/CD – automatyczne code review, generowanie changelog, pre-merge checks, a nawet naprawianie flaky testów.

W poprzednich wpisach omawialiśmy config.toml i bezpieczeństwo. Dziś wchodzimy w automatyzację – jak sprawić, żeby Codex pracował nawet gdy śpisz.

  1. codex exec: tryb non-interactive
  2. Codex SDK (TypeScript): pełna kontrola
  3. GitHub Actions + Codex
  4. GitLab CI/CD
  5. Praktyczne przykłady automatyzacji
  6. Obsługa błędów i retry
  7. Auth w CI: API key vs ChatGPT
  8. Optymalizacja kosztów w CI/CD

codex exec: tryb non-interactive

W pipeline nie ma interaktywnego terminala. codex exec uruchamia zadanie i kończy – bez pytań, bez czekania na input:

bash
codex exec "przejrzyj zmiany w tym PR pod kątem bezpieczeństwa"

Kluczowa różnica: codex prompt otwiera sesję interaktywną i czeka na Twoje reakcje. codex exec prompt wykonuje zadanie od A do Z i kończy z exit code – idealne dla CI gdzie nie ma operatora.

Exit codes

Codex exec zwraca exit code, który możesz wykorzystać do warunkowego blokowania merge:

Exit codes codex exec
KodZnaczenieAkcja w CI
0Sukces, brak problemówKontynuuj pipeline
1Znaleziono problem lub błąd wykonaniaBlokuj merge / wyślij alert
2Błąd konfiguracji lub authFail fast, sprawdź secrets
bash
# Przykład użycia w pipeline
codex exec "sprawdź kod pod kątem SQL injection"
if [ $? -eq 1 ]; then
  echo "Security issues found, blocking merge"
  exit 1
fi

Dodatkowe flagi dla exec

bash
# Ustaw timeout (domyślnie 10 minut)
codex exec --timeout 300 "prompt"

# Wymuś model
codex exec -m gpt-5.3 "prompt"

# Wyłącz sandbox (ostrożnie!)
codex exec --sandbox read-only "prompt"

Codex SDK (TypeScript): pełna kontrola

Dla zaawansowanych scenariuszy SDK daje programistyczną kontrolę nad każdym aspektem:

typescript
import { Codex } from "@openai/codex-sdk";

const codex = new Codex({
  apiKey: process.env.OPENAI_API_KEY,
  model: "gpt-5.2"
});

const thread = codex.startThread();

// Dodaj kontekst przed wykonaniem
await thread.addContext("src/auth/login.ts");
await thread.addContext("SECURITY_GUIDELINES.md");

// Wykonaj zadanie
const result = await thread.run(
  "Sprawdź czy kod logowania jest odporny na timing attacks"
);

console.log(result.output);
console.log("Tokens used:", result.usage.totalTokens);
Metody Codex SDK
MetodaOpisReturn
startThread()Tworzy nowy wątek konwersacjiThread
thread.run(prompt)Wykonuje promptRunResult
thread.addContext(file)Dodaje plik do kontekstuvoid
thread.getHistory()Pobiera historięMessage[]
thread.fork()Tworzy branch wątkuThread
codex.listThreads()Lista aktywnych wątkówThread[]

Strumieniowanie odpowiedzi

typescript
const stream = await thread.runStream("wygeneruj changelog");

for await (const chunk of stream) {
  process.stdout.write(chunk.text);
}

GitHub Actions + Codex

Kompletny workflow dla automatycznego code review z komentarzami na PR:

yaml
name: AI Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: "20"
          
      - name: Install Codex CLI
        run: npm i -g @openai/codex
        
      - name: Get changed files
        id: changed
        run: |
          FILES=$(git diff --name-only origin/main...HEAD)
          echo "files=$FILES" >> $GITHUB_OUTPUT
          
      - name: Run AI Security Review
        env:
          OPENAI_API_KEY: $secrets.OPENAI_API_KEY
          GITHUB_TOKEN: $secrets.GITHUB_TOKEN
        run: |
          codex exec "Review changed files for security issues. 
          Focus on: SQL injection, XSS, hardcoded secrets, auth bypass.
          Post findings as GitHub PR comment using gh CLI."

Pamiętaj o permissions: pull-requests: write jeśli chcesz, żeby Codex komentował PR. Bez tego gh pr comment zwróci 403.

GitLab CI/CD

Analogiczny pipeline dla GitLab:

yaml
ai-review:
  stage: test
  image: node:20
  
  before_script:
    - npm i -g @openai/codex
    
  script:
    - |
      codex exec "Review this MR for security issues.
      Use glab CLI to post comments.
      Focus on: authentication, authorization, input validation."
      
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    
  variables:
    OPENAI_API_KEY: $OPENAI_API_KEY
    GITLAB_TOKEN: $CI_JOB_TOKEN

Praktyczne przykłady automatyzacji

Auto-changelog przy release

bash
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^)
CURRENT_TAG=$(git describe --tags --abbrev=0)

codex exec "Wygeneruj changelog dla zmian między $PREV_TAG a $CURRENT_TAG.
Format: markdown z kategoriami Features, Fixes, Breaking Changes, Documentation.
Bazuj na commit messages i PR titles."

Pre-merge security scan

bash
codex exec "Sprawdź zmiany w tym PR pod kątem:
1. Hardcoded secrets (API keys, passwords, tokens)
2. SQL injection (nieescapowane parametry)
3. XSS (brak sanityzacji user input)
4. IDOR (brak sprawdzania uprawnień do zasobów)
5. Path traversal w ścieżkach

Jeśli znajdziesz jakikolwiek problem HIGH severity, zwróć exit 1.
Dla MEDIUM i LOW tylko raportuj."

Automatyczna dokumentacja API

bash
codex exec "Zaktualizuj docs/api.md na podstawie zmian w src/api/.
Dla każdego nowego endpointu dodaj:
- Method i path
- Request/response examples  
- Error codes
Zachowaj istniejący styl dokumentacji."

Fix flaky tests

bash
codex exec "Test $FAILED_TEST_NAME failed with: $ERROR_MESSAGE
Przeanalizuj test i kod który testuje.
Jeśli to race condition lub timing issue, napraw test.
Jeśli to prawdziwy bug w kodzie, napraw kod.
Uruchom test po naprawie żeby zweryfikować."

Pro tip: Połącz Codex z multi-agent workflows – uruchom równolegle agenta do security review, code quality i documentation check. Każdy agent może działać na osobnym runnerze.

Obsługa błędów i retry

W CI rzeczy się psują. Oto wzorce obsługi błędów:

bash
MAX_RETRIES=3
RETRY_DELAY=30

for i in $(seq 1 $MAX_RETRIES); do
  codex exec "..." && break
  
  if [ $i -eq $MAX_RETRIES ]; then
    echo "Codex failed after $MAX_RETRIES attempts"
    exit 1
  fi
  
  echo "Attempt $i failed, retrying in ${RETRY_DELAY}s..."
  sleep $RETRY_DELAY
done

Timeout handling w SDK

typescript
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 5 * 60 * 1000);

try {
  const result = await thread.run(prompt, { 
    signal: controller.signal 
  });
  clearTimeout(timeout);
  return result;
} catch (error) {
  if (error.name === "AbortError") {
    console.error("Codex timed out");
  }
  throw error;
}

Auth w CI: API key vs ChatGPT

W CI masz dwie opcje autentykacji, każda z innymi trade-offami:

Metody auth w CI/CD
MetodaSetupBillingKiedy używać
API KeyOPENAI_API_KEY env varPay per tokenSporadyczne taski, przewidywalny budżet
ChatGPTDevice auth + cacheSubscriptionCzęste taski, limity per plan

API Key (rekomendowane dla CI)

bash
# GitHub Actions secret
env:
  OPENAI_API_KEY: $secrets.OPENAI_API_KEY

Płacisz za faktyczne zużycie tokenów. Idealne dla CI gdzie taski uruchamiają się sporadycznie.

ChatGPT auth w headless

bash
# Na maszynie z przeglądarką (jednorazowo)
codex login

# Skopiuj auth do CI secrets
cat ~/.codex/auth.json | base64 > auth_encoded.txt

# W CI - przywróć auth
echo "$CODEX_AUTH_B64" | base64 -d > ~/.codex/auth.json

Optymalizacja kosztów w CI/CD

CI może generować dużo zapytań. Oto jak kontrolować koszty:

1. Używaj Mini dla prostych tasków

bash
codex exec -m gpt-5.1-codex-mini "sprawdź formatowanie kodu"

GPT-5.1-Codex-Mini zużywa około 4x mniej kredytów niż GPT-5.2/5.3.

2. Ogranicz kontekst

bash
# Zamiast analizować całe repo
codex exec "sprawdź wszystkie pliki pod kątem..."

# Analizuj tylko zmiany
FILES=$(git diff --name-only origin/main...HEAD)
codex exec "sprawdź te pliki: $FILES"

3. Uruchamiaj selektywnie

yaml
# Tylko dla zmian w src/
on:
  pull_request:
    paths:
      - 'src/**'

Więcej o interfejsach Codex w artykule CLI vs IDE vs Web. Dla głębszego zrozumienia multi-agent sprawdź Multi-agent workflows.

OpenAI Codex w CI/CD: Automatyzacja pipeline z SDK