Codex Security'yi CI'da çalıştırma
Pull request ve merge request değişikliklerini tarayın, yapılandırılmış sonuçları koruyun, SARIF yükleyin ve bir önem derecesi politikası belirleyin.
Bir pull request veya merge request'teki değişiklikleri tam olarak incelemek, bulguları ve kapsamı korumak ve isteğe bağlı olarak seçilen bir önem derecesinde denetimi başarısız kılmak için Codex Security CLI'ı CI'da çalıştırın. Önce bilgilendirme amaçlı sonuçlarla başlayın, tarama kalitesini ve çalışma süresini inceleyin, ardından deponuza uygun bir önem derecesi politikası ekleyin.
Bu kılavuz GitHub Actions ve GitLab CI/CD örnekleri içerir. Aynı tarama ve dışa aktarma komutları diğer CI sistemlerinde de çalışır.
İş akışını hazırlama
OpenAI API key'i CI sağlayıcınızın gizli değer deposunda CODEX_SECURITY_API_KEY olarak saklayın.
Bu gizli değeri doğrudan tarama adımının OPENAI_API_KEY ortam değişkenine eşleyin. Kimlik bilgisinin kapsamını tarama işlemiyle sınırlı tutun ve açıkça seçmek için --auth api-key kullanın.
Çalıştırıcı için gerekenler:
- Node.js 22 veya üzeri.
- Python 3.10 veya üzeri.
- Depo checkout'ının dışında yüklenmiş, yayımlanmış
@openai/codex-securitypaketi. - Git'in merge base'i hesaplayabilmesi için pull request veya merge request'in head ve base geçmişi.
GitHub Actions iş akışını ekleme
Özel veya kurum içi depolarda SARIF yüklemeden önce GitHub Code Security'yi etkinleştirin.
.github/workflows/codex-security.yml oluşturun. Pull request'i checkout etmeden önce güvenilir yürütülebilir dosyanın $RUNNER_TEMP/codex-security/node_modules/.bin/codex-security konumunda kullanılabilmesi için @openai/codex-security paketini $RUNNER_TEMP/codex-security altına yükleyin:
name: Codex Security scan
on:
pull_request:
jobs:
codex-security:
if: github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]'
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
steps:
- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7
with:
node-version: "26"
- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
with:
python-version: "3.14"
- name: Install Codex Security
run: |
set -euo pipefail
npm install \
--prefix "$RUNNER_TEMP/codex-security" \
--ignore-scripts \
--no-audit \
--no-fund \
@openai/codex-security
- name: Verify Codex Security
env:
CODEX_SECURITY_BIN: ${{ runner.temp }}/codex-security/node_modules/.bin/codex-security
run: |
set -euo pipefail
test -x "$CODEX_SECURITY_BIN"
"$CODEX_SECURITY_BIN" --version
- name: Check out the pull request
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
persist-credentials: false
- name: Scan the pull request
env:
OPENAI_API_KEY: ${{ secrets.CODEX_SECURITY_API_KEY }}
CODEX_SECURITY_BIN: ${{ runner.temp }}/codex-security/node_modules/.bin/codex-security
CODEX_SECURITY_STATE_DIR: ${{ runner.temp }}/codex-security-state
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
SCAN_DIR: ${{ runner.temp }}/codex-security-results
run: |
set -euo pipefail
BASE_REVISION="$(git merge-base "$BASE_SHA" "$HEAD_SHA")"
"$CODEX_SECURITY_BIN" scan . \
--diff "$BASE_REVISION" \
--head "$HEAD_SHA" \
--auth api-key \
--output-dir "$SCAN_DIR" \
--json > "$RUNNER_TEMP/codex-security.json"
- name: Export SARIF
id: export-sarif
if: always()
env:
CODEX_SECURITY_BIN: ${{ runner.temp }}/codex-security/node_modules/.bin/codex-security
SCAN_DIR: ${{ runner.temp }}/codex-security-results
SARIF_FILE: ${{ runner.temp }}/codex-security.sarif
run: |
set -euo pipefail
if test -f "$SCAN_DIR/scan-manifest.json"; then
"$CODEX_SECURITY_BIN" export "$SCAN_DIR" \
--export-format sarif \
--source-root "$GITHUB_WORKSPACE" \
--output "$SARIF_FILE"
echo "available=true" >> "$GITHUB_OUTPUT"
fi
- name: Upload SARIF
if: always() && steps.export-sarif.outputs.available == 'true'
uses: github/codeql-action/upload-sarif@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4
with:
sarif_file: ${{ runner.temp }}/codex-security.sarif
ref: refs/pull/${{ github.event.pull_request.number }}/head
sha: ${{ github.event.pull_request.head.sha }}
category: codex-security
- name: Preserve scan results
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: codex-security-results
path: |
${{ runner.temp }}/codex-security-results
${{ runner.temp }}/codex-security.json
if-no-files-found: warn
retention-days: 7İş akışı pull request'in head'ini checkout eder, merge base'ini hesaplar ve bu revizyonlar arasındaki commit edilmiş değişiklikleri tarar. Tam geçmiş, hedefin kesin olmasını sağlar. persist-credentials: false, depo token'ını checkout edilmiş Git yapılandırmasının dışında tutar. CLI'ın checkout'tan önce yüklenmesi ve mutlak yoluyla çalıştırılması, depo tarafından denetlenen yürütülebilir dosyaları tarama kimlik bilgisinden uzak tutar. --auth api-key, kapsamı sınırlandırılmış API key'i açıkça seçer. Tarama, geçmişini deponun dışındaki yazılabilir bir durum dizinine kaydeder.
--json stdout'a tek ve eksiksiz bir JSON belgesi yazar; böylece iş akışı bunu doğrudan kaydedebilir. İlerleme, tamamlanma özetleri ve hatalar stderr'de kalır. Bu davranış, JSON Lines olay akışı yayan codex exec --json davranışından farklıdır.
Dışa aktarma adımı tamamlanmış ve mühürlenmiş bir taramayı okur ve SARIF yazar. Codex çalışma zamanına ve kimlik bilgilerine dokunmaz. Tarama yapıtları güvenlik açığı içeren kaynak parçacıkları, kanıtlar ve düzeltme ayrıntıları içerebilir. Deponuza uygun erişim denetimleri ve kısa bir saklama süresi seçin.
GitLab CI/CD işlem hattını ekleme
GitLab Ultimate 19.2 veya üzeri sürümlerde GitLab, SARIF 2.1.0 raporlarını alabilir. İşlem hattını çalıştırmadan önce maskelenmiş ve gizlenmiş bir CODEX_SECURITY_API_KEY CI/CD değişkeni ekleyin.
Kök .gitlab-ci.yml dosyasına security aşamasını ve Codex Security işini ekleyin. Dosyadaki mevcut aşamaları ve işleri koruyun. Örnek, varsayılan olarak merge request değişikliklerini tarar. Varsayılan dalın tamamını da taramak için CODEX_SECURITY_FULL_SCAN_DEFAULT_BRANCH değerini "true" olarak ayarlayın:
variables:
CODEX_SECURITY_FULL_SCAN_DEFAULT_BRANCH: "false"
stages:
- test
- security
codex-security:
stage: security
image: node:26-bookworm-slim
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_SOURCE_PROJECT_ID == $CI_PROJECT_ID'
variables:
CODEX_SECURITY_SCAN_SCOPE: "diff"
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CODEX_SECURITY_FULL_SCAN_DEFAULT_BRANCH == "true"'
variables:
CODEX_SECURITY_SCAN_SCOPE: "full"
variables:
GIT_DEPTH: "0"
CODEX_SECURITY_CLI_DIR: "/tmp/codex-security-cli"
before_script:
- |
set -eu
apt-get update -qq
apt-get install -y -qq --no-install-recommends \
ca-certificates \
git \
python3 \
ripgrep
npm install \
--prefix "$CODEX_SECURITY_CLI_DIR" \
--ignore-scripts \
--no-audit \
--no-fund \
@openai/codex-security
export CODEX_SECURITY_BIN="$CODEX_SECURITY_CLI_DIR/node_modules/.bin/codex-security"
test -x "$CODEX_SECURITY_BIN"
"$CODEX_SECURITY_BIN" --version
script:
- |
set -eu
if test -z "${CODEX_SECURITY_API_KEY:-}"; then
echo "Set the CODEX_SECURITY_API_KEY CI/CD variable." >&2
exit 2
fi
codex_security_api_key="$CODEX_SECURITY_API_KEY"
unset CODEX_SECURITY_API_KEY
case "${CODEX_SECURITY_SCAN_SCOPE:-}" in
diff)
BASE_SHA="$CI_MERGE_REQUEST_DIFF_BASE_SHA"
HEAD_SHA="$CI_COMMIT_SHA"
BASE_REVISION="$(git merge-base "$BASE_SHA" "$HEAD_SHA")"
set -- --diff "$BASE_REVISION" --head "$HEAD_SHA"
echo "Scanning committed changes from $BASE_REVISION to $HEAD_SHA."
;;
full)
set -- --mode standard
echo "Scanning the complete default branch at $CI_COMMIT_SHA."
;;
*)
echo "Unsupported Codex Security scan scope: ${CODEX_SECURITY_SCAN_SCOPE:-unset}" >&2
exit 2
;;
esac
export CODEX_SECURITY_STATE_DIR="/tmp/codex-security-state-$CI_JOB_ID"
SCAN_DIR="/tmp/codex-security-results-$CI_JOB_ID"
JSON_FILE="/tmp/codex-security-$CI_JOB_ID.json"
SARIF_FILE="/tmp/codex-security-$CI_JOB_ID.sarif"
install -d -m 700 "$CODEX_SECURITY_STATE_DIR" "$SCAN_DIR"
set +e
OPENAI_API_KEY="$codex_security_api_key" \
"$CODEX_SECURITY_BIN" scan . \
"$@" \
--auth api-key \
--output-dir "$SCAN_DIR" \
--json > "$JSON_FILE"
scan_exit="$?"
set -e
unset codex_security_api_key
install -d -m 700 codex-security-artifacts/results
cp -R "$SCAN_DIR"/. codex-security-artifacts/results/
if test -s "$JSON_FILE"; then
cp "$JSON_FILE" codex-security-artifacts/codex-security.json
fi
printf '%s\n' "$scan_exit" > codex-security-artifacts/scan-exit-code.txt
export_exit=0
if test -f "$SCAN_DIR/scan-manifest.json"; then
set +e
"$CODEX_SECURITY_BIN" export "$SCAN_DIR" \
--export-format sarif \
--source-root "$CI_PROJECT_DIR" \
--output "$SARIF_FILE"
export_exit="$?"
set -e
if test -s "$SARIF_FILE"; then
cp "$SARIF_FILE" codex-security-artifacts/codex-security.sarif
fi
fi
if test "$scan_exit" -ne 0; then
exit "$scan_exit"
fi
exit "$export_exit"
artifacts:
when: always
access: maintainer
expire_in: 7 days
paths:
- codex-security-artifacts/
reports:
sarif: codex-security-artifacts/codex-security.sarifİş varsayılan olarak yalnızca aynı projedeki dallardan gelen merge request'ler için çalışır; böylece fork işlem hatları tarama kimlik bilgisini almaz. Varsayılan dalda standart bir tam tarama da çalıştırmak için grup, proje veya işlem hattı düzeyinde CODEX_SECURITY_FULL_SCAN_DEFAULT_BRANCH değerini "true" olarak ayarlayın. Tam taramalar, fark taramalarından daha uzun sürer ve daha maliyetlidir.
GIT_DEPTH: "0", merge request taramalarında CI_MERGE_REQUEST_DIFF_BASE_SHA ile CI_COMMIT_SHA üzerinden merge base'i hesaplamak için gereken geçmişi sağlar.
İş, CLI'ı /tmp altına yükler, mutlak yoluyla çalıştırır ve API key'i yalnızca tarama işlemine açar. artifacts: when: always tarama başarısız olduğunda SARIF raporunu korurken artifacts:access: maintainer ayrıntılı tarama sonuçlarına erişimi sınırlar.
.gitlab-ci.yml değişiklikleri CI/CD değişkenlerini açığa çıkarabilir; bu nedenle işi çalıştırmadan önce işlem hattı değişikliklerini inceleyin. CODEX_SECURITY_API_KEY değerini korumaya alırsanız, GitLab bunu yalnızca korumalı dallar arasındaki aynı proje merge request'lerinde ve kullanıcı hedef dala erişebildiğinde kullanılabilir kılar.
Önem derecesi politikası seçme
Her iki örnek de --fail-on-severity içermediğinden yalnızca raporlama yapar. Bulguların denetimi etkilemesine hazır olduğunuzda tarama komutuna bir eşik ekleyin:
"$CODEX_SECURITY_BIN" scan . \
--diff origin/main \
--output-dir /path/outside/repository/results \
--fail-on-severity highDesteklenen eşikler critical, high, medium ve low değerleridir. Eşik, o önem derecesindeki ve üzerindeki bulguları kapsar.
Tarama adımı şu çıkış kodlarını kullanır:
| Çıkış | Anlamı |
|---|---|
0 |
Tarama eksiksiz kapsamla tamamlandı ve yapılandırılmış tüm politikalar geçti. |
1 |
Tamamlanan tarama, eşik veya üzeri önem derecesinde bir bulgu içeriyor. |
2 |
CLI bir girdi ya da çalışma zamanı hatası buldu veya tamamlanan taramanın kapsamı eksik. |
130 |
Ctrl-C taramayı yarıda kesti. |
143 |
SIGTERM taramayı sonlandırdı. |
partial veya unknown kapsamlı bir tarama, önem derecesi politikası olmasa bile 2 döndürür. CLI yine de mevcut bulgularını ve kapsamı yazar. Denetimi kesin sonuç olarak kabul etmeden önce coverage.json içindeki ertelenmiş alanları inceleyin.
Mevcut sonuç diziniyle yeniden deneme
Her CI işi için yeni bir çalıştırıcı dizini kullanın. Kalıcı veya kendi barındırdığınız bir çalıştırıcıda önceki bir sonucu korumak için --archive-existing kullanın:
"$CODEX_SECURITY_BIN" scan . \
--diff origin/main \
--output-dir /path/outside/repository/results \
--archive-existingKomut önceki sonuçları arşivler ve boş bir tarama diziniyle başlar.
CI taramasında sorun giderme
- Bilinmeyen Git ref'i veya beklenmeyen fark: Base ve head geçmişini fetch edin, merge base'i hesaplayın ve iki revizyonu da açıkça iletin.
- Korumalı veya boş olmayan çıktı dizini: Kapsayan Git worktree'nin dışında özel bir dizin seçin. Dizin zaten sonuç içeriyorsa
--archive-existingkullanın. - Eksik kimlik bilgileri:
CODEX_SECURITY_API_KEYdeğerinin güvenilir iş akışı veya işlem hattı tarafından kullanılabildiğini ve doğrudan tarama işlemininOPENAI_API_KEYortam değişkenine eşlendiğini doğrulayın. - Tarama geçmişi hatası:
CODEX_SECURITY_STATE_DIRdeğerini deponun dışındaki yazılabilir bir dizine ayarlayın. - Python kurulum hatası: Çalıştırıcının Python 3.10 veya üzerini kullandığını doğrulayın.
- Eksik kapsam: Ertelenmiş yüzeyler ve açık sorular dâhil
coverage.jsondeğerini inceleyin, ardından uygun bir hedef veya ortamla yeniden çalıştırın. - SARIF dışa aktarma hatası: Taramanın tamamlandığını ve tam tarama dizininin kullanılabilir olduğunu doğrulayın. Dışa aktarma işlemi SARIF yazmadan önce mühürlenmiş yapıtları doğrular.
- SARIF yükleme hatası: GitHub Actions için kuruluşunuzun depoda GitHub Code Security'yi etkinleştirdiğini ve iş akışının
actions: read,contents: readvesecurity-events: writeizinlerini verdiğini doğrulayın. GitLab CI/CD için projenin GitLab Ultimate 19.2 veya üzerini kullandığını ve işinartifacts:reports:sarifüzerinden bir SARIF 2.1.0 dosyası yüklediğini doğrulayın.
Her komut, bayrak, yapıt ve çıktı alanı için CLI referansına bakın. Etkileşimli, eklenti tabanlı CI incelemesi için Kod değişikliklerini güvenlik açısından inceleme sayfasına bakın.