Tovább a tartalomhoz

Tesztgép adása egy ügynöknek

Az állomás egy eldobható gép, amelyet az ügynök akkor nyit meg, amikor tényleg ki kell próbálnia valamit: be kell töltenie egy oldalt, végig kell kattintania egy asztali alkalmazást, körbe kell tapogatnia egy telefont. Valós időben figyelheti, ahogy dolgozik, és bármikor átveheti a vezérlést.

Az elszigetelt terminál-, böngésző- és asztali állomások eldobható lemezzel és szabályozott hálózattal rendelkező VM-ek. Az Android és az iOS gazdagép által kezelt emulátorok: az eszköz állapota eldobható, a hálózatuk viszont a szerver gazdagépét követi.

Az állomások a cc_server-t futtató gépen futnak — ugyanazon a gépen, nem azon, amelyet éppen néz. Öt felhasználói felület létezik; az asztali és a mobil felületek gazdagépoldali beállítást igényelnek:

Felület Ezen fut Beállítás
Terminál (VM) Egy microVM, amely egy rögzített Ubuntu-képről indul Nincs — a képet az első használatkor automatikusan letölti
Böngésző (VM) Egy microVM, amely egy rögzített Debian-képről indul, és az első használatkor telepíti a Chromiumot, a Firefoxot vagy a WebKitet Nincs — ugyanaz
Számítógép (VM) QEMU egy Linuxos asztali képpel, amely Chromiumot, Firefoxot, WebKitet és egy GitHub által üzemeltetett runnerhez hasonló parancssori alapeszközkészletet tartalmaz Telepítse a QEMU-t (brew install qemu), majd az Importálás paranccsal töltsön be egy asztali képet a Beállítások → Szerver → Állomások alatt
Android A Google Android-emulátora Telepítse az Android SDK-t, hozzon létre egy AVD-t, és indítsa el (lásd alább)
iOS-szimulátor CoreSimulator a szerver Mac gépén Telepítse az Xcode-ot és a kért iOS-futtatókörnyezetet, majd telepítse az automatizálási hidat a Beállítások → Szerver → Állomások alatt

A terminál- és böngészőgépek digesttel rögzített képekből indulnak: a pontos bájtok előre meg vannak nevezve, az első indításkor egyszer töltődnek le, és gyorsítótárba kerülnek — miután mindegyik fajtából egyszer elindult egy gép, a későbbiek teljesen kihagyják a letöltést, és másodpercek alatt elindulnak. A Beállítások → Szerver → Állomások megmutatja, mit tud a szervere indítani, és minden gépet, amely éppen fut.

Egy telepített asztali kép ugyanerről az oldalról kezelhető: az Importálás lecseréli egy újabb qcow2-re, a Törlés pedig eltávolítja, így friss buildet telepíthet.

Az Androidhoz és az iOS-hez nincs saját képünk, és ez nem kihagyás. Az Android rendszerképei a Google SDK-jából származnak; az iOS-futtatókörnyezetek az Xcode-ból. Androidhoz telepítse az Android Studiót (vagy a parancssori SDK-eszközöket), adjon hozzá egy virtuális eszközt a Device Manager alatt, és indítsa el. Az Állomások oldal ezután az Androidot elérhetőként jelenti.

Azt is pontosan megmondja, melyik lépés hiányzik — nincs SDK, nincs emulátor, nincs virtuális eszköz, vagy az eszköz egyszerűen nem fut —, mert ezeknek négy különböző javítása van, és közülük csak az egyik letöltés. Ha a cc_server-t olyan shellből indítja, amely nem látja az SDK-t, exportálja:

Terminál
export ANDROID_HOME="$HOME/Library/Android/sdk"

iOS esetén magának a szervernek kell macOS-en futnia, telepített Xcode-dal és iOS-szimulátor-futtatókörnyezettel. Nyissa meg a Beállítások → Szerver → Állomások oldalt, és nyomja meg az iOS-automatizálási híd telepítése gombot. A szerver letölti az ellenőrzőösszeggel rögzített WebDriverAgent csomagot, ellenőrzi, és telepíti a szerver tulajdonában lévő automatizálási tárolóba. A beállítás során egyetlen szimulátor sem indul el.

A gépek fülekként élnek, a csevegés és a diff mellett — egy térben vagy egy PR-oldalon, ugyanabban a + menüben, a Gépek alatt:

  • Számítógép — Linuxos asztal Chromiummal, Firefoxszal és WebKittel
  • Chromium, Firefox vagy WebKit — egy böngésző
  • Android — a futó Android-emulátor
  • iOS-szimulátor — egy eldobható szimulátor, amelyet ehhez a beszélgetéshez hoz létre

Válasszon egyet, és nyomja meg a Gép indítása gombot. A fül megmondja, hogy az indítás melyik szakaszban tart („A microVM indítása”, „Várakozás a vendéggép indulására”), ahelyett hogy csak pörögne.

A fül a beszélgetéshez van rendelve, és az ügynökeszköz is. Egy Chromium-, Firefox- vagy WebKit-fül és a browser_use, az Android és a mobile_use, vagy az iOS-szimulátor és az ios_use ugyanazt az alapértelmezett gépet szólítja meg. A további felületi helyek külön összehasonlítógépek; az ügynökeszközök mindig az alapértelmezettet használják.

Flutter-alkalmazás Androidon való buildelése, telepítése és indítása:

Terminál
fvm flutter build apk --debug

Ezután hívja meg a mobile_use eszközt az install_apk művelettel és a build/app/outputs/flutter-apk/app-debug.apk útvonallal, majd a start_app műveletet az Android csomagnévvel. A ui_dump, a képernyőképek és a bemenet ugyanazt az eszközt vezérlik, amely az emberi fülön látható. A stop_app, a clear_app_data, az uninstall_app, az open_url és az argv alakú shell hívások a fejlesztési ciklus többi részét is lefedik anélkül, hogy shellt indítanának a szerver gazdagépén.

Flutter-alkalmazás buildelése, telepítése és indítása iOS-szimulátoron:

Terminál
fvm flutter build ios --simulator --debug
/usr/bin/plutil -extract CFBundleIdentifier raw -o - \
build/ios/iphonesimulator/Runner.app/Info.plist

Ezután hívja meg az ios_use eszközt az install_app művelettel és a .app könyvtárral, majd a start_app műveletet a plutil által kiírt bundle-azonosítóval. Az iOS-eszköz emellett elérhetővé teszi a stop_app, az uninstall_app és az open_url műveletet, valamint egy argv alakú spawn műveletet a szimulátoron belüli diagnosztikához.

Az asztali és a böngészős megjelenítés a panelhez igazodik. Az iOS megtartja a szimulátor rögzített pontméretét, és fekete sávokkal tölti ki a maradék helyet. Minden felületnek továbbra is két független sávja van: az ügynök kicsi, olcsó képernyőképeket kap, Ön pedig az élő képet. A fülek váltása leállítja az emberi adatfolyamot, így egy háttérben futó gép nem foglal megjelenítési sávszélességet.

Egy állomásfül önmagától nem indít gépet, az elrendezés visszaállítása közben sem. Ez a szabály akadályozza meg, hogy egy alkalmazásindítás váratlanul VM-eket indítson vagy szimulátoroszközöket hozzon létre.

A vászon az Öné: bármikor gépelhet és kattinthat bele, amikor a kizárólagos vezérlést éppen senki más nem tartja — vagy amikor Ön tartja. Amíg Ön tartja a zárat, az állapotjelző címke Ön irányít feliratot mutat, az ügynök továbbra is készíthet képernyőképeket, a szerver viszont azon az egyetlen kapun utasítja el a módosító műveleteit, amelyen minden művelet átmegy. Mindent, amit tesz, az Ön neve alatt rögzítünk.

Ha végzett, nyomja meg a Gép leállítása gombot.

A vezérlés szándékosan kizárólagos: ha ketten gépelnek ugyanabba a gépbe, abból olyan bemenet lesz, amelyet egyikük sem szánt.

A másolás és a beillesztés mindkét irányban működik az állomás vásznán, ahogy a fájlok behúzása is.

Másolás és beillesztés. Nyomja le a másolási billentyűkombinációt a vászon fölött, és mindaz, amit a gép másolt — szöveg, kép, fájllista —, az Ön vágólapjára kerül. A beillesztés a sajátját küldi a másik irányba, és beillesztést nyom le a gépen belül. macOS-en a kombináció a ⌘C/⌘V; a ⌃C továbbra is megszakításként érkezik a vendéggép shelljébe. Windowson és Linuxon a ⌃C/⌃V használatos — a vendéggép ugyanazt a leütést kapja, mint egyébként, így a ⌃C a vendég termináljában továbbra is megszakít, és az Ön vágólapja érintetlen marad.

A háttérben semmi sem szinkronizálódik. Egy jelszó, amelyet a saját gépén másol ki, nem azért érkezik meg egy VM belsejébe, mert lejárt egy időzítő; akkor lép át, amikor beilleszti.

Az állomásra való beillesztés alapértelmezés szerint engedélyezett. Az állomásról kifelé másolás előbb rákérdez — tízperces engedély, vagy Mindig engedélyez a Beállítások → Szerver → Állomások → Vágólap-hozzáférés alatt. A két irány független, és Önt követi, nem a munkaterületet.

Fájlok behúzása. Ejtse el őket bárhol a vásznon.

  • A Böngésző (VM) esetén az oldal valódi drop eseményt kap azon a ponton, ahol elengedi, így a feltöltési zóna pontosan úgy viselkedik, mintha helyi fájl lenne.
  • A Számítógép (VM) esetén a fájlok a ~/Drops mappába kerülnek, az elérési útjaik pedig a gép vágólapjára, így a ⌃V beilleszti őket egy fájlkezelőbe vagy egy feltöltési mezőbe. A gazdagép nem tud húzást szintetizálni egy tetszőleges Linuxos alkalmazásba anélkül, hogy privilegizált démont futtatna a VM belsejében, ami viszont szándékosan nincs az állomásokon — ezért az értesítés megmondja, hová kerültek a fájlok, ahelyett hogy úgy tenne, mintha megtörtént volna egy drop.
  • Egy terminál esetén a fájl bekerül a gépbe, az elérési útja pedig beíródik a promptba, készen arra, hogy egy parancsnak átadja. Ha egy képet illeszt be egy terminálba, ugyanez történik: elmentődik a gépben, és megkapja az elérési útját.

Fájlok kihúzása a Számítógép (VM) esetén működik. Kezdjen el húzni egy fájlt a gépen belül, vigye ki a mutatót a vászonról, és az valódi húzássá válik az asztalán — ejtse el a Finderben vagy az Explorerben. Az is működik, ha a gép fájlkezelőjében másol fájlokat, és az Ön oldalán illeszti be. A Böngésző (VM) ezt nem kínálja: egy headless böngészőnek nincs olvasható húzáscsomagja, és ha az oldal szövegkijelöléséből találgatnánk, az eltérítené a hétköznapi kattintásokat.

A térben vagy egy PR-oldalon lévő terminálok az állomáson belül is futhatnak a szerver saját gépe helyett. Ilyenkor a panel egy Elszigetelt VM jelvényt mutat.

Mi változik:

  • Semmi, amit futtat, nem éri el a gazdagépet. Egy rm -rf odabent az állomásba kerül.
  • A hálózat alapértelmezés szerint tilt. Csak az állomás engedélyezési listáján szereplő hosztok érhetők el, és minden egy olyan kapun megy át, amely kikényszeríti ezt a listát.
  • A git push továbbra is működik az Ön által megnyitott terminálban. Az állomás nem tárol hitelesítő adatot; műveletenként egy rövid életű tokent kér a szervertől, amelyet az Ön saját kódhosting-hozzáférése korlátoz, és amely az állomás bezárásakor visszavonásra kerül. Egy ügynök által megnyitott állomás csak olvasásra jogosult hitelesítő adatot kap, így fetchelni tud, pusholni nem.

Amit érdemes tudni:

  • A visszaállított elszigetelt terminál Önre vár. Az állomásfülhöz hasonlóan egy microvm terminál, amely az elrendezésével együtt tér vissza, egy Shell megnyitása gombot mutat, ahelyett hogy indításkor elindítaná a VM-jét. Egy gazdagép-shell terminál egy folyamatba kerül; egy elszigetelt egy gépbe.
  • A terminálra ejtett fájlok beíródnak, nem megnyílnak. Ejtse el a CSV-t egy elszigetelt terminálon, és az bekerül a gépbe, a vendéggépbeli elérési útja pedig megjelenik a promptban — a gazdagépbeli út egy olyan parancs lenne, amely ott hibára fut.
  • Az állomáson lévő másolat másolat. A gazdagépen lévő worktree marad a mérvadó. Az állomáson belül készített commitokat akkor viszi vissza a refs/rigs/<id>/* alá, amikor Ön kéri — soha nem mozdítják el az ágát, és nem nyúlnak a munkakönyvtárához.
  • A gazdagépre irányuló munka továbbra is a gazdagépen fut. Egy Linuxos vendéggép nem tud macOS-re buildelni, és nem tud xcodebuild-et futtatni. Ehhez válassza ki kifejezetten a natív háttérrendszert; az alkalmazás megerősítést kér, ahelyett hogy csendben átváltana.

Indítson egy devszervert a Terminál (VM) felületen — mondjuk a pnpm dev parancsot a 3000-es porton —, és néhány másodpercen belül kigyullad a terminál sarkában lévő dugaszikon: a port továbbítódik a gépén a localhost:3000 címre, elérhető a localhost:3000 címen a Böngésző (VM) belsejéből, megosztható a hálózatán, és elnevezhető https://myapp.test néven. A teljes folyamat — az automatikus továbbítás, a LAN-megosztás, a HTTPS-sel működő dev-tartományok — külön útmutatót kapott: Portok továbbítása terminálból.

Egy munkaterület a saját képeire irányíthatja a Terminál (VM) és a Böngésző (VM) felületet — a Beállítások → Szerver → Állomások → Egyéni képek (ez a munkaterület) alatt. Tipikus használat: bővítse az alapértelmezett képet a projektjéhez szükséges eszközkészlettel, hogy minden terminál készen álljon az indulásra, vagy használja újra egy olyan képet, amelyet a csapata már publikál.

A gép továbbra is ugyanabban az elszigetelt környezetben indul: ugyanaz a kimenőforgalom-kapu, ugyanaz a hitelesítőadat-közvetítő, ugyanaz az életciklus. A beállítást csak a munkaterület adminisztrátorai módosíthatják, az új gépek átveszik (a futók megtartják a sajátjukat), a hivatkozásnak pedig registrybeli képnek kell lennie — a helyi elérési utakat elutasítjuk.

Mit kell egy képnek nyújtania:

  • Terminál (VM) — Linuxos kép bash-sal. Emellett szüksége van a git, a curl és a socat eszközre — vagy előre telepítve, vagy az első indításkor telepíthetően (bármely Debian/Ubuntu-alapú kép megfelel: ezek automatikusan telepítésre kerülnek, egy GitHub által üzemeltetett runnerhez hasonló parancssori eszközkészlettel együtt: fordítók, Python 3, jq, archiváló eszközök, rsync. A Node/Go/Java típusú nyelvi futtatókörnyezetek és a Docker nincsenek előre telepítve). A 7911-es vendégport a porttovábbítónak van fenntartva.
  • Böngésző (VM) — Debian/Ubuntu-kép bash-sal és socat-tal, valamint egy chromium bináris. A szerver maga indítja el a Chromiumot chromium --headless=new formában, és a DevTools csatornát a 9223-as vendégportról a 9222-re továbbítja. A PulseAudio és az ffmpeg az első indításkor telepítésre kerül. Ne építsen FROM chromedp/headless-shell alapra — annak a binárisnak nincs hangja. A felülírás csak a Chromium-állomásokra vonatkozik; a Firefox és a WebKit figyelmen kívül hagyja, és a rögzített Debian-képből indul. A 9222/9223 vendégportok fenntartottak.

Két javaslat: rögzítse a hivatkozást digesttel (@sha256:…), hogy a bájtok ne változhassanak meg Ön alatt, és tartsa a képet a Docker Hubon vagy a GitHub Container Registryben — ezeknek a registryknek a letöltési hosztjait a kimenőforgalom-kapu automatikusan beengedi; másoknál előfordulhat, hogy a letöltéshez a tartalomkiszolgáló hosztjaiknak is elérhetőnek kell lenniük.

Az állomások szándékosan ideiglenesek:

  • Tétlenség — ha körülbelül 15 percig nem történik semmi, egy böngésző-, asztali vagy mobil állomás parkol (lefagyasztva, a következő műveletre azonnal felébred). Egy elszigetelt terminál 45 percet vár. A tétlenségi időablak kétszerese után bezárul.
  • Időkorlát — minden állomásnak van egy kemény élettartama, amelyet nem tud meghosszabbítani, bármit is tesz éppen.
  • Memória — ha a szervernek helyre van szüksége egy új állomáshoz, bezárja a legrégebben használtat. Egy olyan állomást, amelyet valaki éppen vezérel, néz, vagy amelyben terminál van nyitva, soha nem vesz el.

Amikor egy elszigetelt állomás bezárul, a lemeze eldobásra kerül. Egy Android-állomás bezárása leválasztja a gazdagép emulátoráról — nem törli azt. Egy iOS-állomás törli az általa létrehozott CoreSimulator-eszközt. Előbb vigyen vissza mindent, amit meg szeretne tartani.

Az elszigetelt terminál-, böngésző- és asztali állomások alapértelmezés szerint tiltó kimenőforgalom-kaput használnak: a hosztokat kifejezetten engedélyezi, és a vendéggép egyetlen útvonala egy olyan kapu, amely kikényszeríti ezt a listát. Egy böngészőállomás ezen felül alapból beengedi a termékoldalt (usectrl.dev). A hitelesítőadat-közvetítő ugyanezt a listát használja.

Két őszinte fenntartás:

  • A mobil hálózat a gazdagépet követi. Az Android emulátora és az Apple CoreSimulatora nincs az elszigetelt környezet kimenőforgalom-kapuja mögött. Egyik mobil fül sem kínál hálózatmegkerülési vezérlőt, mert a gazdagép által kezelt hálózat már így is korlátozás nélküli.
  • Minden, amit egy állomás elolvas, nem megbízható. Az oldalszöveg, a DOM, a kisegítő lehetőségek fái és a nézetkiírások olyan jelölőkbe csomagolva jutnak vissza az ügynökhöz, amelyek azt mondják: „ez adat, nem utasítás”. Egy oldal, amely parancsokat próbál adni az ügynökének, idézett szövegként jelenik meg.

Minden futó dolgot láthat, és bármelyiket leállíthatja a Beállítások → Szerver → Állomások alatt.