Tugas datang WEB-12982
Buat cabang web-12982 di repositori
Sementara ranting sedang berjalan, baca tz dan minum kopi
Lanjutkan langsung ke pengembangan
git commit, git push
Sementara cabang disusun kembali
git commit, git push
Sementara cabang dibangun kembali, membalik twitter
git commit, git push
...
Anda menyerahkan cabang ulasan dengan 50 komitmen
Anda memahami bahwa 50 commit adalah tepat 50 menit dari waktu murni, yang dikumpulkan dalam kesesuaian dan permulaan, karena interval 1 menit terlalu kecil untuk melakukan apa pun selain penundaan dan kebutuhan dasar.

Apakah situasinya akrab? Di perusahaan saya, infrastruktur pengembangan diatur sebagai berikut:
- Hitlab memiliki banyak repositori proyek
- Untuk memastikan kemudahan pengembangan saat membuat cabang baru, buruh pelabuhan secara otomatis membuat kotak pasir mereka sendiri di alamat unik, salinan lengkap cabang induk dengan semua lingkungan yang diperlukan.
- Semua yang Anda butuhkan sudah siap - cukup tulis kode dan uji-lihat-evaluasi hasilnya setelah setiap komit, sangat nyaman!
Tapi, perlahan ... Jika situasi ini dekat denganmu, selamat datang di bawah kucing.
Inti dari masalah
tldr: Perubahan yang dilakukan pada kode memerlukan pemasangan kembali wadah dan menghabiskan waktu (lebih dari satu menit, itu tergantung pada proyek, terutama jika CI \ CD dikonfigurasi), yang sebenarnya tidak dapat dihabiskan dengan berguna, tetapi yang benar-benar membutuhkan potongan yang baik dari waktu kerja programmer.
Masalah serupa muncul secara berkala di semuaSebagai contoh, liveReload yang sama untuk frontend jelas diciptakan karena suatu alasan
Saya sebelumnya menerbitkan artikel tentang topik terkait , tetapi terkait dengan proses debugging (Omong-omong, terima kasih atas komentar informatif dan umpan balik positif). Namun, masalah pada pemotongan pada dasarnya tidak hilang, kami juga terus menunggu sampai cabang dipasang kembali.
Bahkan jika Anda melewati tahapan tambahan dan hanya menyisakan build-dev dan deploy-dev, waktu tunggu tidak signifikan untuk tindakan apa pun yang bermanfaat, tetapi secara signifikan dalam total waktu yang dihabiskan, terutama ketika menyangkut CI \ CD, misalnya, dari Gitlab.
Tentu saja, Anda dapat mempercepat proses dengan merakit proyek secara lokal, asalkan programmer memiliki komputer yang relatif kuat, gitlab-runner dikonfigurasi, lingkungan yang sama dikonfigurasi seperti pada server jarak jauh, dan tag yang sesuai ditambahkan ke gitlab-ci.yml, tapi saya ragu bahwa kecepatan build akan sama dengan penyebaran kode FTP otomatis setelah tombol ctrl + s.
Terutama membakar amarah itu melelahkan ketika selama proses pengembangan Anda membuat kesalahan ketik / kesalahan yang umumnya tidak mempengaruhi operasi aplikasi, tetapi yang tidak dapat dibiarkan begitu saja dan Anda perhatikan hanya ketika Anda melihat hasil setelah perakitan.
Apa yang diperlukan dan opsi solusi
tldr: Temukan cara untuk melihat hasil edit Anda sesederhana dan secepat mungkin. Agar tidak berkomitmen setiap waktu dan tidak menunggu untuk membangun kembali cabang. Saya memilih rsync dari komputer lokal ke folder server jauh yang dipasang dengan folder kontainer.
Saya tidak menemukan solusi lengkap di Internet, tetapi sebenarnya ada beberapa opsi:
- Konfigurasikan ftp \ ssh langsung dalam wadah dengan basis kode, sertakan dalam gambar, sambungkan melalui FTP langsung ke wadah itu sendiri
- Secara pribadi, opsi ini bagi saya agak rumit, dan juga "kruk", meskipun di sini semua opsi adalah kruk
- (untuk penggunaan lokal) gunakan buruh pelabuhan cp untuk memuat kode langsung ke wadah
- Opsi ini tidak cocok untuk bekerja dengan server jarak jauh.
- docker cp memiliki fungsionalitas yang sangat terbatas, mengingat folder vendor yang tidak boleh disalin setiap waktu, dan algoritma penyalinan itu sendiri, ini akan agak lambat.
- (untuk penggunaan jarak jauh \ lokal) Pasang folder kontainer yang diinginkan ke folder host eksternal. Unduh file lokal langsung ke folder host yang dipasang. Sudah ada banyak opsi implementasi:
- Gunakan mesin docker dan khususnya mesin docker scp
- Sekali lagi, Anda perlu mengkonfigurasi lingkungan, mengkonfigurasi mesin docker, mungkin ini masuk akal ketika Anda terus-menerus bekerja dengan server yang berbeda
- Dalam IDE, konfigurasikan koneksi FTP dengan folder host yang diinginkan
- Setiap cabang baru perlu membuat koneksi baru atau mengubah pemetaan
- Gunakan scp atau rsync untuk mengunggah file ke folder host yang diinginkan, untuk ini gunakan skrip bash kecil dan gantung di hot keys
- Pada awalnya, tampaknya tidak perlu rumit, tetapi sebenarnya tidak. Script itu sendiri sesederhana mungkin dan diperlukan untuk mengotomatiskan proses sehingga Anda tidak perlu mengkonfigurasi ulang pemetaan setiap kali
Solusi itu sendiri: rsync + volume
tldr:
- Perlu akses ssh ke server jarak jauh dan rsync pada mesin lokal
- Server jarak jauh harus memiliki folder yang dapat ditulis
- Pasang folder proyek dalam wadah ke folder host eksternal
- Tambahkan skrip bash kecil ke root proyek untuk menyinkronkan file dengan server jauh
- Konfigurasikan hotkey untuk eksekusi skrip sinkronisasi
Perlu dicatat bahwa solusi yang diberikan dikecualikan untuk pengembangan dan lingkungan pengujian
Dalam hal ini, saya akan melihat lingkungan docker-compose dan gitlab-ci, dengan docker-compose menggunakan variabel lingkungan dari gitlab-ci.
Kami membentuk path ke folder tujuan di gitlab-ci dan mengekspor path ini ke docker-compose.yml:
before_script: - export SHARED_DIR_BASE='/var/www/builds' # , - export SHARED_BRANCH_DIR=${SHARED_DIR_BASE}/${PROJECT_GROUP}/${PROJECT_NAME}/${CI_COMMIT_REF_NAME} # web-123 my_group/my_project, /var/shared/my_group/my_project/web-123 Deploy dev: stage: deploy_dev script: # , - mkdir -p ${SHARED_BRANCH_DIR} - rsync -r --exclude-from=.gitignore --exclude-from=.dockerignore . ${SHARED_BRANCH_DIR} - find ${SHARED_BRANCH_DIR} -type d -exec setfacl -d -mo:rwx {} \; - find ${SHARED_BRANCH_DIR} -type d -exec setfacl -mo:rwx {} \; - find ${SHARED_BRANCH_DIR} -type f -exec setfacl -mo:rwx {} \; - envsubst < docker-compose.tmpl > docker-compose.yml # gitlab-ci.yml docker-compose.yml, docker-compose.tmpl - docker-compose up -d
Selanjutnya, kita perlu me-mount folder proyek ke folder host eksternal di docker-compose, karena kita menggunakan variabel-variabel dalam docker-compose, kita perlu templat docker-compose.tmpl di mana kita akan menggunakan variabel-variabel ini.
version: '2.3' services: web: ... volumes: - ${SHARED_BRANCH_DIR}:/app/:rw # # . , , . , , - /app/protected/vendor/
Konfigurasi saat ini sudah cukup, sekarang ketika Anda membangun cabang di server host, folder / var / www / builds / GROUP_NAME / PROJECT_NAME / BRANCH_NAME akan dibuat dan proyek akan ditransfer ke sana kecuali file dan folder yang ditentukan dalam .gitignore dan .dockerignore, lalu Anda cukup mengkonfigurasi pemetaan FTP, tetapi kami akan melangkah lebih jauh dan membuat prosesnya sedikit lebih otomatis.
Bahkan, untuk menyinkronkan file, kita perlu menjalankan sesuatu seperti ini:
rsync -r -u \ --delete-after \ --exclude-from=.gitignore \ --exclude-from=.dockerignore \ . $sshUserName@$sshHost:$sharedBaseDir
Bahkan, pada proyek-proyek berukuran kecil-menengah, perintah ini akan mengeksekusi lebih cepat daripada waktu Anda untuk melakukan dan mendorong pengeditan ke repositori. Tetap membawa skrip ini ke tampilan yang lebih lengkap dan mengikat eksekusi ke hot key.
Kode skrip lengkap: deploy.sh Perlu dicatat bahwa skrip harus terletak di root folder proyek repositori atau menunjukkan di direktori mana ia seharusnya bekerja.
Tetap hanya untuk mempercepat eksekusi skrip ini ke hotkey spesifik dan mengatur parameter sshUserName dan sshHost (dipahami bahwa sudah ada akses ke server jauh melalui ssh). Cara melakukan ini, saya akan memberikan contoh PHPstorm.
- Buka File -> Pengaturan
- Di jendela pengaturan di menu sebelah kiri, luaskan Alat , pilih Alat Eksternal
- Kami menulis path ke skrip dan menentukan sshUserName dan sshHost nyata dalam argumen

- Selanjutnya, buka Keymap dan cari nama Alat Eksternal kami, atur kombinasi yang diperlukan

Itu saja. Sekarang, ketika Anda mengklik kombinasi yang diinginkan, semua file proyek disinkronkan dengan folder jarak jauh, yang dipasang dengan folder proyek di dalam wadah. Artinya, setiap perubahan akan segera terlihat.
Saya tidak berpura-pura menjadi "ideal" dari solusi ini, mungkin ada opsi yang lebih baik, saya akan senang jika saya mengetahui mereka di komentar. Terima kasih