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:

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.

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:

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:

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:

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 =
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