GitLab untuk Proyek Pengiriman Berkelanjutan pada Teknologi InterSystems: Kontainer

Artikel ini adalah kelanjutan dari artikel tentang organisasi Integrasi Berkelanjutan / proses Pengiriman Berkelanjutan yang mengotomatiskan perakitan, pengujian, dan pengiriman aplikasi yang berlaku untuk solusi berdasarkan platform InterSystems.


Pertimbangkan topik-topik seperti:


  • Wadah 101
  • Wadah pada berbagai tahap siklus pengembangan perangkat lunak
  • Pengiriman Kontinu dengan Kontainer

Wadah 101


Banyak artikel dan buku telah ditulis tentang wadah dan wadah, jadi di sini saya akan membuat pengantar kecil, yang, bagaimanapun, tidak mengklaim sebagai final. Jadi mari kita mulai.


Kontainer, secara teknis, adalah metode virtualisasi di mana kernel dari sistem operasi mendukung beberapa contoh ruang pengguna (wadah) yang terisolasi, bukan satu. Ini terlihat secara visual seperti ini:


Docker vs VM


Penting untuk dicatat bahwa wadah bukan mesin virtual, di sini ada artikel bagus tentang perbedaannya.


Manfaat Wadah


Ada beberapa manfaat menggunakan wadah:


  • Portabilitas
  • Keefektifan
  • Isolasi
  • Ringan
  • Kekekalan

Portabilitas


Wadah berisi aplikasi beserta semua dependensinya. Ini membuatnya mudah untuk menjalankan aplikasi di berbagai lingkungan, seperti server fisik, mesin virtual, lingkungan pengujian dan lingkungan produk, dan cloud.


Selain itu, portabilitas terdiri dari fakta bahwa setelah gambar Docker dipasang dan berfungsi dengan benar, portabilitas akan berfungsi di mana saja jika Docker berfungsi di sana, mis. pada Windows, Linux, dan server MacOS.


Keefektifan


Saat bekerja dengan aplikasi mesin virtual, apakah Anda benar-benar membutuhkan proses OS, program sistem, dll.? Sebagai aturan, tidak, hanya proses aplikasi Anda yang menarik. Kontainer menyediakan persis ini: hanya proses-proses yang jelas dibutuhkan yang diluncurkan dalam wadah, dan tidak lebih. Karena wadah tidak memerlukan sistem operasi terpisah, mereka menggunakan lebih sedikit sumber daya. Mesin virtual sering memakan beberapa gigabyte, sementara sebuah wadah bisa sekecil beberapa megabyte, yang memungkinkan Anda untuk menjalankan lebih banyak wadah daripada mesin virtual di satu server.


Karena kontainer memiliki tingkat pemanfaatan server yang lebih tinggi, lebih sedikit perangkat keras yang diperlukan, sehingga biaya lebih rendah.


Isolasi


Wadah mengisolasi aplikasi dari semua proses lain, dan meskipun beberapa kontainer dapat berjalan di server yang sama, mereka dapat sepenuhnya independen satu sama lain. Setiap interaksi antara wadah harus dinyatakan secara eksplisit. Jika satu wadah gagal, itu tidak mempengaruhi wadah lain dan dapat dengan cepat dimulai kembali. Keamanan juga ditingkatkan dengan isolasi ini. Misalnya, mengeksploitasi kerentanan server web pada host dapat memberikan penyerang akses ke seluruh server, tetapi dalam kasus wadah, penyerang hanya akan mendapatkan akses ke wadah server web.


Ringan


Karena wadah tidak memerlukan OS terpisah, mereka dapat dimulai, dihentikan, atau dimulai kembali dalam hitungan detik, yang akan mempercepat semua proses terkait, termasuk proses Integrasi Berkelanjutan. Anda dapat mulai berkembang lebih cepat dan tidak membuang waktu mengatur lingkungan Anda.


Kekekalan


Infrastruktur yang tidak dapat diubah terdiri dari komponen yang tidak dapat diubah yang diganti untuk setiap penyebaran dan tidak diperbarui. Konsistensi mengurangi ketidakkonsistenan dan memungkinkan Anda untuk dengan mudah dan cepat menggandakan dan berpindah di antara berbagai kondisi aplikasi Anda. Lebih lanjut tentang kekekalan .


Fitur baru


Semua manfaat ini memungkinkan Anda untuk mengelola infrastruktur dan aplikasi Anda dengan cara yang baru.


Orkestrasi


Mesin dan server virtual dari waktu ke waktu sering mendapatkan "kepribadian", yang menyebabkan banyak kejutan yang umumnya tidak menyenangkan di masa depan. Salah satu solusi untuk masalah ini adalah Infrastruktur sebagai Kode (IoC) - manajemen infrastruktur menggunakan model deskriptif menggunakan sistem kontrol versi.


Saat menggunakan IoC, tim penyebaran lingkungan selalu membawa lingkungan target ke konfigurasi yang sama, terlepas dari keadaan awal lingkungan. Ini dicapai dengan secara otomatis mengatur lingkungan yang ada atau dengan menciptakan kembali lingkungan dari awal.


Dengan menggunakan IoC, pengembang membuat perubahan pada deskripsi lingkungan. Selanjutnya, lingkungan target diubah ke keadaan baru. Jika Anda perlu melakukan perubahan pada hari Rabu, uraiannya diedit.


Semua ini jauh lebih mudah dilakukan dengan wadah. Mematikan wadah dan memulai yang baru membutuhkan beberapa detik, dan mengalokasikan mesin virtual baru membutuhkan beberapa menit.


Scaling


Alat orkestrasi juga dapat memberikan penskalaan horisontal berdasarkan beban saat ini. Dimungkinkan untuk menjalankan kontainer sebanyak yang diperlukan saat ini, dan skala aplikasi sesuai. Semua ini juga mengurangi biaya aplikasi.


Wadah pada berbagai tahap siklus hidup perangkat lunak


Pertimbangkan manfaat wadah pada berbagai tahap siklus hidup perangkat lunak.


Siklus Hidup Perangkat Lunak


Pengembangan


Keuntungan yang paling penting adalah kemudahan memulai pengembangan. Setelah menginstal Docker , cukup menjalankan dua perintah: docker pull untuk memuat gambar dan docker run untuk memulainya. Semua dependensi sudah diselesaikan pada tahap pembuatan aplikasi.


Debugging


Semua lingkungan konsisten dan definisi mereka ada, selain itu, mudah untuk menggunakan lingkungan yang diperlukan. Sudah cukup membuat docker pull wadah yang menarik dan menjalankannya.


Pengujian / QA


Jika terjadi kesalahan, lingkungan masalah dan kondisi untuk mereproduksi kesalahan dapat ditransfer bersama wadah. Semua perubahan infrastruktur โ€œdidokumentasikanโ€. Jumlah variabel menurun - versi perpustakaan, kerangka kerja, OS ... Dimungkinkan untuk menjalankan beberapa wadah untuk memparalelkan tes.


Pengiriman


Menggunakan wadah memungkinkan Anda untuk membangun sekali, selain menggunakan wadah Anda memerlukan otomatisasi tingkat tinggi dari proses perakitan dan penyebaran. Pengiriman kontainer suatu aplikasi dapat lebih aman karena isolasi tambahan.


Pengiriman terus menerus


Mari kita beralih dari teori ke praktik. Berikut ini adalah gambaran umum dari solusi otomatisasi perakitan dan pengiriman kami:


CD


Tiga tahap utama dapat dibedakan:


  • Majelis
  • Pengiriman
  • Luncurkan

Majelis


Pada artikel sebelumnya, majelis bersifat inkremental - kami mempertimbangkan perbedaan antara lingkungan saat ini dan basis kode baru dan mengubah lingkungan kami sehingga sesuai dengan basis kode baru. Dengan wadah, setiap perakitan selesai. Hasil build adalah Gambar Docker yang dapat dijalankan di mana saja.


Pengiriman


Setelah gambar kami dikompilasi dan diuji, gambar itu diunggah ke Docker Registry, aplikasi khusus untuk hosting Gambar Docker. Di sana ia dapat mengganti gambar sebelumnya dengan nama yang sama (tag). Misalnya, karena komit baru ke cabang master, kami telah mengumpulkan gambar baru ( MyProject/MyApp:master ), dan jika tes dilewati, kami dapat memperbarui gambar di Docker Registry dan semua orang yang mengunduh MyProject/MyApp:master akan mendapatkan versi baru.


Luncurkan


Akhirnya, gambar harus dimulai. Sistem CD, seperti GitLab, dapat mengelola ini baik secara langsung atau dengan bantuan orkestra khusus, tetapi prosesnya umumnya sama - beberapa gambar diluncurkan, secara berkala memeriksa kinerja dan diperbarui jika versi baru tersedia.


Lihatlah webinar yang menjelaskan langkah-langkah ini.


Atau, dalam hal komitmen:



Dalam konfigurasi pengiriman berkelanjutan kami, kami:


  • Komit kode ke repositori GitLab
  • Kami mengumpulkan gambar
  • Mengujinya
  • Publikasikan gambar baru di Docker Registry kami
  • Perbarui wadah lama ke versi baru dari Docker Registry

Untuk ini kita perlu:


  • Docker
  • Registri Docker
  • Domain terdaftar (opsional, tetapi diinginkan)
  • Alat GUI (opsional)

Docker


Pertama-tama, kita perlu menjalankan Docker. Saya akan merekomendasikan mulai dengan satu server dengan versi Linux yang umum, seperti Ubuntu, RHEL, atau Suse. Saya tidak merekomendasikan memulai dengan distribusi seperti CoreOS, RancherOS, dll. - mereka tidak ditujukan untuk pemula. Ingatlah untuk mengganti driver penyimpanan ke devicemapper .


Jika kita berbicara tentang penyebaran skala besar, kemudian menggunakan alat orkestrasi seperti Kubernetes, Rancher atau Swarm, Anda dapat mengotomatisasi sebagian besar tugas, tetapi kami tidak akan membahasnya (setidaknya dalam kerangka artikel ini).


Registri Docker


Ini adalah wadah pertama yang perlu kita jalankan, ini adalah aplikasi mandiri yang memungkinkan kita untuk menyimpan dan mendistribusikan gambar Docker. Anda perlu menggunakan Docker Registry jika Anda ingin:


  • Kontrol di mana gambar Anda disimpan
  • Memiliki server distribusi gambar
  • Mengintegrasikan penyimpanan dan distribusi gambar ke dalam proses pengembangan

Berikut ini adalah dokumentasi tentang peluncuran dan konfigurasi Registry Docker.


Hubungkan Docker Registry dan GitLab


Untuk menghubungkan Docker Registry ke GitLab, Anda perlu menjalankan Docker Registry dengan dukungan HTTPS . Saya menggunakan Let's Encrypt untuk mendapatkan sertifikat, dan saya mengikuti instruksi ini untuk mendapatkan sertifikat. Setelah memverifikasi bahwa Docker Registry dapat diakses melalui HTTPS (Anda dapat memeriksanya di browser), ikuti instruksi ini untuk menghubungkan Docker Registry ke GitLab. Petunjuk ini berbeda tergantung pada instalasi GitLab Anda dan konfigurasi yang Anda butuhkan. Dalam kasus saya, setup adalah untuk menambahkan sertifikat dan kunci Docker Registry ke /etc/gitlab/ssl , dan baris-baris ini ke /etc/gitlab/gitlab.rb :


 registry_external_url 'https://docker.domain.com' gitlab_rails ['registry_api_url'] = "https://docker.domain.com" 

Setelah mengkonfigurasi ulang GitLab , tab Registry baru muncul, yang memberikan informasi tentang cara memberi nama yang benar pada gambar yang dibuat sehingga muncul di sini.



Domain


Dalam konfigurasi pengiriman berkelanjutan kami, kami akan secara otomatis membuat gambar untuk setiap cabang, dan jika gambar melewati tes, diterbitkan di Docker Registry dan mulai secara otomatis, sehingga aplikasi kami akan secara otomatis digunakan dari semua cabang, misalnya:


  • Beberapa cabang <featureName>.docker.domain.com di <featureName>.docker.domain.com
  • Uji versi di master.docker.domain.com
  • Versi preprod.docker.domain.com di preprod.docker.domain.com
  • Versi produk di prod.docker.domain.com

Untuk melakukan ini, kita memerlukan nama domain dan catatan DNS wildcard yang mengarahkan kembali permintaan ke * .docker.domain.com ke alamat IP docker.domain.com . Atau, Anda dapat menggunakan berbagai port.


Nginx


Karena kami memiliki beberapa lingkungan, kami perlu secara otomatis mengalihkan permintaan ke subdomain ke wadah yang benar. Untuk ini, kita bisa menggunakan Nginx sebagai proxy terbalik. Berikut ini panduannya .


Alat GUI


Untuk mulai bekerja dengan wadah, Anda dapat menggunakan baris perintah atau salah satu antarmuka grafis. Ada banyak yang tersedia, misalnya:


  • Peternak
  • Microbadger
  • Portainer
  • Buruh pelabuhan sederhana ui
  • ...

Mereka memungkinkan Anda untuk membuat kontainer dan mengelolanya dari GUI, bukan CLI. Seperti apa bentuk Rancher:


Peternak


Pelari Gitlab


Seperti sebelumnya, untuk menjalankan skrip di server lain, kita perlu menginstal runner GitLab. Pertanyaan ini dijelaskan secara rinci dalam artikel sebelumnya .


Perhatikan bahwa Anda perlu menggunakan Shell pelaksana, bukan Docker. Executor Docker digunakan ketika Anda membutuhkan sesuatu dari dalam gambar, misalnya, saat membuat aplikasi Android dalam wadah java, dan Anda hanya perlu apk. Dalam kasus kami, artefak adalah seluruh wadah, dan ini membutuhkan Shell pelaksana.


Konfigurasi Pengiriman Berkelanjutan


Sekarang semua komponen yang diperlukan telah dikonfigurasi, Anda dapat mulai membuat konfigurasi pengiriman berkelanjutan.


Majelis


Pertama, kita perlu mengumpulkan gambar.


Kode kami, seperti biasa, disimpan dalam repositori, konfigurasi CD di gitlab-ci.yml , tetapi sebagai tambahan (untuk meningkatkan keamanan) kami akan menyimpan beberapa file yang terkait dengan gambar di server build.


Gitlab.xml


Berisi kode panggilan balik untuk CD. Itu dikembangkan di artikel sebelumnya dan tersedia di GitHub . Ini adalah perpustakaan kecil untuk mengunduh kode, menjalankan berbagai panggilan balik dan kode uji. Lebih baik menggunakan submitula git untuk memasukkan proyek ini atau sesuatu yang serupa dalam repositori Anda. Submodules lebih baik karena lebih mudah untuk tetap up to date. Alternatif lain adalah membuat rilis di GitLab dan mengunduhnya menggunakan perintah ADD yang sudah ada pada saat build.


iris.key


Kunci lisensi. Itu dapat dimuat selama perakitan wadah, dan tidak disimpan di server. Tidak aman untuk menyimpan kunci di repositori. Anda bisa mendapatkan kunci percobaan di WRC atau mencoba Pengalaman IRIS InterSystems .


pwd.txt


File yang berisi kata sandi default. Sekali lagi, menyimpan kata sandi dalam repositori agak tidak aman.


load_ci.script


Sebuah skrip yang:


  • Termasuk Otentikasi OS di InterSystems IRIS
  • Memuat GitLab.xml
  • Menginisialisasi Pengaturan Panggilan Balik GitLab
  • Memuat kode

 set sc = ##Class(Security.System).Get("SYSTEM",.Properties) write:('sc) $System.Status.GetErrorText(sc) set AutheEnabled = Properties("AutheEnabled") set AutheEnabled = $ZBOOLEAN(+AutheEnabled,16,7) set Properties("AutheEnabled") = AutheEnabled set sc = ##Class(Security.System).Modify("SYSTEM",.Properties) write:('sc) $System.Status.GetErrorText(sc) zn "USER" do ##class(%SYSTEM.OBJ).Load(##class(%File).ManagerDirectory() _ "GitLab.xml","cdk") do ##class(isc.git.Settings).setSetting("hooks", "MyApp/Hooks/") do ##class(isc.git.Settings).setSetting("tests", "MyApp/Tests/") do ##class(isc.git.GitLab).load() halt 

Perhatikan bahwa baris pertama sengaja dikosongkan. Jika skrip awal ini selalu sama, Anda bisa menyimpannya di repositori.


gitlab-ci.yml


Sekarang, mari beralih ke konfigurasi pengiriman berkelanjutan:


 build image: stage: build tags: - test script: - cp -r /InterSystems/mount ci - cd ci - echo 'SuperUser' | cat - pwd.txt load_ci.script > temp.txt - mv temp.txt load_ci.script - cd .. - docker build --build-arg CI_PROJECT_DIR=$CI_PROJECT_DIR -t docker.domain.com/test/docker:$CI_COMMIT_REF_NAME . 

Apa yang sedang terjadi di sini?


Pertama-tama, karena proses perakitan gambar hanya dapat mengakses subdirektori dari direktori basis - dalam kasus kami, direktori root repositori, Anda perlu menyalin direktori "rahasia" (yang memiliki GitLab.xml , iris.key , pwd.txt dan load_ci.skript ) untuk repositori hasil kloning.


Selanjutnya, pengguna / kata sandi diperlukan untuk mengakses terminal, jadi kami akan menambahkannya ke load_ci.script (untuk ini kita perlu baris kosong di awal load_ci.script ).


Terakhir, kami membuat Gambar Docker dan docker.domain.com/test/docker:$CI_COMMIT_REF_NAME : docker.domain.com/test/docker:$CI_COMMIT_REF_NAME


di mana $CI_COMMIT_REF_NAME adalah nama cabang. Harap dicatat: bagian pertama dari tag gambar harus cocok dengan nama repositori di GitLab sehingga dapat dilihat pada tab Registry (instruksi yang lebih lengkap untuk penandaan yang benar tersedia di sana).


Dockerfile


Gambar Docker dibuat menggunakan Dockerfile , ini dia:


 FROM docker.intersystems.com/intersystems/iris:2018.1.1.613.0 ENV SRC_DIR=/tmp/src ENV CI_DIR=$SRC_DIR/ci ENV CI_PROJECT_DIR=$SRC_DIR COPY ./ $SRC_DIR RUN cp $CI_DIR/iris.key $ISC_PACKAGE_INSTALLDIR/mgr/ \ && cp $CI_DIR/GitLab.xml $ISC_PACKAGE_INSTALLDIR/mgr/ \ && $ISC_PACKAGE_INSTALLDIR/dev/Cloud/ICM/changePassword.sh $CI_DIR/pwd.txt \ && iris start $ISC_PACKAGE_INSTANCENAME \ && irissession $ISC_PACKAGE_INSTANCENAME -U%SYS < $CI_DIR/load_ci.script \ && iris stop $ISC_PACKAGE_INSTANCENAME quietly 

Tindakan berikut dilakukan:


  • Kami mengambil gambar IRIS InterSystems sebagai dasar. Itu harus ada di Docker Registry Anda. Jika Anda belum pernah bekerja dengan Docker, coba Tampilan Pertama: Docker , yang menjelaskan cara mendapatkan gambar IRIS InterSystems, tambahkan ke Register Docker, dan luncurkan secara manual.
  • Pertama-tama, salin repositori kami (dan direktori "rahasia") di dalam wadah.
  • Salin kunci lisensi dan GitLab.xml ke direktori mgr .
  • Ubah kata sandi ke nilai dari pwd.txt . Perhatikan bahwa pwd.txt dihapus selama operasi ini.
  • Mulai InterSystems IRIS.
  • load_ci.script .
  • IRIS InterSistem berhenti.

Berikut ini sebagian log build
 Running with gitlab-runner 10.6.0 (a3543a27) on docker 7b21e0c4 Using Shell executor... Running on docker... Fetching changes... Removing ci/ Removing temp.txt HEAD is now at 5ef9904 Build load_ci.script From http://gitlab.eduard.win/test/docker 5ef9904..9753a8d master -> origin/master Checking out 9753a8db as master... Skipping Git submodules setup $ cp -r /InterSystems/mount ci $ cd ci $ echo 'SuperUser' | cat - pwd.txt load_ci.script > temp.txt $ mv temp.txt load_ci.script $ cd .. $ docker build --build-arg CI_PROJECT_DIR=$CI_PROJECT_DIR -t docker.eduard.win/test/docker:$CI_COMMIT_REF_NAME . Sending build context to Docker daemon 401.4kB Step 1/6 : FROM docker.intersystems.com/intersystems/iris:2018.1.1.613.0 ---> cd2e53e7f850 Step 2/6 : ENV SRC_DIR=/tmp/src ---> Using cache ---> 68ba1cb00aff Step 3/6 : ENV CI_DIR=$SRC_DIR/ci ---> Using cache ---> 6784c34a9ee6 Step 4/6 : ENV CI_PROJECT_DIR=$SRC_DIR ---> Using cache ---> 3757fa88a28a Step 5/6 : COPY ./ $SRC_DIR ---> 5515e13741b0 Step 6/6 : RUN cp $CI_DIR/iris.key $ISC_PACKAGE_INSTALLDIR/mgr/ && cp $CI_DIR/GitLab.xml $ISC_PACKAGE_INSTALLDIR/mgr/ && $ISC_PACKAGE_INSTALLDIR/dev/Cloud/ICM/changePassword.sh $CI_DIR/pwd.txt && iris start $ISC_PACKAGE_INSTANCENAME && irissession $ISC_PACKAGE_INSTANCENAME -U%SYS < $CI_DIR/load_ci.script && iris stop $ISC_PACKAGE_INSTANCENAME quietly ---> Running in 86526183cf7c . Waited 1 seconds for InterSystems IRIS to start This copy of InterSystems IRIS has been licensed for use exclusively by: ISC Internal Container Sharding Copyright (c) 1986-2018 by InterSystems Corporation Any other use is a violation of your license agreement %SYS> 1 %SYS> Using 'iris.cpf' configuration file This copy of InterSystems IRIS has been licensed for use exclusively by: ISC Internal Container Sharding Copyright (c) 1986-2018 by InterSystems Corporation Any other use is a violation of your license agreement 1 alert(s) during startup. See messages.log for details. Starting IRIS Node: 39702b122ab6, Instance: IRIS Username: Password: Load started on 04/06/2018 17:38:21 Loading file /usr/irissys/mgr/GitLab.xml as xml Load finished successfully. USER> USER> [2018-04-06 17:38:22.017] Running init hooks: before [2018-04-06 17:38:22.017] Importing hooks dir /tmp/src/MyApp/Hooks/ [2018-04-06 17:38:22.374] Executing hook class: MyApp.Hooks.Global [2018-04-06 17:38:22.375] Executing hook class: MyApp.Hooks.Local [2018-04-06 17:38:22.375] Importing dir /tmp/src/ Loading file /tmp/src/MyApp/Tests/TestSuite.cls as udl Compilation started on 04/06/2018 17:38:22 with qualifiers 'c' Compilation finished successfully in 0.194s. Load finished successfully. [2018-04-06 17:38:22.876] Running init hooks: after [2018-04-06 17:38:22.878] Executing hook class: MyApp.Hooks.Local [2018-04-06 17:38:22.921] Executing hook class: MyApp.Hooks.Global Removing intermediate container 39702b122ab6 ---> dea6b2123165 [Warning] One or more build-args [CI_PROJECT_DIR] were not consumed Successfully built dea6b2123165 Successfully tagged docker.domain.com/test/docker:master Job succeeded 

Luncurkan


Kami punya gambar, jalankan. Dalam kasus cabang fitur, Anda dapat menghancurkan wadah lama dan memulai yang baru. Dalam hal lingkungan produk, kita dapat memulai wadah sementara terlebih dahulu dan mengganti wadah sedang jika pengujian berhasil.


Pertama, skrip untuk menghapus wadah yang lama.


 destroy old: stage: destroy tags: - test script: - docker stop iris-$CI_COMMIT_REF_NAME || true - docker rm -f iris-$CI_COMMIT_REF_NAME || true 

Skrip ini menghancurkan wadah yang sedang berjalan dan selalu berhasil (secara default, Docker mengembalikan kesalahan ketika mencoba menghentikan / menghapus wadah yang tidak ada).


Setelah itu, kami meluncurkan wadah baru dan mendaftarkannya sebagai lingkungan.


 run image: stage: run environment: name: $CI_COMMIT_REF_NAME url: http://$CI_COMMIT_REF_SLUG.docker.eduard.win/index.html tags: - test script: - docker run -d --expose 52773 --volume /InterSystems/durable/$CI_COMMIT_REF_SLUG:/data --env ISC_DATA_DIRECTORY=/data/sys --env VIRTUAL_HOST=$CI_COMMIT_REF_SLUG.docker.eduard.win --name iris-$CI_COMMIT_REF_NAME docker.eduard.win/test/docker:$CI_COMMIT_REF_NAME --log $ISC_PACKAGE_INSTALLDIR/mgr/messages.log 

Wadah Nginx secara otomatis mengalihkan permintaan menggunakan VIRTUAL_HOST lingkungan VIRTUAL_HOST ke port yang ditentukan - dalam hal ini, 52773.


Karena perlu untuk menyimpan beberapa data (kata sandi,% SYS, data aplikasi) pada host di InterSystems IRIS, ada fungsi % SYS yang tahan lama yang memungkinkan Anda untuk menyimpan data di host seperti:


  • iris.cpf adalah file konfigurasi utama.
  • Direktori /csp dengan file aplikasi web.
  • /httpd/httpd.conf dengan konfigurasi server Apache pribadi.
  • Direktori /mgr di mana disimpan:
    • Database IRISSYS , IRISTEMP , IRISAUDIT , IRIS , USER .
    • IRIS.WIJ .
    • Direktori /journal menyimpan majalah.
    • Direktori /temp untuk file sementara.
    • Log messages.log , journal.log , SystemMonitor.log .

Untuk mengaktifkan Durable% SYS, argumen volume ditentukan yang ISC_DATA_DIRECTORY - ISC_DATA_DIRECTORY direktori host dan variabel ISC_DATA_DIRECTORY menetapkan direktori untuk menyimpan file% SYS Durable. Direktori ini seharusnya tidak ada, itu akan dibuat secara otomatis.


Dengan demikian, arsitektur aplikasi kemas kami adalah sebagai berikut:


arsitektur aplikasi kemas


Untuk membangun aplikasi seperti itu, kita setidaknya harus membuat satu database tambahan (untuk menyimpan kode aplikasi) dan membuat pemetaannya di area aplikasi. Saya menggunakan lingkup USER untuk menyimpan data aplikasi, karena lingkup ini ditambahkan ke Durable% SYS secara default. Kode aplikasi disimpan dalam wadah sehingga dapat diperbarui.


Berdasarkan hal tersebut di atas, % Pemasang harus:


  • Buat Area APP / Database
  • Unggah kode ke area APP
  • Buat kelas pemetaan aplikasi kita di area USER
  • Lakukan konfigurasi lain (saya membuat aplikasi web CSP dan aplikasi web REST)

Penginstal Kode%
 Class MyApp.Hooks.Local { Parameter Namespace = "APP"; /// See generated code in zsetup+1^MyApp.Hooks.Local.1 XData Install [ XMLNamespace = INSTALLER ] { <Manifest> <Log Text="Creating namespace ${Namespace}" Level="0"/> <Namespace Name="${Namespace}" Create="yes" Code="${Namespace}" Ensemble="" Data="IRISTEMP"> <Configuration> <Database Name="${Namespace}" Dir="/usr/irissys/mgr/${Namespace}" Create="yes" MountRequired="true" Resource="%DB_${Namespace}" PublicPermissions="RW" MountAtStartup="true"/> </Configuration> <Import File="${Dir}Form" Recurse="1" Flags="cdk" IgnoreErrors="1" /> </Namespace> <Log Text="End Creating namespace ${Namespace}" Level="0"/> <Log Text="Mapping to USER" Level="0"/> <Namespace Name="USER" Create="no" Code="USER" Data="USER" Ensemble="0"> <Configuration> <Log Text="Mapping Form package to USER namespace" Level="0"/> <ClassMapping From="${Namespace}" Package="Form"/> <RoutineMapping From="${Namespace}" Routines="Form" /> </Configuration> <CSPApplication Url="/" Directory="${Dir}client" AuthenticationMethods="64" IsNamespaceDefault="false" Grant="%ALL" Recurse="1" /> </Namespace> </Manifest> } /// This is a method generator whose code is generated by XGL. /// Main setup method /// set vars("Namespace")="TEMP3" /// do ##class(MyApp.Hooks.Global).setup(.vars) ClassMethod setup(ByRef pVars, pLogLevel As %Integer = 0, pInstaller As %Installer.Installer) As %Status [ CodeMode = objectgenerator, Internal ] { Quit ##class(%Installer.Manifest).%Generate(%compiledclass, %code, "Install") } /// Entry point ClassMethod onAfter() As %Status { try { write "START INSTALLER",! set vars("Namespace") = ..#Namespace set vars("Dir") = ..getDir() set sc = ..setup(.vars) write !,$System.Status.GetErrorText(sc),! set sc = ..createWebApp() } catch ex { set sc = ex.AsStatus() write !,$System.Status.GetErrorText(sc),! } quit sc } /// Modify web app REST ClassMethod createWebApp(appName As %String = "/forms") As %Status { set:$e(appName)'="/" appName = "/" _ appName #dim sc As %Status = $$$OK new $namespace set $namespace = "%SYS" if '##class(Security.Applications).Exists(appName) { set props("AutheEnabled") = $$$AutheUnauthenticated set props("NameSpace") = "USER" set props("IsNameSpaceDefault") = $$$NO set props("DispatchClass") = "Form.REST.Main" set props("MatchRoles")=":" _ $$$AllRoleName set sc = ##class(Security.Applications).Create(appName, .props) } quit sc } ClassMethod getDir() [ CodeMode = expression ] { ##class(%File).NormalizeDirectory($system.Util.GetEnviron("CI_PROJECT_DIR")) } } 

Saya perhatikan bahwa untuk membuat database bukan pada host, saya menggunakan direktori /usr/irissys/mgr , karena panggilan ##class(%File).ManagerDirectory() mengembalikan path ke direktori untuk Durable% SYS.


Tes


Sekarang jalankan tes.


 test image: stage: test tags: - test script: - docker exec iris-$CI_COMMIT_REF_NAME irissession iris -U USER "##class(isc.git.GitLab).test()" 

Pengiriman


Tes lulus, kami akan mempublikasikan gambar kami di Docker Registry.


 publish image: stage: publish tags: - test script: - docker login docker.domain.com -u user -p pass - docker push docker.domain.com/test/docker:$CI_COMMIT_REF_NAME 

Login / kata sandi dapat diteruskan menggunakan variabel rahasia .


Sekarang gambar ditampilkan di GitLab.



Dan pengembang lain dapat mengunduhnya dari Docker Registry. Pada tab Lingkungan, semua lingkungan kami tersedia untuk dilihat:


Kesimpulan


Seri artikel ini membahas pendekatan umum untuk integrasi berkelanjutan. Mengotomasi perakitan, pengujian, dan pengiriman aplikasi Anda pada platform InterSystems adalah mungkin dan mudah diimplementasikan.


Penggunaan teknologi kontainerisasi akan membantu mengoptimalkan pengembangan aplikasi dan proses penyebaran. Menghilangkan inkonsistensi antar lingkungan membuat pengujian dan debugging lebih mudah. Orkestrasi memungkinkan Anda membuat aplikasi yang dapat diskalakan.


Referensi


Source: https://habr.com/ru/post/id420749/


All Articles