63 63
64| Host | Port | Ketika diperlukan |64| Host | Port | Ketika diperlukan |
65| :- | :- | :- |65| :- | :- | :- |
66| `api.github.com` | 443 | Dengan atau tanpa `--use-anthropic-git-proxy`, ketika image runner menyertakan [GitHub CLI](#github-api-access-with-the-github-cli) dan Anda memberikan kredensial github.com kepada sesi, seperti `GH_TOKEN` |
66| `downloads.claude.ai` | 443 | Pada waktu instalasi, ketika Anda menginstal atau memperbarui Claude Code di host dengan installer asli; script `install.sh` itu sendiri disajikan dari `claude.ai`. Pada waktu runtime sesi, hanya ketika sesi menginstal plugin dari marketplace Anthropic resmi. |67| `downloads.claude.ai` | 443 | Pada waktu instalasi, ketika Anda menginstal atau memperbarui Claude Code di host dengan installer asli; script `install.sh` itu sendiri disajikan dari `claude.ai`. Pada waktu runtime sesi, hanya ketika sesi menginstal plugin dari marketplace Anthropic resmi. |
67| `storage.googleapis.com` | 443 | Pada waktu runtime sesi, untuk hitungan instalasi plugin dan metadata yang ditampilkan dalam `/plugin`. |68| `storage.googleapis.com` | 443 | Pada waktu runtime sesi, untuk hitungan instalasi plugin dan metadata yang ditampilkan dalam `/plugin`. |
68| `code.claude.com` dan `claude.com` | 443 | Pencarian dokumentasi oleh agen claude-code-guide built-in dan permintaan WebFetch yang telah disetujui sebelumnya selama sesi. Memblokir host-host ini hanya mempengaruhi pencarian dokumentasi. |69| `code.claude.com` dan `claude.com` | 443 | Pencarian dokumentasi oleh agen claude-code-guide built-in dan permintaan WebFetch yang telah disetujui sebelumnya selama sesi. Memblokir host-host ini hanya mempengaruhi pencarian dokumentasi. |
167 168
168* Runner menetapkan `GIT_TERMINAL_PROMPT=0`, jadi git tidak meminta nama pengguna atau kata sandi.169* Runner menetapkan `GIT_TERMINAL_PROMPT=0`, jadi git tidak meminta nama pengguna atau kata sandi.
169* Runner menjalankan SSH dengan `BatchMode=yes`, ditambahkan ke `GIT_SSH_COMMAND` Anda jika Anda menetapkan satu, jadi SSH tidak meminta frasa sandi atau konfirmasi host.170* Runner menjalankan SSH dengan `BatchMode=yes`, ditambahkan ke `GIT_SSH_COMMAND` Anda jika Anda menetapkan satu, jadi SSH tidak meminta frasa sandi atau konfirmasi host.
170* Runner menetapkan `GCM_INTERACTIVE=never`, jadi Git Credential Manager tidak membuka dialog sign-in.171* Runner menetapkan `GCM_INTERACTIVE=never`, jadi Git Credential Manager tidak membuka dialog sign-in. Sebelum v2.1.229, persiapan repositori dapat macet pada prompt Git Credential Manager.
171* Runner menghapus `core.askPass`, jadi jika Anda menggunakan helper askpass, aturnya melalui variabel lingkungan `GIT_ASKPASS` sebagai gantinya.172* Runner menghapus `core.askPass`, jadi jika Anda menggunakan helper askpass, aturnya melalui variabel lingkungan `GIT_ASKPASS` sebagai gantinya.
172 173
173Jika host git Anda menolak kredensial, atau Anda tidak mengonfigurasi satu, runner mencoba beberapa kali dan kemudian gagal persiapan repositori ketika repositori adalah yang didorong sesi untuk hasil. Untuk repositori yang hanya dibaca sesi, [Troubleshooting](#troubleshooting) mencakup kapan runner melewatinya. Runner tidak meneruskan pengaturan ini ke lingkungan sesi.174Jika host git Anda menolak kredensial, atau Anda tidak mengonfigurasi satu, runner mencoba beberapa kali dan kemudian gagal persiapan repositori ketika repositori adalah yang didorong sesi untuk hasil. Untuk repositori yang hanya dibaca sesi, [Troubleshooting](#troubleshooting) mencakup kapan runner melewatinya. Runner tidak meneruskan pengaturan ini ke lingkungan sesi.
287* **`jq`**: instal `jq` di gambar jika Anda ingin `--jq` berfungsi288* **`jq`**: instal `jq` di gambar jika Anda ingin `--jq` berfungsi
288* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/id/env-vars)**: jika lingkungan sesi menetapkannya, Claude Code tidak menyediakan `gh` bawaan, dan sesi tidak memiliki `gh`289* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/id/env-vars)**: jika lingkungan sesi menetapkannya, Claude Code tidak menyediakan `gh` bawaan, dan sesi tidak memiliki `gh`
289 290
290Ketika gambar menyertakan GitHub CLI, sesi menggunakannya.291#### Akses GitHub API dengan GitHub CLI
292
293Jika gambar runner Anda menyertakan GitHub CLI untuk digunakan oleh sesi, minta [script wrapper](https://code.claude.com/docs/id/self-hosted-environments-configuration.md#provision-credentials-scoped-to-the-session-creator) Anda membuat `GH_TOKEN` jangka pendek dengan scope seminimal mungkin per sesi untuk pembuat sesi. Ketika `gh` berada di `PATH` yang digunakan Claude Code saat dimulai, sesi memiliki `gh` tersebut dan tidak memiliki [`gh` bawaan](#github-api-access-without-the-github-cli). Dengan token tersebut, `gh` itu menjangkau GitHub dengan akses apa pun yang diberikan token dan di luar git yang dikelola Anthropic, jadi izinkan [`api.github.com`](#network-requirements).
294
295Dengan git yang dikelola Anthropic, jangan sertakan GitHub CLI di gambar agar `gh` bawaan yang digunakan.
291 296
292#### Percayai otoritas sertifikat pribadi dengan git yang dikelola Anthropic297#### Percayai otoritas sertifikat pribadi dengan git yang dikelola Anthropic
293 298
343 348
344Penulisan ulang host berjalan terlebih dahulu, jadi daftar nama host internal dalam `--git-ssh-rewrite` jika Anda memerlukan keduanya. Untuk kontrol penuh atas checkout, gunakan [`checkout` lifecycle hook](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout).349Penulisan ulang host berjalan terlebih dahulu, jadi daftar nama host internal dalam `--git-ssh-rewrite` jika Anda memerlukan keduanya. Untuk kontrol penuh atas checkout, gunakan [`checkout` lifecycle hook](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout).
345 350
351### Mulai sesi pada repositori di luar GitHub
352
353Untuk menjalankan sesi pada repositori dari host git selain GitHub, mulai sesi dari terminal Anda, di dalam checkout repositori tersebut. Pertama, periksa kredensial git runner, jaringan dan proxy git, alamat repositori, serta branch Anda:
354
355* **Kredensial git dan jaringan**: [sediakan kredensial](#ship-git-config-in-your-image) yang [bekerja tanpa prompt](#git-must-work-without-a-prompt) untuk `https://<host>/<owner>/<name>`, alamat yang di-clone runner, dan izinkan runner menjangkau host git Anda, sebagaimana dicantumkan di [Persyaratan jaringan](#network-requirements). Untuk host git yang hanya menerima SSH, lihat [`--git-ssh-rewrite`](#rewrite-git-urls-for-private-networks).
356* **Proxy git**: jika runner di lingkungan tersebut menggunakan proxy git Anthropic, [nonaktifkan](#turn-the-anthropic-git-proxy-off).
357* **Alamat repositori**: periksa remote `origin` pada checkout. Host-nya harus berupa nama domain seperti `git.example.com`, dan path-nya harus berbentuk `<owner>/<name>`. Path bersarang seperti `group/subgroup/name` tidak lolos.
358* **Branch**: push branch tempat Anda berada ke host git Anda, karena runner meng-clone branch tersebut.
359
360Di dalam checkout, dalam keadaan masuk ke claude.ai seperti yang dijelaskan di [Authenticate from CI](https://code.claude.com/docs/id/self-hosted-environments-testing.md#authenticate-from-ci), jalankan `claude -p` dengan [`--environment`](https://code.claude.com/docs/id/self-hosted-environments-testing#run-the-test-loop) dan ID `ccpool_...` lingkungan Anda:
361
362```bash theme={null}
363claude -p "Fix the login bug" --environment ccpool_abc123 --output-format json
364```
365
366Ketika sesi dibuat, perintah tersebut mencetak satu baris JSON yang dimulai dengan `{"ok":true`. Jika remote `origin` tidak sesuai, perintah gagal dengan `requires a git source, but no GitHub remote was detected`.
367
368Tinjau dan lakukan merge di host git Anda terhadap branch yang [di-push](https://code.claude.com/docs/id/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work) oleh sesi.
369
346## Bangun gambar runner370## Bangun gambar runner
347 371
348Anthropic tidak menerbitkan gambar runner yang telah dibangun sebelumnya. Bangun milik Anda sendiri di sekitar biner `claude`, berlapis dengan toolchain apa pun yang dibutuhkan repositori Anda: runtime bahasa, compiler, package manager, dan sidecar [MCP](https://code.claude.com/docs/id/mcp.md).372Anthropic tidak menerbitkan gambar runner yang telah dibangun sebelumnya. Bangun milik Anda sendiri di sekitar biner `claude`, berlapis dengan toolchain apa pun yang dibutuhkan repositori Anda: runtime bahasa, compiler, package manager, dan sidecar [MCP](https://code.claude.com/docs/id/mcp.md).
617 641
618### Biarkan giliran yang sedang berjalan selesai sebelum restart642### Biarkan giliran yang sedang berjalan selesai sebelum restart
619 643
620Untuk membiarkan giliran yang sedang berjalan selesai sebelum restart bergulir, atur `--drain-wait-sec`, dan naikkan stop timeout Anda ke setidaknya waktu tunggu tersebut ditambah 80 detik. Dengan waktu tunggu default `0`, restart memotong giliran apa pun yang masih berjalan, dan sesi dilanjutkan di runner lain tanpa [pekerjaan yang belum di-push](#additional-limitations).644Untuk membiarkan giliran yang sedang berjalan selesai sebelum restart bergulir, atur `--drain-wait-sec`, dan naikkan stop timeout Anda ke setidaknya waktu tunggu tersebut ditambah 80 detik. Dengan waktu tunggu default `0`, restart memotong giliran apa pun yang masih berjalan, dan sesi dilanjutkan di runner lain tanpa [pekerjaan yang belum di-push](#resumed-sessions-lose-unpushed-work).
621 645
622* **`--drain-wait-sec`**: kira-kira selama giliran dan tugas latar belakang yang ingin Anda biarkan selesai. Ini adalah nilai maksimum: waktu tunggu berakhir lebih awal jika semuanya selesai lebih dulu.646* **`--drain-wait-sec`**: kira-kira selama giliran dan tugas latar belakang yang ingin Anda biarkan selesai. Ini adalah nilai maksimum: waktu tunggu berakhir lebih awal jika semuanya selesai lebih dulu.
623* **Stop timeout Anda**: `terminationGracePeriodSeconds` di Kubernetes, `stop_grace_period` di Docker Compose. Misalnya, dengan `--drain-wait-sec 120`, ganti `90` dalam resep [Kubernetes](#kubernetes) atau [Docker Compose](#docker-compose) dengan `200`.647* **Stop timeout Anda**: `terminationGracePeriodSeconds` di Kubernetes, `stop_grace_period` di Docker Compose. Misalnya, dengan `--drain-wait-sec 120`, ganti `90` dalam resep [Kubernetes](#kubernetes) atau [Docker Compose](#docker-compose) dengan `200`.
735 759
736Untuk melepaskan sesi idle, mulai setiap runner dengan [`--release-idle-session-min`](https://code.claude.com/docs/id/self-hosted-environments-reference#runner-cli-flags) dan waktu tersebut dalam menit, seperti `--release-idle-session-min 30`. Runner kemudian melepaskan setiap sesi yang tetap idle selama itu, baik yang dimulai oleh tugas terjadwal maupun oleh seseorang, kecuali Anda [menahannya untuk proses yang masih berjalan yang ditinggalkannya](#keep-an-idle-session-while-its-processes-run).760Untuk melepaskan sesi idle, mulai setiap runner dengan [`--release-idle-session-min`](https://code.claude.com/docs/id/self-hosted-environments-reference#runner-cli-flags) dan waktu tersebut dalam menit, seperti `--release-idle-session-min 30`. Runner kemudian melepaskan setiap sesi yang tetap idle selama itu, baik yang dimulai oleh tugas terjadwal maupun oleh seseorang, kecuali Anda [menahannya untuk proses yang masih berjalan yang ditinggalkannya](#keep-an-idle-session-while-its-processes-run).
737 761
738* **Pekerjaan yang belum di-push**: sesi yang dilepaskan dilanjutkan pada pesan berikutnya, tanpa pekerjaan yang belum di-push. Untuk mempertahankan commit-nya, lihat [Resumed sessions lose unpushed work](#additional-limitations).762* **Pekerjaan yang belum di-push**: sesi yang dilepaskan dilanjutkan pada pesan berikutnya, tanpa pekerjaan yang belum di-push. Untuk mempertahankan commit-nya, lihat [Resumed sessions lose unpushed work](#resumed-sessions-lose-unpushed-work).
739* **Runner keluar**: runner yang melepaskan sesi terakhirnya memulai [keluar normal](#when-the-runner-exits). Minta supervisor Anda memulai ulang runner tersebut pada filesystem baru, seperti yang dijelaskan di [Harden your deployment](#harden-your-deployment).763* **Runner keluar**: runner yang melepaskan sesi terakhirnya memulai [keluar normal](#when-the-runner-exits). Minta supervisor Anda memulai ulang runner tersebut pada filesystem baru, seperti yang dijelaskan di [Harden your deployment](#harden-your-deployment).
740* **Sesi yang tidak pernah menjadi idle**: atur juga [`--kill-session-after-min`](https://code.claude.com/docs/id/self-hosted-environments-reference#runner-cli-flags), karena [beberapa sesi tidak dihitung sebagai idle](#some-sessions-don’t-count-as-idle)764* **Sesi yang tidak pernah menjadi idle**: atur juga [`--kill-session-after-min`](https://code.claude.com/docs/id/self-hosted-environments-reference#runner-cli-flags), karena [beberapa sesi tidak dihitung sebagai idle](#some-sessions-don’t-count-as-idle)
741 765
811* Jika putaran masih berjalan, runner menunggu putaran selesai, atau untuk sesi berikutnya menunggu penggunanya, dan kemudian melepaskannya.835* Jika putaran masih berjalan, runner menunggu putaran selesai, atau untuk sesi berikutnya menunggu penggunanya, dan kemudian melepaskannya.
812* Jika sesi masih di runner ketika jendela grace berakhir, runner menghentikannya, dan pekerjaan putaran yang berjalan hilang. Putaran menunggu persetujuan yang diminta dari dalam panggilan alat yang berjalan adalah satu cara sesi melampaui jendela.836* Jika sesi masih di runner ketika jendela grace berakhir, runner menghentikannya, dan pekerjaan putaran yang berjalan hilang. Putaran menunggu persetujuan yang diminta dari dalam panggilan alat yang berjalan adalah satu cara sesi melampaui jendela.
813 837
814Sesi yang dilepaskan dilanjutkan dari klon segar, jadi pekerjaan yang tidak didorong hilang bagaimanapun; lihat [Resumed sessions lose unpushed work](#additional-limitations). Sebelum v2.1.260, runner menghentikan setiap sesi pada batas, setelah menunggu paling banyak jendela grace untuk putaran yang berjalan selesai.838Sesi yang dilepaskan dilanjutkan dari klon segar, jadi pekerjaan yang belum di-push tetap hilang; lihat [Resumed sessions lose unpushed work](#resumed-sessions-lose-unpushed-work). Sebelum v2.1.260, runner menghentikan setiap sesi pada batas, setelah menunggu paling lama jendela grace agar giliran yang sedang berjalan selesai.
815 839
816Atur flag di atas sesi terpanjang yang diharapkan, seperti `--kill-session-after-min 480` untuk 8 jam. Untuk membebaskan slot dari percakapan yang menjadi menganggur, gunakan `--release-idle-session-min`.840Atur flag di atas sesi terpanjang yang diharapkan, seperti `--kill-session-after-min 480` untuk 8 jam. Untuk membebaskan slot dari percakapan yang menjadi menganggur, gunakan `--release-idle-session-min`.
817 841
842### Sesi yang dilanjutkan kehilangan pekerjaan yang belum di-push
843
844Sesi yang dilanjutkan di runner segar kehilangan pekerjaan yang belum di-push, karena runner tersebut mengklon repositori lagi dari branch awalnya.
845
846Untuk mempertahankan pekerjaan yang sudah di-commit, atur [`--push-outcome-on-release`](https://code.claude.com/docs/id/self-hosted-environments-reference#runner-cli-flags) pada setiap runner di lingkungan tersebut. Runner dengan flag ini melakukan push best-effort atas branch hasil sesi sebelum melepaskannya, dan sesi yang dilanjutkan dimulai dari commit tersebut. Runner tanpa flag ini melanjutkan sesi dari branch awalnya. Push tersebut menggunakan kredensial git milik host runner sendiri, termasuk pada runner yang menggunakan [git yang dikelola Anthropic](#use-the-anthropic-git-proxy).
847
848> [!WARNING]
849>
850> Sebelum Anda mengatur flag ini, batasi siapa yang dapat melakukan push ke ref `claude/*` pada remote sumber. Saat dilanjutkan, runner mengambil branch yang sebelumnya di-push tanpa memverifikasi siapa yang melakukan push-nya.
851
852Bahkan dengan flag ini diatur, simpan pekerjaan berikut dengan cara lain:
853
854* **Perubahan yang belum di-commit**: perubahan ini tetap hilang. Lihat [Prompt sessions to push their work](https://code.claude.com/docs/id/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work).
855* **Repositori yang di-checkout melalui [hook siklus hidup `checkout`](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout)**: repositori ini tidak di-push. Buat snapshot repositori tersebut dari [hook `post-session`](https://code.claude.com/docs/id/self-hosted-environments-configuration#post-session).
856* **Commit dalam sesi yang diarsipkan atau dihapus seseorang, atau yang runner-nya dilepaskan dari menu sesi**: jangan mengandalkan push dari flag ini. Untuk menyimpannya, push `HEAD` ke branch penyelamat dari [hook `post-session`](https://code.claude.com/docs/id/self-hosted-environments-configuration#post-session). Contoh di sana hanya melakukan push setelah commit snapshot, jadi buat hook Anda melakukan push bahkan ketika tidak ada perubahan yang belum di-commit.
857
818### Batasan tambahan858### Batasan tambahan
819 859
820* **Sesi yang dilanjutkan kehilangan pekerjaan yang belum di-push**: runner segar mengklon repositori lagi dari branch awalnya, jadi pekerjaan yang belum di-push oleh sesi hilang.
821 * **Untuk mempertahankan pekerjaan yang sudah di-commit**: atur [`--push-outcome-on-release`](https://code.claude.com/docs/id/self-hosted-environments-reference#runner-cli-flags) pada setiap runner di lingkungan tersebut, karena runner tanpa flag ini melanjutkan sesi dari branch awalnya. Runner dengan flag ini melakukan push best-effort atas branch hasil sesi sebelum melepaskannya, dan sesi yang dilanjutkan dimulai dari commit tersebut. Push tersebut menggunakan kredensial git milik host runner sendiri, termasuk pada runner yang menggunakan [git yang dikelola Anthropic](#use-the-anthropic-git-proxy).
822 * **Dengan hook `checkout`**: repositori yang di-checkout melalui [hook siklus hidup `checkout`](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout) tidak di-push. Buat snapshot repositori tersebut dari [hook `post-session`](https://code.claude.com/docs/id/self-hosted-environments-configuration#post-session) sebagai gantinya.
823 * **Sebelum mengaktifkan flag ini**: batasi siapa yang dapat melakukan push ke ref `claude/*` pada remote sumber. Saat dilanjutkan, runner mengambil branch yang sebelumnya di-push tanpa memverifikasi siapa yang melakukan push-nya.
824 * **Perubahan yang belum di-commit tetap hilang**: untuk meminta Claude melakukan commit dan push ketika selesai merespons, lihat [Prompt sessions to push their work](https://code.claude.com/docs/id/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)
825* **Perintah yang terputus karena runner yang hilang dapat berjalan lagi**: ketika sesi dilanjutkan di runner lain, Claude melihat panggilan tool yang terinterupsi dengan hasil yang menyatakan bahwa hasil akhirnya tidak diketahui.860* **Perintah yang terputus karena runner yang hilang dapat berjalan lagi**: ketika sesi dilanjutkan di runner lain, Claude melihat panggilan tool yang terinterupsi dengan hasil yang menyatakan bahwa hasil akhirnya tidak diketahui.
826* **Repositori yang ditambahkan di tengah sesi dapat gagal diklon**: Claude mengklonnya dengan `git clone` melalui HTTPS. Pada runner tanpa [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), klon gagal dengan kesalahan autentikasi git jika tidak ada apa pun di host yang dapat membaca repositori tersebut. Jika memungkinkan, pilih setiap repositori yang dibutuhkan sesi ketika Anda membuatnya.861* **Repositori yang ditambahkan di tengah sesi dapat gagal diklon**: Claude mengklonnya dengan `git clone` melalui HTTPS. Pada runner tanpa [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), klon gagal dengan kesalahan autentikasi git jika tidak ada apa pun di host yang dapat membaca repositori tersebut. Jika memungkinkan, pilih setiap repositori yang dibutuhkan sesi ketika Anda membuatnya.
827 * **Ketika sesi dilanjutkan**: [hook `checkout`](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout) juga berjalan untuk repositori yang ditambahkan, dengan [`CLAUDE_RUNNER_REPO_REF`](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout) kosong, jadi pastikan hook Anda menangani hal tersebut.862 * **Ketika sesi dilanjutkan**: [hook `checkout`](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout) juga berjalan untuk repositori yang ditambahkan, dengan [`CLAUDE_RUNNER_REPO_REF`](https://code.claude.com/docs/id/self-hosted-environments-configuration#checkout) kosong, jadi pastikan hook Anda menangani hal tersebut.
828* **Beberapa konektor tidak muncul dalam sesi yang di-host sendiri**: konektor yang belum Anda hubungkan dalam pengaturan claude.ai tidak terdaftar dalam sesi yang di-host sendiri, dan sesi tidak akan meminta Anda untuk menghubungkannya. Hubungkan dalam Pengaturan terlebih dahulu, kemudian mulai sesi segar. Menambahkan konektor ke sesi yang sudah berjalan juga tidak membuat alat-alatnya tersedia untuk Claude; mulai sesi segar untuk mengambil konektor yang baru ditambahkan.863* **Beberapa konektor tidak muncul dalam sesi yang di-host sendiri**: konektor yang belum Anda hubungkan dalam pengaturan claude.ai tidak terdaftar dalam sesi yang di-host sendiri, dan sesi tidak akan meminta Anda untuk menghubungkannya. Hubungkan dalam Pengaturan terlebih dahulu, kemudian mulai sesi segar. Menambahkan konektor ke sesi yang sudah berjalan juga tidak membuat alat-alatnya tersedia untuk Claude; mulai sesi segar untuk mengambil konektor yang baru ditambahkan.
829* **Ketika seseorang mengarsipkan atau menghapus sesi, atau melepaskan runner-nya dari menu sesi**: jangan mengandalkan push [`--push-outcome-on-release`](https://code.claude.com/docs/id/self-hosted-environments-reference#runner-cli-flags). Untuk menyimpan commit dalam kasus tersebut, push `HEAD` ke branch penyelamat dari [hook `post-session`](https://code.claude.com/docs/id/self-hosted-environments-configuration#post-session). Jika Anda memulai dari contoh di sana, ubah agar contoh tersebut melakukan push bahkan ketika tidak ada perubahan yang belum di-commit, karena contoh tersebut hanya melakukan push setelah commit snapshot.
830 864
831### Laporkan masalah865### Laporkan masalah
832 866