Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Kuring ngajukeun maca transkrip laporan ku Alexander Sigachev ti Inventos "Pamekaran sareng prosés tés sareng Docker + Gitlab CI"

Jalma anu nembé ngamimitian ngalaksanakeun prosés pamekaran sareng uji dumasar kana Docker + Gitlab CI sering naroskeun patarosan dasar. Dimana ngamimitian? Kumaha ngatur? Kumaha nguji?

Laporan ieu saé kusabab éta nyarios dina cara terstruktur ngeunaan prosés pamekaran sareng tés nganggo Docker sareng Gitlab CI. Laporan sorangan ti 2017. Kuring nyangka yén tina laporan ieu anjeun tiasa diajar dasar, metodologi, ide, pangalaman pamakean.

Anu paduli, mangga handapeun ucing.

Ngaran abdi Alexander Sigachev. Abdi damel pikeun Inventos. Kuring bakal nyarioskeun ka anjeun ngeunaan pangalaman kuring ngagunakeun Docker sareng kumaha urang laun-laun ngalaksanakeunana dina proyék di perusahaan.

Topik presentasi: Prosés pamekaran nganggo Docker sareng Gitlab CI.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Ieu obrolan kadua kuring ngeunaan Docker. Dina waktos laporan munggaran, kami ngan ukur nganggo Docker dina Pangembangan dina mesin pamekar. Jumlah pagawé anu ngagunakeun Docker sakitar 2-3 urang. Saeutik demi saeutik, pangalaman dimeunangkeun sareng urang ngalih sakedik. Link ka urang laporan munggaran.

Naon anu bakal aya dina laporan ieu? Urang bakal babagi pangalaman urang ngeunaan naon rake kami geus dikumpulkeun, naon masalah kami geus direngsekeun. Teu madhab éta geulis, tapi diwenangkeun move on.

motto kami nyaeta: dok sagalana urang bisa meunang leungeun kami on.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Masalah naon anu ku urang direngsekeun?

Nalika aya sababaraha tim dina perusahaan, programer mangrupikeun sumber daya anu dibagikeun. Aya tahapan nalika programer ditarik kaluar tina hiji proyék sareng dipasihkeun pikeun sababaraha waktos ka proyék anu sanés.

Supados programmer gancang ngartos, anjeunna kedah ngaunduh kodeu sumber proyék sareng ngaluncurkeun lingkunganana pas mungkin, anu bakal ngamungkinkeun anjeunna ngaléngkah langkung seueur ngarengsekeun masalah proyék ieu.

Biasana, upami anjeun ngamimitian ti mimiti, maka aya sakedik dokuméntasi dina proyék éta. Inpormasi ngeunaan cara nyetél ngan ukur sayogi pikeun jalma anu lami. Karyawan nyetél tempat gawé sorangan dina hiji atawa dua poé. Pikeun ngagancangkeun ieu, kami nganggo Docker.

Alesan salajengna nyaéta standarisasi setélan dina Pangwangunan. Dina pangalaman kuring, pamekar salawasna nyandak inisiatif. Dina unggal kasus kalima, hiji domain custom diasupkeun, contona, vasya.dev. Linggih di gigireunana nyaéta tatanggana Petya, anu domainna nyaéta petya.dev. Aranjeunna ngembangkeun situs wéb atanapi sababaraha komponén sistem nganggo nami domain ieu.

Nalika sistem tumuwuh sareng nami domain ieu mimiti asup kana konfigurasi, teras timbul konflik lingkungan Pangembangan sareng jalur situs ditulis deui.

Sami kajadian kalawan setélan database. Aya anu henteu ngaganggu kaamanan sareng damel sareng kecap konci root kosong. Dina tahap instalasi, MySQL naroskeun ka batur pikeun kecap akses sareng kecap koncina tétéla 123. Sering kajadian yén konfigurasi database terus robih gumantung kana komitmen pamekar. Batur dilereskeun, batur teu ngabenerkeun config. Aya trik nalika urang nyandak sababaraha jinis konfigurasi tés .gitignore sareng unggal pamekar kedah masang pangkalan data. Hal ieu ngajadikeun hésé ngamimitian. Ieu diperlukeun, diantara hal séjén, pikeun nginget ngeunaan database. Basis data kudu diinisialisasi, kecap akses kudu diasupkeun, pamaké kudu didaptarkeun, tabel kudu dijieun, jeung saterusna.

Masalah sanésna nyaéta versi perpustakaan anu béda. Sering kajadian yén pamekar damel sareng proyék anu béda. Aya proyék Warisan anu dimimitian lima taun ka pengker (ti 2017 - ed. catetan). Dina waktu peluncuran, urang mimitian ku MySQL 5.5. Aya ogé proyék modéren dimana urang nyobian nerapkeun versi MySQL langkung modern, contona, 5.7 atanapi langkung lami (dina 2017 - ed. catetan)

Saha waé anu damel sareng MySQL terang yén perpustakaan ieu mawa katergantungan sareng aranjeunna. Ieu rada masalah ngajalankeun 2 basa babarengan. Sahenteuna, klien heubeul aya masalah pikeun nyambung ka database anyar. Ieu dina gilirannana nyiptakeun sababaraha masalah.

Masalah salajengna nyaeta nalika pamekar gawéna dina mesin lokal, anjeunna ngagunakeun sumberdaya lokal, file lokal, RAM lokal. Sadaya interaksi dina waktos ngembangkeun solusi pikeun masalah dilaksanakeun dina kerangka kanyataan yén éta tiasa dianggo dina hiji mesin. Hiji conto nyaéta nalika urang gaduh server backend dina Produksi 3, sareng pamekar nyimpen file kana diréktori akar sareng ti dinya nginx nyandak file pikeun ngabales pamundut éta. Nalika kode sapertos kitu asup kana Produksi, tétéla yén file éta aya dina salah sahiji 3 server.

Arah microservices ngembang ayeuna. Nalika urang ngabagi aplikasi ageung kana sababaraha komponén leutik anu saling berinteraksi. Ieu ngamungkinkeun anjeun milih téknologi pikeun tumpukan tugas khusus. Éta ogé ngamungkinkeun anjeun ngabagi padamelan sareng tanggung jawab antara pamekar.

Frondend-pamekar, ngembang dina JS, ampir euweuh pangaruh dina Backend. Pamekar backend, kahareupna ngembang, dina hal urang, Ruby on Rails sarta henteu ngaganggu Frondend. Interaksi dilaksanakeun nganggo API.

Salaku bonus, kalayan bantosan Docker, kami tiasa ngadaur ulang sumberdaya dina Pementasan. Unggal proyék, kusabab spésifikna, peryogi setélan anu tangtu. Fisik, ieu diperlukeun pikeun allocate boh server maya jeung ngonpigurasikeun eta misah, atawa babagi sababaraha jenis lingkungan variabel jeung proyék bisa, gumantung kana versi perpustakaan, pangaruh silih.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Parabot. Urang make naon?

  • Docker sorangan. Dockerfile ngajelaskeun katergantungan tina hiji aplikasi.
  • Docker-compose mangrupikeun bungkusan anu ngahijikeun sababaraha aplikasi Docker kami.
  • Kami nganggo GitLab pikeun nyimpen kodeu sumber.
  • Kami nganggo GitLab-CI pikeun integrasi sistem.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Laporan diwangun ku dua bagian.

Bagian kahiji bakal ngobrol ngeunaan kumaha Docker dijalankeun dina mesin pamekar.

Bagian kadua bakal ngobrol ngeunaan kumaha carana berinteraksi sareng GitLab, kumaha urang ngajalankeun tés sareng kumaha urang gulung ka Staging.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Docker mangrupikeun téknologi anu ngamungkinkeun (ngagunakeun pendekatan déklaratif) pikeun ngajelaskeun komponén anu diperyogikeun. Ieu mangrupikeun conto Dockerfile. Di dieu urang dibewarakeun yén urang warisan ti Ruby resmi: 2.3.0 gambar Docker. Ieu ngandung versi Ruby 2.3 dipasang. Kami masang perpustakaan ngawangun anu diperyogikeun sareng NodeJS. Urang ngajelaskeun yén urang nyieun diréktori a /app. Setel diréktori aplikasi salaku diréktori kerja. Dina diréktori ieu kami nempatkeun Gemfile minimal na Gemfile.lock diperlukeun. Urang teras ngawangun proyék anu masang gambar kagumantungan ieu. Kami nunjukkeun yén wadahna bakal siap ngadangukeun dina port éksternal 3000. Paréntah anu terakhir nyaéta paréntah anu langsung ngaluncurkeun aplikasi kami. Upami urang ngaéksekusi paréntah ngamimitian proyék, aplikasi bakal nyobian ngajalankeun sareng ngajalankeun paréntah anu ditangtukeun.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Ieu mangrupikeun conto minimal tina file docker-compose. Dina hal ieu, kami nunjukkeun yén aya sambungan antara dua wadah. Ieu langsung kana jasa database sareng jasa wéb. Aplikasi wéb kami dina kalolobaan kasus meryogikeun sababaraha jinis pangkalan data salaku backend pikeun nyimpen data. Kusabab kami nganggo MySQL, contona nyaéta MySQL - tapi teu aya anu ngahalangan kami nganggo sababaraha pangkalan data anu sanés (PostgreSQL, Redis).

Simkuring nyandak tina sumber resmi ti hub Docker gambar MySQL 5.7.14 tanpa parobahan. Kami ngumpulkeun gambar anu tanggung jawab pikeun aplikasi wéb kami tina diréktori ayeuna. Éta ngumpulkeun gambar pikeun urang nalika peluncuran munggaran. Lajeng ngajalankeun paréntah nu urang executing dieu. Upami urang uih deui, urang bakal ningali yén paréntah peluncuran via Puma parantos ditetepkeun. Puma mangrupikeun jasa anu ditulis dina Ruby. Dina kasus kadua, urang override. Paréntah ieu tiasa sawenang-wenang gumantung kana kabutuhan atanapi tugas urang.

Urang ogé ngajelaskeun yén urang kedah neraskeun port dina mesin host pamekar urang tina 3000 ka 3000 dina port wadahna. Hal ieu dilakukeun sacara otomatis nganggo iptables sareng mékanisme na, anu langsung dipasang dina Docker.

Pamekar ogé tiasa, sapertos sateuacana, ngaksés alamat IP anu sayogi, contona, 127.0.0.1 mangrupikeun alamat IP lokal atanapi éksternal mesin.

Baris panungtungan nyebutkeun yén wadahna web gumantung kana wadahna db. Nalika urang nyauran mimiti wadah wéb, docker-compose bakal mimiti ngamimitian database pikeun urang. Geus di mimiti database (dina kanyataanana, sanggeus peluncuran wadahna! Ieu teu ngajamin kesiapan database) bakal ngajalankeun aplikasi, backend urang.

Ieu ngahindarkeun kasalahan nalika pangkalan data henteu dibawa sareng ngahémat sumber daya nalika urang ngeureunkeun wadah database, sahingga ngabebaskeun sumber pikeun proyék-proyék anu sanés.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Naon anu masihan kami panggunaan database dockerization dina proyék éta. Urang ngalereskeun versi MySQL pikeun sakabéh pamekar. Ieu ngahindarkeun sababaraha kasalahan anu tiasa lumangsung nalika versi diverge, nalika sintaksis, konfigurasi, setélan standar robih. Ieu ngidinan Anjeun pikeun nangtukeun hiji hostname umum pikeun database, login, sandi. Urang pindah jauh ti kebon binatang tina ngaran jeung konflik dina file config nu urang tadi saméméhna.

Urang boga kasempetan pikeun make a config leuwih optimal pikeun lingkungan Development, nu bakal béda ti standar. MySQL dikonpigurasi pikeun mesin lemah sacara standar sareng kinerjana kaluar tina kotakna goréng pisan.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Docker ngamungkinkeun anjeun nganggo Python, Ruby, NodeJS, juru PHP tina versi anu dipikahoyong. Urang ngaleungitkeun kabutuhan ngagunakeun sababaraha jinis manajer versi. Sateuacanna, Ruby nganggo pakét rpm anu ngamungkinkeun anjeun ngarobih vérsi gumantung kana proyék. Éta ogé ngamungkinkeun, hatur nuhun kana wadah Docker, pikeun lancar migrasi kode sareng versina sareng katergantungan. Urang teu boga masalah ngartos versi duanana juru jeung kode. Pikeun ngapdet versi, nurunkeun wadahna lami sareng angkat wadah énggal. Lamun aya nu lepat, urang bisa nurunkeun wadahna anyar, ngangkat wadah heubeul.

Saatos ngawangun gambar, wadahna dina Pangwangunan sareng Produksi bakal sami. Ieu hususna leres pikeun pamasangan ageung.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI Dina Frontend kami nganggo JavaScipt sareng NodeJS.

Ayeuna urang gaduh proyék terakhir dina ReacJS. Pamekar ngajalankeun sadayana dina wadahna sareng dikembangkeun nganggo hot-reload.

Salajengna, tugas assembly JavaScipt diluncurkeun sareng kode anu disusun kana statik dipasihkeun ngalangkungan sumber daya nginx.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Di dieu kuring geus dibikeun skéma proyék panungtungan urang.

Tugas naon anu direngsekeun? Urang kedah ngawangun sistem anu berinteraksi sareng alat sélulér. Aranjeunna nampi data. Hiji kamungkinan nyaéta ngirim béwara push ka alat ieu.

Naon anu urang lakukeun pikeun ieu?

Urang dibagi kana aplikasi komponén kayaning: bagian admin on JS, backend, nu jalan ngaliwatan panganteur REST handapeun Ruby on rel. backend nu berinteraksi sareng database. Hasil anu dihasilkeun dibikeun ka klien. Panel admin berinteraksi sareng backend sareng pangkalan data via antarmuka REST.

Kami ogé kedah ngirim béwara push. Sateuacan éta, kami ngagaduhan proyék anu ngalaksanakeun mékanisme anu tanggung jawab pikeun ngirim béwara ka platform mobile.

Kami parantos ngembangkeun skéma di handap ieu: operator tina browser berinteraksi sareng panel admin, panel admin berinteraksi sareng backend, tugasna nyaéta ngirim bewara Push.

Bewara push berinteraksi sareng komponén séjén anu dilaksanakeun dina NodeJS.

Antrian diwangun lajeng bewara dikirimkeun nurutkeun mékanisme maranéhanana.

Dua pangkalan data digambar di dieu. Ayeuna, kalayan bantosan Docker, kami nganggo 2 basis data mandiri anu henteu aya hubunganana sareng anu sanés. Salaku tambahan, aranjeunna gaduh jaringan virtual umum, sareng data fisik disimpen dina diréktori anu béda dina mesin pamekar.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Sarua tapi dina jumlah. Ieu dimana pamakéan ulang kode penting.

Upami sateuacana urang nyarioskeun ngeunaan ngagunakeun deui kode dina bentuk perpustakaan, maka dina conto ieu, jasa kami anu ngabales bewara Push dianggo deui salaku server lengkep. Éta nyayogikeun API. Sareng pamekaran énggal urang parantos berinteraksi sareng éta.

Dina waktos éta, kami nganggo versi 4 tina NodeJS. Ayeuna (dina 2017 - ed. catetan) dina kamajuan panganyarna kami nganggo versi 7 of NodeJS. Henteu aya masalah dina komponén énggal pikeun ngalibetkeun vérsi perpustakaan énggal.

Upami diperlukeun, anjeun tiasa refactor sareng ngangkat versi NodeJS tina ladenan bewara Push.

Sareng upami urang tiasa ngajaga kasaluyuan API, maka éta bakal tiasa ngagentos ku proyék-proyék sanés anu saacanna dianggo.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Naon anu anjeun peryogikeun pikeun nambihan Docker? Kami nambihan Dockerfile kana gudang kami, anu ngajelaskeun katergantungan anu diperyogikeun. Dina conto ieu, komponén direcah sacara logis. Ieu mangrupikeun set minimum pamekar backend.

Nalika nyieun proyék anyar, urang nyieun Dockerfile, ngajelaskeun ékosistem nu dipikahoyong (Python, Ruby, NodeJS). Dina docker-compose, éta ngajelaskeun kagumantungan anu diperyogikeun - pangkalan data. Kami ngajelaskeun yén urang peryogi database sapertos kitu sareng versi sapertos kitu, nyimpen data di ditu di dieu.

Kami nganggo wadah katilu anu misah sareng nginx pikeun ngalayanan statik. Kasebut nyaéta dimungkinkeun pikeun unggah gambar. Backend nempatkeun aranjeunna dina volume anu tos disiapkeun, anu ogé dipasang dina wadah sareng nginx, anu masihan statik.

Pikeun nyimpen nginx, konfigurasi mysql, kami nambihan folder Docker dimana urang nyimpen konfigurasi anu diperyogikeun. Nalika pamekar ngalakukeun clone git of a Repository on mesin na, anjeunna geus boga proyék siap pikeun pangwangunan lokal. Henteu aya patarosan naon port atanapi setélan naon anu bakal diterapkeun.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Salajengna, urang gaduh sababaraha komponén: admin, inform-API, push bewara.

Pikeun ngamimitian sadayana ieu, kami nyiptakeun gudang anu sanés, anu kami disebut dockerized-app. Ayeuna kami nganggo sababaraha repositori sateuacan unggal komponén. Éta ngan sacara logis béda - dina GitLab sigana polder, tapi dina mesin pamekar, polder pikeun proyék khusus. Hiji tingkat handap mangrupakeun komponén anu bakal digabungkeun.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Ieu mangrupikeun conto ngan ukur eusi dockerized-app. Kami ogé nyangking diréktori Docker di dieu, dimana urang ngeusian konfigurasi anu dipikabutuh pikeun interaksi sadaya komponén. Aya README.md anu ngajelaskeun sakeudeung kumaha ngajalankeun proyek.

Di dieu kami parantos nerapkeun dua file docker-compose. Hal ieu dilakukeun supados tiasa ngajalankeun léngkah. Nalika pamekar damel sareng inti, anjeunna henteu peryogi béwara push, anjeunna ngan saukur ngaluncurkeun file docker-compose sareng, sasuai, sumberna disimpen.

Upami aya kabutuhan pikeun ngahijikeun sareng béwara push, teras docker-compose.yaml sareng docker-compose-push.yaml diluncurkeun.

Kusabab docker-compose.yaml sareng docker-compose-push.yaml aya dina polder, jaringan virtual tunggal otomatis didamel.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Katerangan komponén. Ieu mangrupikeun file anu langkung maju anu tanggung jawab pikeun ngumpulkeun komponén. Naon anu luar biasa di dieu? Di dieu urang ngawanohkeun komponén balancer.

Ieu mangrupikeun gambar Docker anu siap-siap anu ngajalankeun nginx sareng aplikasi anu ngadangukeun dina stop kontak Docker. Dinamis, sakumaha wadahna dihurungkeun sareng mareuman, éta ngarobih deui konfigurasi nginx. Urang ngadistribusikaeun penanganan komponén ku ngaran domain tingkat katilu.

Pikeun lingkungan Pangwangunan, kami nganggo domain .dev - api.informer.dev. Aplikasi sareng domain .dev sayogi dina mesin lokal pamekar.

Salajengna, configs ditransferkeun ka unggal proyék sareng sadaya proyék diluncurkeun babarengan dina waktos anu sami.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Sacara grafis, tétéla yén klien mangrupikeun panyungsi urang atanapi sababaraha alat anu kami nyuhunkeun panyimbang.

Pangimbang ngaran domain nangtukeun wadah mana anu kedah dihubungan.

Éta tiasa nginx, anu masihan admin JS. Ieu tiasa nginx, anu masihan API, atanapi file statik, anu dipasihkeun ka nginx dina bentuk unggah gambar.

Diagram nunjukkeun yén wadahna disambungkeun ku jaringan virtual sareng disumputkeun di tukangeun proxy.

Dina mesin pamekar, anjeun tiasa ngaksés wadahna terang IP, tapi prinsipna urang henteu nganggo ieu. Aya praktis teu merlukeun aksés langsung.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Conto mana anu kedah ditingali pikeun dockerize aplikasi anjeun? Dina pamanggih kuring, conto anu saé nyaéta gambar docker resmi pikeun MySQL.

Ieu rada nangtang. Aya loba versi. Tapi pungsionalitasna ngamungkinkeun anjeun pikeun nutupan seueur kabutuhan anu tiasa timbul dina prosés pangwangunan salajengna. Upami anjeun nyéépkeun waktos sareng terang kumaha éta sadayana berinteraksi, maka kuring pikir anjeun moal ngagaduhan masalah dina palaksanaan diri.

Hub.docker.com biasana ngandung tumbu ka github.com, anu ngandung data atah langsung ti mana anjeun tiasa ngawangun gambar sorangan.

Salajengna dina gudang ieu aya skrip docker-endpoint.sh, anu tanggung jawab pikeun inisialisasi awal sareng pikeun ngolah peluncuran aplikasi salajengna.

Ogé dina conto ieu, aya kamampuan pikeun ngonpigurasikeun nganggo variabel lingkungan. Ku netepkeun variabel lingkungan nalika ngajalankeun wadah tunggal atanapi ngalangkungan docker-compose, urang tiasa nyarios yén urang kedah nyetél kecap konci kosong pikeun docker pikeun akar dina MySQL atanapi naon waé anu dipikahoyong.

Aya pilihan pikeun nyieun sandi acak. Urang nyebutkeun yén urang kudu pamaké, urang kudu nyetél sandi pikeun pamaké, sarta kami kudu nyieun database a.

Dina proyék kami, kami rada ngahijikeun Dockerfile, anu tanggung jawab pikeun inisialisasi. Di dinya kami ngabenerkeunana pikeun kaperluan kami pikeun ngajantenkeun éta ngan ukur penyuluhan hak pangguna anu dianggo ku aplikasi. Ieu ngamungkinkeun urang ngan saukur nyieun database tina konsol aplikasi engké. Aplikasi Ruby gaduh paréntah pikeun nyiptakeun, ngarobih, sareng ngahapus pangkalan data.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Ieu mangrupikeun conto kumaha versi MySQL spésifik dina github.com. Anjeun tiasa muka Dockerfile sareng ningali kumaha pamasangan di dinya.

docker-endpoint.sh mangrupikeun skrip anu tanggung jawab kana titik éntri. Salila initialization awal, sababaraha léngkah persiapan diperlukeun, sarta sakabeh lampah ieu dicokot kaluar ngan dina Aksara initialization.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Hayu urang ngaléngkah ka bagian kadua.

Pikeun nyimpen kodeu sumber, urang ngalih ka gitlab. Ieu mangrupikeun sistem anu cukup kuat anu gaduh antarmuka visual.

Salah sahiji komponén Gitlab nyaéta Gitlab CI. Eta ngidinan Anjeun pikeun ngajelaskeun runtuyan paréntah nu engké bakal dipaké pikeun ngatur sistem pangiriman kode atawa ngajalankeun nguji otomatis.

Gitlab CI 2 ngobrol https://goo.gl/uohKjI - laporan ti klub Ruby Rusia - cukup rinci jeung sugan eta bakal dipikaresep ku anjeun.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Ayeuna urang bakal ningali naon anu diperyogikeun pikeun ngaktipkeun Gitlab CI. Pikeun ngamimitian Gitlab CI, urang ngan kedah nempatkeun file .gitlab-ci.yml dina akar proyek.

Di dieu urang ngajelaskeun yén urang rék ngaéksekusi runtuyan nagara kawas test a, nyebarkeun.

Urang ngaéksekusi skrip anu langsung nyauran docker-compose pikeun ngawangun aplikasi urang. Ieu ngan conto backend.

Salajengna, urang nyebutkeun yén perlu ngajalankeun migrasi pikeun ngarobah database jeung ngajalankeun tés.

Upami skrip dieksekusi leres sareng henteu ngabalikeun kodeu kasalahan, sistem teras teraskeun kana tahap kadua panyebaran.

Tahap deployment ayeuna dilaksanakeun pikeun pementasan. Kami henteu ngatur balikan deui nol-downtime.

Urang maksakeun mareuman sadaya wadahna, teras urang angkat deui sadaya wadahna, dikumpulkeun dina tahap kahiji nalika uji.

Kami ngajalankeun pikeun variabel lingkungan ayeuna migrasi database anu ditulis ku pamekar.

Aya catetan yén ieu ngan manglaku ka cabang master.

Nalika ngarobah cabang séjén teu dieksekusi.

Kasebut nyaéta dimungkinkeun pikeun ngatur rollouts ku cabang.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Pikeun ngatur ieu salajengna, urang kudu install Gitlab Runner.

Utilitas ieu ditulis dina Golang. Ieu mangrupikeun file tunggal, sapertos anu umum di dunya Golang, anu henteu peryogi katergantungan.

Dina ngamimitian, urang ngadaptarkeun Gitlab Runner.

Kami kéngingkeun konci dina antarmuka wéb Gitlab.

Teras we nelepon paréntah initialization dina garis paréntah.

Nyetél Gitlab Runner sacara interaktif (Shell, Docker, VirtualBox, SSH)

Kodeu on Gitlab runner bakal ngaéksekusi on unggal komitmen, gumantung kana setelan .gitlab-ci.yml.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Kumaha katingalina sacara visual dina Gitlab dina antarmuka wéb. Saatos kami nyambungkeun GItlab CI, kami ngagaduhan bandéra anu nunjukkeun kaayaan ngawangun ayeuna.

Kami ningali yén komitmen dilakukeun 4 menit ka tukang, anu lulus sadaya tés sareng henteu ngabalukarkeun masalah.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Urang tiasa nyandak katingal ngadeukeutan dina wangunan. Di dieu urang nempo yén dua nagara bagian geus kaliwat. Status tés sareng status penyebaran dina pementasan.

Lamun urang klik dina ngawangun husus, lajeng bakal kaluaran konsol tina paréntah anu dijalankeun dina prosés nurutkeun .gitlab-ci.yml.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Ieu naon sajarah produk urang kasampak kawas. Urang nempo yén aya usaha suksés. Nalika tés dikintunkeun, éta henteu diteruskeun kana léngkah anu salajengna sareng kode pementasan henteu diropéa.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Tugas naon anu urang ngajawab dina pementasan nalika urang ngalaksanakeun docker? Sistem kami diwangun ku komponén sareng urang kedah ngamimitian deui, ngan ukur bagian tina komponén anu diropéa dina gudang, sanés sadayana sistem.

Jang ngalampahkeun ieu, urang kedah ngancurkeun sadayana kana polder anu misah.

Saatos urang ngalakukeun ieu, urang tadi masalah jeung kanyataan yén Docker-ngarang nyieun spasi jaringan sorangan pikeun tiap Daddy sarta teu ningali komponén tatangga.

Pikeun ngurilingan, kami nyiptakeun jaringan di Docker sacara manual. Ditulis dina Docker-compose yén anjeun nganggo jaringan sapertos kitu pikeun proyék ieu.

Ku kituna, unggal komponén anu dimimitian ku bolong ieu ningali komponén di bagian séjén sistem.

Masalah salajengna nyaéta ngabagi pementasan dina sababaraha proyék.

Kusabab pikeun sakabéh ieu kasampak geulis tur sacaket mungkin ka produksi, éta hadé ngagunakeun port 80 atawa 443, nu dipaké madhab dina WEB.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Kumaha urang ngajawab eta? Kami parantos masihan hiji Gitlab Runner ka sadaya proyék utama.

Gitlab ngamungkinkeun anjeun pikeun ngajalankeun sababaraha Gitlab Runners anu disebarkeun, anu ngan saukur bakal nyandak sadaya pancén dina gilirannana dina cara anu kacau sareng ngajalankeunana.

Sangkan urang teu boga imah, urang ngawatesan grup proyék urang ka hiji Gitlab Runner, nu copes tanpa masalah jeung volume urang.

Kami mindahkeun nginx-proxy kana skrip ngamimitian anu misah sareng nambihan grid pikeun sadaya proyék di jerona.

Proyék urang gaduh hiji grid, sareng balancer gaduh sababaraha grids ku nami proyék. Bisa proxy salajengna ku ngaran domain.

Paménta kami ngalangkungan domain dina port 80 sareng direngsekeun kana grup wadahna anu nyayogikeun domain ieu.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Naon deui masalah anu aya? Ieu naon sakabeh peti ngajalankeun salaku root sacara standar. Ieu akar teu sarua jeung host root tina sistem.

Nanging, upami anjeun ngalebetkeun wadahna, éta bakal janten akar sareng file anu urang jieun dina wadah ieu ngagaduhan hak akar.

Upami pamekar ngalebetkeun wadahna sareng ngalaksanakeun sababaraha paréntah anu ngahasilkeun file, teras ngantunkeun wadahna, teras anjeunna gaduh file dina diréktori kerjana anu anjeunna henteu gaduh aksés.

Kumaha bisa direngsekeun? Anjeun tiasa nambihan pangguna anu bakal aya dina wadahna.

Masalah naon anu timbul nalika urang nambihan pangguna?

Nalika nyiptakeun pangguna, urang sering henteu gaduh ID grup (UID) sareng ID pangguna (GID) anu sami.

Pikeun ngajawab masalah ieu dina wadahna, kami nganggo pamaké kalawan ID 1000.

Dina hal urang, ieu coincided jeung kanyataan yén ampir kabéh pamekar ngagunakeun OS Ubuntu. Sareng dina Ubuntu, pangguna munggaran ngagaduhan ID 1000.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

Naha urang gaduh rencana?

Baca dokuméntasi Docker. Proyék ieu aktip ngembang, dokuméntasina robih. Data anu katampi dua atanapi tilu bulan kapengker parantos lami-lami janten katinggaleun jaman.

Sababaraha masalah anu ku urang direngsekeun sigana parantos direngsekeun ku cara standar.

Janten abdi hoyong langkung jauh parantos langsung ka orkestrasi.

Hiji conto nyaéta mékanisme diwangun Docker anu disebut Docker Swarm, anu kaluar tina kotak. Abdi hoyong ngajalankeun hiji hal dina produksi dumasar kana téknologi Docker Swarm.

Wadah spawning ngajadikeun teu merenah pikeun digawe sareng log. Ayeuna log diisolasi. Éta sumebar dina peti. Salah sahiji pancén nyaéta nyieun aksés merenah kana log ngaliwatan panganteur web.

Pangembangan sareng prosés tés sareng Docker sareng Gitlab CI

sumber: www.habr.com

Tambahkeun komentar