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.
- codex exec: tryb non-interactive
- Codex SDK (TypeScript): pełna kontrola
- GitHub Actions + Codex
- GitLab CI/CD
- Praktyczne przykłady automatyzacji
- Obsługa błędów i retry
- Auth w CI: API key vs ChatGPT
- 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:
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:
| Kod | Znaczenie | Akcja w CI |
| 0 | Sukces, brak problemów | Kontynuuj pipeline |
| 1 | Znaleziono problem lub błąd wykonania | Blokuj merge / wyślij alert |
| 2 | Błąd konfiguracji lub auth | Fail fast, sprawdź secrets |
# 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
fiDodatkowe flagi dla exec
# 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:
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);| Metoda | Opis | Return |
| startThread() | Tworzy nowy wątek konwersacji | Thread |
| thread.run(prompt) | Wykonuje prompt | RunResult |
| thread.addContext(file) | Dodaje plik do kontekstu | void |
| thread.getHistory() | Pobiera historię | Message[] |
| thread.fork() | Tworzy branch wątku | Thread |
| codex.listThreads() | Lista aktywnych wątków | Thread[] |
Strumieniowanie odpowiedzi
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:
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:
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_TOKENPraktyczne przykłady automatyzacji
Auto-changelog przy release
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
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
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
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:
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
doneTimeout handling w SDK
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:
| Metoda | Setup | Billing | Kiedy używać |
| API Key | OPENAI_API_KEY env var | Pay per token | Sporadyczne taski, przewidywalny budżet |
| ChatGPT | Device auth + cache | Subscription | Częste taski, limity per plan |
API Key (rekomendowane dla CI)
# GitHub Actions secret
env:
OPENAI_API_KEY: $secrets.OPENAI_API_KEYPłacisz za faktyczne zużycie tokenów. Idealne dla CI gdzie taski uruchamiają się sporadycznie.
ChatGPT auth w headless
# 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.jsonOptymalizacja kosztów w CI/CD
CI może generować dużo zapytań. Oto jak kontrolować koszty:
1. Używaj Mini dla prostych tasków
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
# 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
# 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.

