Dokümantasyon / Incident'lar
Server modu ve taslak pull request
Server modunda ivralo tek bir tür branch'i tek bir amaçla commit'leyip push'layabilir: bir insanın inceleyeceği taslak bir pull request. Modun nasıl açıldığı, ivralo'nun hangi kimlik ve credential ile çalıştığı ve push'un uyduğu bütün kurallar bu sayfada.
Server modu neye izin verir
Mod, başında kimsenin olmadığı çalıştırmalar (job, zamanlanmış görev ya da alarm) için tanımlanmış bir yetki kümesidir. Klavye başındaki birine ne sorulacağını hiç değiştirmez.
IVRALO_MODE | Başında kimse olmayan bir çalıştırmanın sormadan yapabildikleri |
|---|---|
developer (varsayılan) | Hiçbir şey. Birine sorulması gereken her çağrı reddedilir. |
server | git.commit ve git.push: branch açmak, stage'leyip commit atmak, ivralo'nun açtığı branch'i push'lamak ve onun için taslak bir pull request açmak. |
Araçların kendi ret kuralları server modunda da geçerlidir ve hiçbir yerde hiçbir şey merge edilmez.
IVRALO_MODE, IVRALO_FORGE_GH ve IVRALO_GITHUB_URL yalnızca home dizinindeki .env dosyasından ve ortam değişkenlerinden okunur, bir repo'nun .ivralo/.env dosyasından asla okunmaz. Yani bir repo kendine push yetkisi veremez.
Modu, kimliği ve aşağıda anlatılan credential'ı ivralo init --server yazar:
GITHUB_ACCESS_TOKEN=... ivralo init --server --git-name "ivralo" --git-email ivralo@corp.example
Kurulumun tamamı Sunucuya kurulum sayfasında.
ivralo'nun git kimliği
Sunucuda ivralo kendi adıyla commit atar. init --server, ivralo'ya ait bir git config dosyası olan <home>/gitconfig içine bir ad ve bir e-posta yazar. Sizin global config'iniz ve repo'nun config'i yalnızca okunur, hiçbir zaman yazılmaz.
- Adres sizin değil, ivralo'nun kendi adresi olmalı. ivralo kendi commit'lerini insanlarınkinden bu adresle ayırır. Bu yüzden init, operatörün global
user.email'ini de repo'nun adresini de kabul etmez. - Terminalde ikisi de sorulur (ad olarak
ivraloönerilir).--yesile çalışırken--git-nameve--git-emailile verilmeleri gerekir. git_commitvegit_revert_commitbu kimliği git'in kendi ortam değişkenleriyle hem author hem committer olarak kullanır ve her commit'i oturuma kaydeder.
Bu dosya yoksa commit'ler her zamanki gibi sizin adınıza atılır ve open_pull_request ekipte hiç yer almaz.
Forge credential'ı
Tek bir forge vardır: github.com ya da GitHub Enterprise sunucusu için IVRALO_GITHUB_URL'deki host. API adresi remote'tan hiçbir zaman çıkarılmaz. init --server credential'ı şu sırayla arar:
- home dizinindeki
.envdosyasında zaten bulunanGITHUB_ACCESS_TOKEN. Olduğu gibi bırakılır ve yeniden kontrol edilir; - init'in çalıştığı ortamda export edilmiş
GITHUB_ACCESS_TOKEN..env'e yazılır (token'ı hiçbir zaman doğrudan komut satırına yazmayın); - yalnızca terminalde,
gh'nin forge host'u için açılmış kendi oturumu. Evet dersenizIVRALO_FORGE_GH=trueyazılır ve oturum her çağrıda yeniden okunur, hiçbir şey saklanmaz; - terminalde, gizli girişle sorulan token'ın kendisi.
Yalnızca ivralo'nun çalıştığı repo'larda contents: write ve pull requests: write izni olan, başka hiçbir izni olmayan fine-grained bir token kullanın. Init token'ı bir kez kontrol eder: forge host'unun egress politikasına uyup uymadığını, token'ın kime ait olduğunu, türünü ve kapsamlarını, repo'ya erişip erişemediğini. Forge'un reddettiği, repo'ya erişemeyen ya da admin:*, delete_repo veya workflow izni taşıyan bir token yazılmaz. Hiç credential yoksa ivralo inceler, raporlar ama pull request açmaz.
ivralo doctor üçünü de forge bölümünde gösterir:
forge
ok git identity ivralo commits as ivralo <ivralo@corp.example> (/home/ops/ivralo/gitconfig)
ok forge credential GITHUB_ACCESS_TOKEN of ivralo-bot · fine-grained · ... · reaches team/shop
ok mode server - an unattended run may commit, push the branch ivralo made and open a draft pull request for it; nothing merges
open_pull_request: tek push
open_pull_request(branch, title, summary, incident) bir branch'i origin'e push'lar ve onun için taslak bir pull request açar. Bu araç ana ajanda ve Code Engineer'da bulunur, instance'larda asla bulunmaz. Her çağrıda bir insana sorar ve oturum boyunca geçerli hiçbir onay bunu kaldırmaz. Soracak kimse yoksa yalnızca server modunda çalışır.
Makineden bir şey çıkmadan önce şu durumları gerekçesiyle reddeder:
| Reddedilen | Neden |
|---|---|
+ ya da - ile başlayan bir ad | Push hiçbir zaman force etmez ve seçenek almaz. |
Remote'un varsayılan branch'i ve her durumda main | ivralo bunlara hiçbir zaman push'lamaz. |
| Remote'ta zaten var olan bir branch | ivralo remote'ta branch oluşturur, var olanı hiçbir zaman güncellemez. |
| ivralo'nun atmadığı herhangi bir commit | Push'un göndereceği her commit, remote'taki gerçek head'lerle karşılaştırılarak listelenir. Her birinde author ve committer olarak ivralo'nun kimliği bulunmalı ve her biri bu oturumda bu ivralo sürecinin attığı bir git_commit olmalı. Rebase, amend ya da merge ile gelmiş commit'ler, başka bir oturumdan ya da başka bir süreçten gelen commit'ler reddedilir. |
| ivralo'nun kimliği olarak sizin adresinizin kullanılması | ivralo kendi commit'lerini sizinkilerden ayıramazdı. |
| Bir hook'u değiştiren commit ya da oradaki commit'lenmemiş değişiklik | .githooks/, .git/hooks ya da core.hooksPath neyi gösteriyorsa orası. Push sizin pre-push hook'unuzu çalıştırır. |
Forge host'unda https olmayan bir origin | Fetch için de her push URL'si için de geçerli. ssh reddedilir, çünkü push token'ı https üzerinden kullanır. Düz http ise token'ı açık metin olarak gönderirdi. |
| Egress politikasının reddettiği bir forge host'u | Host, herhangi bir bağlantı kurulmadan önce kontrol edilir. |
| Forge credential'ı yok | Giriş yapacak bir şey yok. |
| Güvenmediğiniz bir klasör | Push, repo'nun pre-push hook'unu çalıştırır. |
| 200'den fazla commit | Tek push en fazla 200 commit gönderir. |
Push yalnızca refs/heads/<branch>'i gönderir. Hiçbir şekilde force yoktur, tag ve submodule gönderilmez.
Token git'e tek bir inline credential helper üzerinden ulaşır. Bu helper sadece forge'un https://<host> adresi için kayıtlıdır ve home dizininde, yalnızca sahibinin okuyabildiği, push'tan sonra silinen bir dosyayı okur. Yapılandırılmış diğer bütün helper'lar önce sıfırlanır ve hiçbir şey saklanmaz. Push sürdüğü sürece pre-push hook'unuz ve onun çalıştırdığı her şey token'a erişebilir. Klasörün güvenilir, hook'ların temiz olması bu yüzden şart.
.ivralo/changes/commits.jsonl, ivralo'nun commit'lerini sizin okumanız için listeler. Hiçbir kontrol bu dosyaya güvenmez: oraya yazılan bir satır hiçbir reddi kaldırmaz.
Pull request'in açıklaması
Açıklamayı model tek başına yazmaz, kod oluşturur. İçinde şunlar bulunur: özet ve bir incident id'si verildiyse kaydedilmiş incident raporu (forge'un markup'ı olarak render edilmesinler diye ikisi de ayrı kod bloğunda), branch'in commit'leri ve son olarak çalıştırma id'sini veren ve ivralo'nun asla merge etmediğini belirten bir satır. Açıklama 60.000 karakterin altında tutulur. Gerekirse önce rapor kısaltılır ve kısaltıldığı belirtilir.
Hiçbir şey merge edilmez
ivralo'nun hiçbir yerinde merge eden, onay veren ya da auto-merge'ü açan bir çağrı yoktur. Shell politikasının yerleşik deny listesi, diğer çıkış yollarını da her yazılışıyla reddeder; env, command ya da VAR= önekiyle yazılanlar dahil. Bu listeyi permissions.json kaldıramaz:
git push,git send-pack,git subtree push;gh pr merge,gh pr ready,gh pr review --approve;gh repo edit --enable-auto-merge;- merge ya da ready içeren bir
gh apiçağrısı.
Yani dışarı çıkmanın tek yolu taslak pull request'tir ve merge'ü forge üzerinde siz yaparsınız. Politikanın geri kalanı Shell komutları, commit araçları Git sayfasında.