← ब्लॉग
Engineering

Codex Exec: टर्मिनल से डिप्लॉयमेंट चेक ऑटोमेट करें

Yura Dubinin
इससे सारांश बनवाएँ:

codex exec इंटरैक्टिव टर्मिनल इंटरफ़ेस के बिना Codex चलाता है। इसे प्रॉम्प्ट दें या डेटा पाइप करें, फिर स्क्रिप्ट के अगले स्टेप के लिए जवाब सेव कर लें। यह गाइड JSONL इवेंट्स, स्कीमा से बंधे रिज़ल्ट और असली HTTP चेक पर आधारित एग्ज़िट कोड के साथ एक डिप्लॉयमेंट रिपोर्ट बनाता है।

आप एक छोटे quote API के दो वर्ज़न टेस्ट करेंगे: एक ठीक काम करता है, और दूसरा अपने हेल्थ एंडपॉइंट से HTTP 200 लौटाता है, जबकि कोट रूट फ़ेल होता है। पूरे उदाहरण में कलेक्टर, रिपोर्ट स्कीमा और वैलिडेशन स्क्रिप्ट शामिल हैं।

इंटरैक्टिव इंटरफ़ेस के बिना Codex चलाएँ

किसी भरोसेमंद Git रिपॉज़िटरी से चलाएँ:

codex exec --sandbox read-only \
  "Summarize this repository in three sentences. Do not change files."

Codex प्रोग्रेस stderr पर और अपना फाइनल जवाब stdout पर लिखता है। आप इस जवाब को किसी फ़ाइल में रीडायरेक्ट कर सकते हैं। ऑफ़िशियल नॉन-इंटरैक्टिव गाइड में यह व्यवहार और सपोर्टेड ऑटोमेशन पैटर्न बताए गए हैं।

डिप्लॉयमेंट रिपोर्ट के लिए हम ऑब्ज़र्वेशन stdin पर देंगे। एक छोटा Python कलेक्टर नेटवर्क रिक्वेस्ट करता है। Codex एविडेंस को समझाता है, और एक अलग फ़ंक्शन रिपोर्ट को उन्हीं ऑब्ज़र्वेशन से मिलाकर जांचता है।

Codex exec: HTTP एविडेंस, JSONL इवेंट्स और वैलिडेटेड फाइनल रिपोर्ट

तीन आउटपुट फ़ाइलों को समझें

इन फ़ाइलों का काम अलग-अलग है:

फ़ाइलइसमें क्या हैकैसे पढ़ें
events.jsonl--json से मिले रन इवेंट्स, हर लाइन में एक JSON ऑब्जेक्टहर नॉन-एम्प्टी लाइन को अलग से पार्स करें
report.json-o से लिखा गया फाइनल जवाब, जिसका ढांचा --output-schema तय करता हैएक JSON ऑब्जेक्ट के रूप में पार्स करें
stderr.logCLI प्रोसेस के डायग्नोस्टिक्सट्रबलशूटिंग के लिए रखें

--json stdout को इवेंट स्ट्रीम में बदल देता है। इससे पूरी स्ट्रीम एक सिंगल रिपोर्ट ऑब्जेक्ट नहीं बन जाती। --output-schema फाइनल जवाब का ढांचा तय करता है, और -o उस जवाब को अलग से सेव करता है। यह फ़र्क़ ऑटोमेशन के एक आम बग से बचाता है: पूरे इवेंट लॉग को एक ही JSON रीड से पार्स करने की कोशिश।

उदाहरण तैयार करें

Python 3.10 या उसके बाद का वर्ज़न और ऑथेंटिकेटेड Codex CLI उपयोग करें। Python फ़ाइलों के लिए किसी थर्ड-पार्टी पैकेज की ज़रूरत नहीं है। नीचे दिए गए शेल कमांड macOS या Linux पर Bash या Zsh के लिए हैं।

codex --version
codex login status
mkdir codex-deployment-check
cd codex-deployment-check
for file in demo.py collect.py gate.py run.py report.schema.json verify.py; do
  curl --fail --silent --show-error \
    "https://lizard.build/blog-examples/agent-deployment-checks/$file" \
    --output "$file"
done

डाउनलोड की गई फ़ाइलों को चलाने से पहले पढ़ लें। डेमो शुरू करें और उसे चलता रहने दें:

python3 demo.py --port 8787

एप्लिकेशन में दो GET रूट हैं। /healthz status: ok लौटाता है। /api/quote?quantity=3 तीन आइटम का कोट कैलकुलेट करता है, जिसमें हर आइटम 1,200 सेंट का है। अपेक्षित रिज़ल्ट $36.00 (3,600 सेंट) है। एसर्शन (assertion) में राउंडिंग की गड़बड़ी से बचने के लिए उदाहरण पूर्णांक सेंट का उपयोग करता है।

बाकी कमांड के लिए उसी फ़ोल्डर में दूसरा टर्मिनल खोलें।

HTTP एविडेंस इकट्ठा करें और जांचें

python3 collect.py http://127.0.0.1:8787 > evidence.json

कलेक्टर URL, चेक का समय और HTTP स्टेटस रिकॉर्ड करता है, और यह भी कि हर रिस्पॉन्स अपने अपेक्षित फ़ील्ड से मेल खाता है या नहीं। यह दो सीमित रिक्वेस्ट करता है, रीडायरेक्ट को रिजेक्ट करता है और हर रिस्पॉन्स को 64 KiB तक सीमित रखता है। यह मॉडल को अपेक्षित वैल्यू और बूलियन भेजता है, रिस्पॉन्स का मनमाना टेक्स्ट कॉपी नहीं करता।

अपने एप्लिकेशन के लिए collect.py और gate.py दोनों में डेमो पाथ और अपेक्षित वैल्यू बदलें। ऐसा रूट चुनें जो काम का व्यवहार टेस्ट करे: कीमत कैलकुलेट करना, डेटाबेस में पहले से सीड किया गया रिकॉर्ड पढ़ना या कोई मौजूदा डॉक्यूमेंट लाना। स्टेटस कोड के साथ-साथ रिस्पॉन्स का कंटेंट भी मिलाएँ।

कलेक्टर का एग्ज़िट कोड बताता है कि उसने एविडेंस इकट्ठा किया या नहीं। एप्लिकेशन चेक फ़ेल होने पर भी एविडेंस फ़ाइल बनती है, ताकि Codex फ़ेलियर को समझा सके। जॉब का रिज़ल्ट फाइनल गेट तय करता है।

स्ट्रक्चर्ड रिपोर्ट माँगें

इन फ़ाइलों वाली किसी भरोसेमंद Git रिपॉज़िटरी से चलाएँ:

codex exec --ignore-user-config --ephemeral \
  --sandbox read-only \
  --json \
  --output-schema report.schema.json \
  -o report.json \
  "Explain the evidence on stdin. Use no tools. Copy its verdict, list failed check names in failed_checks, and give a summary and next_step. Do not infer a root cause from HTTP status alone." \
  < evidence.json > events.jsonl 2> stderr.log

अगर आप सिर्फ़ नए डाउनलोड फ़ोल्डर का उपयोग कर रहे हैं, तो --skip-git-repo-check जोड़ें। पूरा रैपर रिपोर्ट के लिए बनाई गई एक टेम्पररी डायरेक्टरी में यही करता है। यह फ़्लैग सोच-समझकर तभी उपयोग करें जब रिपॉज़िटरी की ज़रूरत न हो।

--ignore-user-config यूज़र की मुख्य Codex कॉन्फ़िगरेशन फ़ाइल को छोड़ देता है, लेकिन सामान्य ऑथेंटिकेशन बना रहता है। --ephemeral सेशन रोलआउट को सेव होने से रोकता है। शेल फिर भी ऊपर साफ़ तौर पर बताई गई तीन आउटपुट फ़ाइलें सेव करता है। --sandbox read-only मॉडल के बनाए कमांड को सीमित करता है; आर्टिफैक्ट्स शेल के रीडायरेक्ट लिखते हैं।

स्कीमा में verdict, failed_checks, summary और next_step ज़रूरी हैं, और अतिरिक्त फ़ील्ड की अनुमति नहीं है। रिपोर्ट को यह बताना चाहिए कि दिए गए चेक से क्या साबित होता है। 503 के बाद जवाब में एप्लिकेशन लॉग देखने का सुझाव दिया जा सकता है, लेकिन सिर्फ़ स्टेटस कोड से डेटाबेस फ़ेलियर साबित नहीं होता।

स्ट्रीम और फाइनल जवाब को अलग-अलग पार्स करें

हमारे लाइव टेस्ट में Codex ने इस क्रम में ये इवेंट टाइप भेजे:

thread.started
turn.started
item.completed
turn.completed

पूरा हुआ आइटम एक एजेंट मैसेज था। इन रन में कोई टूल कॉल नहीं हुई। दूसरे टास्क ज़्यादा इवेंट दे सकते हैं, जिनमें कमांड एग्ज़िक्यूशन, टूल कॉल और एरर शामिल हैं; यह शर्त न रखें कि हर सफल रन में ठीक चार लाइनें ही हों।

रैपर हर इवेंट पढ़ता है और turn.failed या error मिलने पर रन को रिजेक्ट कर देता है। इसके लिए turn.completed, सफल प्रोसेस एग्ज़िट और ऐसी फाइनल रिपोर्ट भी ज़रूरी है जो पार्स हो सके। फिर यह रिपोर्ट के verdict और फ़ेल हुए चेक के नामों की तुलना HTTP एविडेंस से करता है।

जो स्ट्रीम बीच में ही खत्म हो जाए, उसे अधूरा जॉब मानें। पिछले रन से बची हुई रिपोर्ट फ़ाइल को दोबारा उपयोग करना भी सुरक्षित नहीं है। रैपर नई आउटपुट डायरेक्टरी बनाता है और किसी मौजूदा रन को ओवरराइट करने से मना कर देता है।

Codex इवेंट्स, फाइनल रिपोर्ट और डायग्नोस्टिक्स तीन अलग-अलग फ़ाइलों में सेव होते हैं

पूरा वर्कफ़्लो चलाएँ

python3 run.py codex http://127.0.0.1:8787 runs/healthy

यह कमांड नया एविडेंस इकट्ठा करता है, 180 सेकंड के प्रोसेस टाइमआउट के साथ Codex लॉन्च करता है, उसका आउटपुट सेव करता है और रिपोर्ट को वैलिडेट करता है। रैपर एग्ज़िट कोड 0 तभी देता है जब दोनों एप्लिकेशन चेक पास हों और रिपोर्ट भी उनसे मेल खाए।

फ़ेलियर को रिप्रोड्यूस करने के लिए दूसरे टर्मिनल में दूसरा डेमो शुरू करें:

python3 demo.py --port 8788 --broken

फिर उसी इंस्टेंस पर वही वर्कफ़्लो चलाएँ:

python3 run.py codex http://127.0.0.1:8788 runs/broken

हेल्थ रूट 200 लौटाता है और कोट रूट 503 लौटाता है। Codex को ये ऑब्ज़र्वेशन मिलते हैं और वह फ़ेलियर रिपोर्ट लौटाता है। रैपर एग्ज़िट कोड 1 देता है। हो सकता है कि रिपोर्ट बनाने वाला प्रोसेस सफलतापूर्वक पूरा हो जाए, जबकि एप्लिकेशन चेक फ़ेल हो; एप्लिकेशन से जुड़े फ़ैसले के लिए आपके ऑटोमेशन को रैपर के एग्ज़िट कोड का ही उपयोग करना चाहिए।

वर्किंग उदाहरण के रिज़ल्ट

हमने दोनों सिनेरियो 28 सितंबर 2026 को Codex CLI 0.156.1 और Python 3.12.10 के साथ चलाए। Lizard CLI कमांड को हमने वर्ज़न 4.0.8 पर भी जांचा।

सिनेरियोहेल्थ रूटकोट रूटCodex रिपोर्टरैपर एग्ज़िट
वर्किंग डेमो200, अपेक्षित बॉडी200, $36.00 (3,600 सेंट)pass, फ़ेल चेक: कोई नहीं0
ब्रोकन कोट200, अपेक्षित बॉडी503fail, quote फ़ेल1

दोनों मॉडल कॉल पूरी हुईं और दोनों की रिपोर्ट इकट्ठा किए गए एविडेंस से मेल खाती थी। ब्रोकन रन की रिपोर्ट ने रिकॉर्ड किए गए समय के लॉग देखने का सुझाव दिया। उसने यह दावा नहीं किया कि हेल्थ एंडपॉइंट से पूरे एप्लिकेशन की हेल्थ साबित हो जाती है।

लोकल वैलिडेशन टेस्ट झूठी सफलता वाली रिपोर्ट और अधूरे एविडेंस को भी रिजेक्ट करते हैं। इन्हें मॉडल कॉल के बिना चलाएँ:

python3 verify.py

यह लोकल मशीन पर किया गया सिंथेटिक HTTP टेस्ट है। यह प्रोडक्शन ट्रैफ़िक, पब्लिक DNS, TLS, डेटाबेस माइग्रेशन या हर रूट को कवर नहीं करता। अपने डिप्लॉयमेंट के जो हिस्से आपके लिए मायने रखते हैं, उनके लिए चेक जोड़ें।

Lizard सर्विस स्टेट और लॉग जोड़ें

Lizard पर चल रहे एप्लिकेशन के लिए, फ़ेलियर का मतलब निकालने से पहले टारगेट कन्फ़र्म करें:

lizard skills get core --json
lizard status --json
lizard ps --project YOUR_PROJECT --json
lizard logs --project YOUR_PROJECT --service YOUR_SERVICE --tail 100 --json

Lizard CLI आपको मशीन-रीडेबल सर्विस जानकारी और लॉग का सीमित स्नैपशॉट देता है। core गाइड इंस्टॉल किए गए CLI वर्ज़न से मेल खाता है। जब आपको और कमांड या फ़्लैग चाहिए हों, तब इसका उपयोग करें, और ऑटोमेशन में प्रोजेक्ट और सर्विस के लिए साफ़ तौर पर दिए गए सिलेक्टर उपयोग करें।

अडैप्ट किए गए HTTP कलेक्टर को सर्विस के पब्लिक URL पर चलाएँ। कंटेनर के चालू दिखने से यह साबित नहीं होता कि कीमत निकालना या डेटाबेस रीड काम कर रहा है। अगली जांच का दायरा कम करने के लिए HTTP फ़ेलियर के समय की तुलना सर्विस लॉग से करें। मॉडल को भेजने से पहले लॉग कंटेंट को रिव्यू करें और संवेदनशील हिस्से रिडैक्ट करें।

अगर आपको पहले डिप्लॉय करना है, तो कोडिंग-एजेंट डिप्लॉयमेंट गाइड से शुरू करें। डेटा डिपेंडेंसी वाले ऐप्स के लिए Postgres MCP ट्यूटोरियल और Redis MCP ट्यूटोरियल टेस्ट डेटा जांचने के लिए स्कोप्ड एक्सेस समझाते हैं।

रिज़ल्ट को ऑटोमेशन में उपयोग करें

तीन नतीजों को साफ़ तौर पर अलग रखें: एप्लिकेशन पास, एप्लिकेशन फ़ेल, और रिपोर्ट जॉब फ़ेल। यह रैपर इनके लिए क्रमशः 0, 1 और 2 का उपयोग करता है। टाइमआउट, CLI ऑथेंटिकेशन की समस्या, इनवैलिड रिपोर्ट या आउटपुट में विरोधाभास होने पर कोड 2 मिलता है।

एविडेंस को रिपोर्ट के साथ स्टोर करें। इससे टीम का कोई साथी सिर्फ़ टेक्स्ट सारांश पर भरोसा किए बिना रिज़ल्ट वेरिफ़ाई कर सकता है। शेड्यूल्ड रन को अलग-अलग आउटपुट पाथ दें, रिटेंशन पीरियड तय करें और आर्टिफैक्ट्स में क्रेडेंशियल सेव न करें।

अपनी भरोसेमंद मशीन पर codex exec सेव किए गए CLI लॉगिन को दोबारा उपयोग कर सकता है। GitHub Actions में ऑथेंटिकेशन और परमिशन सेटअप के लिए ऑफ़िशियल Codex एक्शन गाइड फ़ॉलो करें। API क्रेडेंशियल को रिपॉज़िटरी की फ़ाइलों से बाहर रखें और उन्हें गैर-भरोसेमंद बिल्ड स्टेप्स तक न पहुँचने दें। लोकल कमांड को CI में ले जाने से पहले रनर से जुड़ी इन ज़रूरतों को रिव्यू करें।

हर अलग चेक के लिए नया एविडेंस उपयोग करें। codex exec resume किसी बातचीत को आगे जारी रख सकता है, लेकिन इस वन-शॉट रिपोर्ट के लिए इसकी ज़रूरत नहीं है। उदाहरण का ephemeral मोड हर रन को स्वतंत्र बनाता है।

ट्रबलशूटिंग

लक्षणक्या जांचें
Git रिपॉज़िटरी के अंदर नहीं हैंसही रिपॉज़िटरी से चलाएँ, या अलग रखे गए रिपोर्ट फ़ोल्डर के लिए सोच-समझकर --skip-git-repo-check का उपयोग करें
JSON पार्सर extra data एरर देता हैevents.jsonl को एक-एक लाइन करके पार्स करें; report.json को एक ऑब्जेक्ट के रूप में पार्स करें
फाइनल रिपोर्ट नहीं बनीप्रोसेस एग्ज़िट, stderr और फ़ेलियर इवेंट्स जांचें
Codex ने एग्ज़िट कोड 0 दिया, फिर भी रैपर 1 देता हैएप्लिकेशन चेक फ़ेल हुआ है; failed_checks और एविडेंस जांचें
रैपर एग्ज़िट कोड 2 देता हैऑथेंटिकेशन, टाइमआउट, स्कीमा, विरोधाभासी आउटपुट या पहले से मौजूद आउटपुट डायरेक्टरी जांचें
होस्टेड एंडपॉइंट रीडायरेक्ट करता हैरूट और ज़रूरी ऑथेंटिकेशन वेरिफ़ाई करें; यह कलेक्टर रीडायरेक्ट को रिजेक्ट करता है

आगे कहाँ जाएँ

इस पैटर्न का उपयोग किसी खास डिप्लॉयमेंट चेक के लिए करें, फिर अपने एप्लिकेशन की असली डिपेंडेंसी के लिए एसर्शन जोड़ें। चेक इतने छोटे रखें कि फ़ेल होने पर रिज़ल्ट किसी काम के अगले स्टेप की ओर इशारा करे।

अगर आपकी टीम Claude Code का उपयोग करती है, तो Claude Code हेडलेस गाइड वही HTTP चेक उसके result envelope (रिज़ल्ट वाला JSON ऑब्जेक्ट) के साथ दिखाता है। एप्लिकेशन को खुद चलाने के लिए Lizard CLI का उपयोग करें और अपने डिप्लॉयमेंट स्टेप के बाद रिपोर्ट जोड़ें।

AI के साथ बिल्ड करें। Lizard के साथ शिप करें।

लाइव जाने के लिए आपको प्लेटफ़ॉर्म टीम की ज़रूरत नहीं है। आपका पूरा क्लाउड, बस एक CLI कमांड की दूरी पर।

सर्विसेज़
—
ऐडऑन
—
डिप्लॉयमेंट्स
—
सैंडबॉक्स स्टार्ट्स
—

हम आवश्यक साइट कार्यक्षमता और विश्लेषण के लिए कुकीज़ का उपयोग करते हैं। हमारी कुकी नीति देखें।