Berikan ejen mesin untuk diuji
Sebuah stesen ialah mesin pakai buang yang dibuka oleh ejen apabila ia benar-benar perlu mencuba sesuatu: memuatkan halaman, mengklik melalui aplikasi desktop, mengetuk-ngetuk telefon. Anda boleh menontonnya bekerja secara masa nyata, dan mengambil kawalan pada bila-bila masa anda mahu.
Stesen terminal, penyemak imbas dan desktop yang terasing ialah VM dengan cakera pakai buang dan rangkaian berpintu. Android dan iOS ialah emulator yang diuruskan hos: keadaan peranti mereka pakai buang, tetapi rangkaian mereka mengikut hos pelayan.
Sediakannya sekali
Bahagian bertajuk “Sediakannya sekali”Stesen berjalan pada mesin yang menghoskan cc_server — mesin yang sama, bukan
mesin yang anda sedang lihat. Terdapat lima permukaan yang dilihat pengguna;
permukaan desktop dan mudah alih memerlukan persediaan hos:
| Permukaan | Berjalan pada | Persediaan |
|---|---|---|
| Terminal (VM) | microVM yang membot imej Ubuntu yang dipinkan | Tiada — imej itu diambil secara automatik pada penggunaan pertama |
| Penyemak imbas (VM) | microVM yang membot imej Debian yang dipinkan dengan Chromium, Firefox atau WebKit dipasang pada penggunaan pertama | Tiada — sama |
| Komputer (VM) | QEMU dengan imej desktop Linux yang menyertakan Chromium, Firefox, WebKit dan garis dasar CLI runner yang dihoskan GitHub | Pasang QEMU (brew install qemu), kemudian Import imej desktop di bawah Tetapan → Pelayan → Stesen |
| Android | Emulator Android daripada Google | Pasang SDK Android, cipta AVD dan mulakannya (di bawah) |
| Simulator iOS | CoreSimulator pada Mac pelayan | Pasang Xcode dan runtime iOS yang diminta, kemudian pasang jambatan automasi di bawah Tetapan → Pelayan → Stesen |
Mesin terminal dan penyemak imbas membot daripada imej yang dipinkan mengikut digest: bait yang tepat dinamakan terlebih dahulu, diambil sekali pada but pertama, dan dicache — selepas but pertama bagi setiap jenis, mesin seterusnya melangkau muat turun sepenuhnya dan hidup dalam beberapa saat. Tetapan → Pelayan → Stesen menunjukkan apa yang boleh dibot oleh pelayan anda dan setiap mesin yang sedang berjalan sekarang.
Imej desktop yang telah dipasang kekal boleh diurus dari halaman yang sama: Import menggantikannya dengan qcow2 yang lebih baharu, dan Padam mengalih keluarnya supaya anda boleh memasang binaan yang segar.
Peranti mudah alih disediakan secara berbeza
Bahagian bertajuk “Peranti mudah alih disediakan secara berbeza”Tiada imej daripada kami untuk Android atau iOS, dan itu bukan satu peninggalan. Imej sistem Android datang daripada SDK Google; runtime iOS datang daripada Xcode. Untuk Android, pasang Android Studio (atau alat SDK baris perintah), tambah peranti maya dalam Device Manager, dan mulakannya. Halaman Stesen kemudian melaporkan Android sebagai tersedia.
Ia juga memberitahu anda dengan tepat langkah mana yang anda terlepas — tiada
SDK, tiada emulator, tiada peranti maya, atau peranti yang sememangnya tidak
berjalan — kerana keempat-empatnya mempunyai pembaikan yang berbeza dan hanya
satu daripadanya melibatkan muat turun. Jika anda memulakan cc_server daripada
shell yang tidak nampak SDK, eksportkannya:
export ANDROID_HOME="$HOME/Library/Android/sdk"Untuk iOS, pelayan itu sendiri mesti berjalan pada macOS dengan Xcode dan runtime Simulator iOS dipasang. Buka Tetapan → Pelayan → Stesen dan tekan Pasang jambatan automasi iOS. Pelayan mengambil artifak WebDriverAgent yang dipinkan mengikut checksum, mengesahkannya, dan memasangnya ke dalam stor automasi milik pelayan. Tiada simulator dibot semasa persediaan.
Buka mesin
Bahagian bertajuk “Buka mesin”Mesin wujud sebagai tab, bersebelahan sembang dan diff — dalam sesuatu ruang
atau pada halaman PR, dalam menu + yang sama, di bawah Mesin:
- Komputer — desktop Linux dengan Chromium, Firefox dan WebKit
- Chromium, Firefox atau WebKit — penyemak imbas
- Android — emulator Android yang sedang berjalan
- Simulator iOS — simulator pakai buang yang dicipta untuk perbualan ini
Pilih satu dan tekan Mulakan mesin. Tab itu menyatakan peringkat but yang sedang berlaku (“Memulakan microVM”, “Menunggu tetamu bangun”) dan bukan sekadar berputar.
Tab itu berskop kepada perbualan, begitu juga alat ejen. Tab Chromium, Firefox
atau WebKit dan browser_use, Android dan mobile_use, atau Simulator iOS dan
ios_use menujukan mesin lalai yang sama. Slot UI tambahan ialah mesin
perbandingan yang berasingan; alat ejen sentiasa menggunakan yang lalai.
Untuk membina, memasang dan memulakan aplikasi Flutter pada Android:
fvm flutter build apk --debugKemudian panggil mobile_use dengan install_apk dan
build/app/outputs/flutter-apk/app-debug.apk, diikuti oleh start_app dan nama
pakej Android. ui_dump, tangkap layar dan input memandu peranti yang sama
seperti yang ditunjukkan dalam tab manusia. stop_app, clear_app_data,
uninstall_app, open_url, dan panggilan shell berbentuk argv meliputi
seluruh kitaran pembangunan yang lain tanpa memanggil shell pada hos pelayan.
Untuk membina, memasang dan memulakan aplikasi Flutter pada Simulator iOS:
fvm flutter build ios --simulator --debug/usr/bin/plutil -extract CFBundleIdentifier raw -o - \ build/ios/iphonesimulator/Runner.app/Info.plistKemudian panggil ios_use dengan install_app dan direktori .app, diikuti
oleh start_app dan pengecam bundel yang dicetak oleh plutil.
Alat iOS juga mendedahkan stop_app, uninstall_app, open_url, dan tindakan
spawn berbentuk argv untuk diagnostik setempat simulator.
Paparan desktop dan penyemak imbas berubah saiz mengikut panel. iOS mengekalkan saiz titik tetap simulator dan memaparkannya dengan jalur hitam di sekelilingnya. Setiap permukaan tetap mempunyai dua lorong yang bebas: ejen mendapat tangkap layar yang kecil dan murah manakala anda mendapat paparan langsung. Menukar tab menghentikan strim manusia supaya mesin latar belakang tidak memakan lebar jalur paparan.
Tab stesen tidak memulakan mesin dengan sendirinya, termasuk semasa pemulihan susun atur. Peraturan itu menghalang pelancaran aplikasi daripada membot VM atau mencipta peranti simulator secara tidak dijangka.
Pandu mesin
Bahagian bertajuk “Pandu mesin”Kanvas itu milik anda untuk menaip dan mengklik selagi tiada orang lain memegang kawalan eksklusif — atau apabila anda yang memegangnya. Semasa anda memegang kunci itu, teg status dipaparkan Anda mempunyai kawalan, ejen masih boleh mengambil tangkap layar, dan pelayan menolak tindakan yang mengubah keadaan pada satu titik sesak yang dilalui setiap tindakan. Segala yang anda lakukan direkodkan atas nama anda.
Tekan Hentikan mesin apabila anda selesai.
Kawalan bersifat eksklusif dengan sengaja: dua pelaku yang menaip ke dalam satu mesin menghasilkan input yang tidak dimaksudkan oleh mana-mana pihak.
Pindahkan sesuatu masuk dan keluar
Bahagian bertajuk “Pindahkan sesuatu masuk dan keluar”Salin dan tampal berfungsi dalam kedua-dua arah merentas kanvas stesen, begitu juga menyeret fail.
Salin dan tampal. Tekan kord salin di atas kanvas dan apa sahaja yang disalin oleh mesin itu — teks, imej, senarai fail — akan masuk ke papan klip anda. Tampal menghantar kandungan anda ke arah sebaliknya dan menekan tampal di dalam mesin. Pada macOS kordnya ialah ⌘C/⌘V; ⌃C masih sampai ke shell tetamu sebagai isyarat gangguan. Pada Windows dan Linux gunakan ⌃C/⌃V — tetamu menerima ketukan kekunci yang sama seperti biasa, jadi ⌃C dalam terminal tetamu tetap mengganggu dan papan klip anda sendiri tidak disentuh.
Tiada apa-apa disegerakkan di latar belakang. Kata laluan yang anda salin pada mesin anda sendiri tidak akan tiba di dalam VM kerana pemasa tercetus; ia melintas apabila anda menampal.
Tampal ke dalam stesen dibenarkan secara lalai. Salin keluar daripada stesen akan bertanya dahulu — kebenaran sepuluh minit, atau Sentiasa benarkan di bawah Tetapan → Pelayan → Stesen → Akses papan klip. Kedua-dua arah itu bebas, dan ia mengikut anda, bukan ruang kerja.
Seret fail masuk. Lepaskan fail di mana-mana pada kanvas.
- Pada Penyemak imbas (VM), halaman menerima lepasan yang sebenar pada titik anda melepaskannya, jadi zon muat naik berkelakuan tepat seperti dengan fail setempat.
- Pada Komputer (VM), fail masuk ke
~/Dropsdan laluannya diletakkan pada papan klip mesin itu, jadi ⌃V menampalnya ke dalam pengurus fail atau medan muat naik. Hos tidak boleh mensintesis seretan ke dalam aplikasi Linux sewenang-wenangnya tanpa menjalankan daemon istimewa di dalam VM, yang sengaja tidak dimiliki oleh stesen — jadi toast memberitahu anda ke mana fail itu pergi dan bukan berpura-pura lepasan berlaku. - Pada terminal, fail disalin masuk dan laluannya ditaip pada prompt, sedia untuk diberikan kepada sesuatu perintah. Menampal imej ke dalam terminal melakukan perkara yang sama: ia disimpan dalam mesin dan anda mendapat laluannya.
Seret fail keluar berfungsi daripada Komputer (VM). Mulakan seretan fail di dalam mesin, bawa penunjuk keluar dari kanvas, dan ia menjadi seretan sebenar pada desktop anda — lepaskannya dalam Finder atau Explorer. Menyalin fail dalam pengurus fail mesin dan menampalnya di pihak anda juga berfungsi. Penyemak imbas (VM) tidak menawarkan ini: penyemak imbas tanpa kepala tiada muatan seretan untuk dibaca, dan meneka daripada pemilihan teks halaman akan merampas klik biasa.
Terminal di dalam stesen
Bahagian bertajuk “Terminal di dalam stesen”Terminal dalam sesuatu ruang atau pada halaman PR boleh berjalan di dalam stesen dan bukan pada mesin pelayan itu sendiri. Apabila ia berbuat demikian, panel memaparkan lencana VM terasing.
Apa yang berubah:
- Tiada apa yang anda jalankan sampai ke hos.
rm -rfdi dalamnya menyebabkan anda kehilangan stesen itu. - Rangkaian ditolak secara lalai. Hanya hos dalam senarai kebenaran stesen boleh dicapai, dan segala-galanya melalui pintu yang menguatkuasakannya.
git pushmasih berfungsi dalam terminal yang anda buka. Stesen tidak menyimpan kelayakan; ia meminta token berjangka pendek daripada pelayan bagi setiap operasi, dibatasi oleh akses hos kod anda sendiri, dan token itu dibatalkan apabila stesen ditutup. Stesen yang dibuka oleh ejen mendapat kelayakan baca sahaja, jadi ia boleh fetch tetapi tidak boleh push.
Apa yang perlu diketahui:
- Terminal terasing yang dipulihkan menunggu anda. Seperti tab stesen,
terminal
microvmyang kembali bersama susun atur anda memaparkan butang Buka shell dan bukan membot VM-nya semasa pelancaran. Terminal shell hos hanya menelan satu proses; terminal terasing menelan satu mesin. - Fail yang dilepaskan pada terminal ditaip, bukan dibuka. Lepaskan CSV pada terminal terasing dan fail itu disalin ke dalam mesin serta laluan tetamunya muncul pada prompt — laluan hos akan menjadi perintah yang gagal di situ.
- Salinan dalam stesen hanyalah salinan. Worktree anda pada hos kekal sebagai
sumber kebenaran. Komit yang anda buat di dalam stesen dibawa kembali ke
refs/rigs/<id>/*apabila anda memintanya — ia tidak pernah menggerakkan cabang anda atau menyentuh pokok kerja anda. - Kerja yang menyasarkan hos tetap berjalan pada hos. Tetamu Linux tidak
boleh membina untuk macOS atau menjalankan
xcodebuild. Pilih bahagian belakang natif secara eksplisit untuk itu; aplikasi akan meminta anda mengesahkannya dan bukan bertukar secara senyap.
Jalankan pelayan dev dalam Terminal (VM) — katakan pnpm dev pada port 3000 —
dan dalam beberapa saat ikon palam di penjuru terminal menyala: port itu
dimajukan ke localhost:3000 pada mesin anda, boleh dicapai pada
localhost:3000 di dalam Penyemak imbas (VM), boleh dikongsi pada rangkaian
anda, dan boleh dinamakan sebagai https://myapp.test. Keseluruhan aliran itu —
pemajuan automatik, perkongsian LAN, domain dev dengan HTTPS — mempunyai
panduannya sendiri:
Majukan port dari terminal.
Imej tersuai
Bahagian bertajuk “Imej tersuai”Sesuatu ruang kerja boleh menujukan Terminal (VM) dan Penyemak imbas (VM) kepada imejnya sendiri — di bawah Tetapan → Pelayan → Stesen → Imej tersuai (ruang kerja ini). Kegunaan biasa: menambah imej lalai dengan rantai alat yang diperlukan oleh projek anda supaya setiap terminal bermula dalam keadaan sedia, atau menggunakan semula imej yang sudah diterbitkan oleh pasukan anda.
Mesin itu tetap dibot di dalam persekitaran terasing yang sama: pintu keluar yang sama, broker kelayakan yang sama, kitaran hayat yang sama. Hanya pentadbir ruang kerja boleh mengubah tetapan itu, mesin baharu akan menggunakannya (mesin yang sedang berjalan kekal dengan imejnya), dan rujukannya mesti imej registri — laluan setempat ditolak.
Apa yang perlu disediakan oleh sesuatu imej:
- Terminal (VM) — imej Linux dengan
bash. Ia juga memerlukangit,curldansocat— sama ada telah dipasang, atau boleh dipasang pada permulaan pertama (mana-mana imej berasaskan Debian/Ubuntu berfungsi: ia dipasang secara automatik, bersama set alat CLI gaya runner yang dihoskan GitHub: pengkompil, Python 3,jq, alat arkib,rsync. Runtime bahasa seperti Node/Go/Java dan Docker tidak dipasang terlebih dahulu). Port tetamu7911dikhaskan untuk pemaju port. - Penyemak imbas (VM) — imej Debian/Ubuntu dengan
bashdansocat, serta binarichromium. Pelayan memulakan Chromium sendiri sebagaichromium --headless=newdan menyampaikan semula DevTools daripada tetamu9223ke9222. PulseAudio dan ffmpeg dipasang pada permulaan pertama. Jangan binaFROM chromedp/headless-shell— binari itu tiada audio. Penggantian itu terpakai untuk stesen Chromium sahaja; Firefox dan WebKit mengabaikannya dan membot imej Debian yang dipinkan. Port tetamu9222/9223dikhaskan.
Dua saranan: pinkan rujukan itu mengikut digest (@sha256:…) supaya baitnya
tidak berubah tanpa anda sedar, dan hoskannya pada Docker Hub atau GitHub Container
Registry — hos muat turun registri itu diterima masuk melalui pintu keluar
secara automatik; yang lain mungkin memerlukan hos penghantaran kandungannya
boleh dicapai untuk menariknya.
Apabila stesen hilang
Bahagian bertajuk “Apabila stesen hilang”Stesen memang bertujuan sementara:
- Melahu — selepas ~15 minit tanpa apa-apa berlaku, stesen penyemak imbas, desktop atau mudah alih diparkirkan (dibekukan, bangun serta-merta pada tindakan seterusnya). Terminal terasing menunggu 45 minit. Selepas dua kali tetingkap melahu, ia ditutup.
- Had masa — setiap stesen mempunyai jangka hayat keras yang tidak boleh dilanjutkannya, apa sahaja yang sedang dilakukannya.
- Memori — jika pelayan memerlukan ruang untuk stesen baharu, ia menutup stesen yang paling lama tidak digunakan. Stesen yang sedang dipandu, ditonton, atau mempunyai terminal terbuka di dalamnya tidak pernah diambil.
Apabila stesen terasing ditutup, cakeranya dibuang. Menutup stesen Android memutuskan sambungan daripada emulator hos — ia tidak memadamkannya. Stesen iOS memadamkan peranti CoreSimulator yang diciptakannya. Bawa balik apa sahaja yang anda mahu simpan terlebih dahulu.
Apa yang boleh dicapai oleh stesen
Bahagian bertajuk “Apa yang boleh dicapai oleh stesen”Stesen terminal, penyemak imbas dan desktop terasing lalai kepada pintu keluar
yang menolak secara lalai: anda memberikan kebenaran hos secara eksplisit, dan
satu-satunya laluan tetamu ialah pintu yang menguatkuasakan senarai itu. Stesen
penyemak imbas juga menerima masuk tapak produk (usectrl.dev) secara terbuka.
Broker kelayakan menggunakan senarai yang sama.
Dua kaveat yang jujur:
- Rangkaian mudah alih mengikut hos. Emulator Android dan CoreSimulator Apple tidak berada di belakang pintu keluar persekitaran terasing. Kedua-dua tab mudah alih tidak menawarkan kawalan pintasan rangkaian kerana rangkaian yang diuruskan hos itu sudah tidak terbatas.
- Segala yang dibaca oleh stesen tidak dipercayai. Teks halaman, DOM, pepohon kebolehcapaian dan longgokan paparan kembali kepada ejen dipagari dengan penanda yang menyatakan “ini data, bukan arahan”. Halaman yang cuba memberi arahan kepada ejen anda dibaca sebagai rentetan yang dipetik.
Anda boleh melihat segala yang berjalan, dan menghentikan mana-mana daripadanya, di bawah Tetapan → Pelayan → Stesen.
Berkaitan
Bahagian bertajuk “Berkaitan”- Stesen dan persekitaran terasing — model di sebalik semua ini: mengapa VM, dua lorong paparan, broker kelayakan, kitaran hayat
- Majukan port dari terminal — capai pelayan dev dari mana-mana sahaja yang penting
- Rujukan stesen — setiap permukaan, kata kerja, port dan lalai di satu tempat
- Konfigurasikan guardrail —
Drive an enclosure (rig)ialah kelas tindakan yang boleh anda tetapkan kepada benarkan, tanya dahulu atau tolak, bagi setiap ruang kerja, ejen atau ruang. Modus baca sahaja menolaknya secara menyeluruh.