Chaining CI / CD dan otomatisasi Docker

Saya menulis situs pertama saya di akhir tahun 90an. Kemudian membawa mereka ke dalam kondisi kerja sangat sederhana. Ada server Apache di beberapa hosting bersama, Anda bisa masuk ke server ini melalui FTP, menulis sesuatu seperti itu di baris browser ftp://ftp.example.com. Maka itu perlu untuk memasukkan nama dan kata sandi dan mengunggah file ke server. Ada waktu lain, semuanya lebih mudah daripada sekarang. Selama dua dekade terakhir, semuanya telah banyak berubah. Situs menjadi lebih kompleks, mereka harus dirakit sebelum dirilis ke produksi. Satu server tunggal telah menjadi sejumlah server yang bekerja di belakang load balancers, penggunaan sistem kontrol versi telah menjadi hal biasa.





Untuk proyek pribadi saya, saya memiliki konfigurasi khusus. Dan saya tahu bahwa saya membutuhkan kemampuan untuk menyebarkan situs dalam produksi, hanya melakukan satu tindakan: menulis kode ke cabang masterdi GitHub. Selain itu, saya tahu bahwa untuk memastikan pengoperasian aplikasi web kecil saya, saya tidak ingin mengelola kluster Kubernet yang besar, atau menggunakan teknologi Docker Swarm, atau memelihara taman server dengan pod, agen, dan segala macam kesulitan lainnya. Untuk mencapai tujuan menyederhanakan pekerjaan sebanyak mungkin, saya harus berkenalan dengan CI / CD.

Jika Anda memiliki proyek kecil (dalam kasus kami, kami berbicara tentang proyek Node.js) dan Anda ingin mempelajari cara mengotomatiskan penyebaran proyek ini, sambil memastikan bahwa apa yang disimpan dalam repositori sama persis dengan apa yang berhasil dalam produksi, saya pikir Anda mungkin tertarik pada artikel ini.

Prasyarat


Pembaca artikel ini diharapkan memiliki pengetahuan dasar tentang area baris perintah dan menulis skrip Bash. Selain itu, ia akan membutuhkan akun Travis CI dan Docker Hub .

Tujuan


Saya tidak akan mengatakan bahwa artikel ini tanpa syarat dapat disebut "manual pelatihan." Ini lebih merupakan sebuah dokumen di mana saya berbicara tentang apa yang saya pelajari dan menggambarkan proses pengujian dan penerapan kode dalam produksi yang cocok untuk saya, dilakukan dalam satu pass otomatis.

Beginilah alur kerja saya berakhir.

Kecuali untuk kode yang dikirim ke cabang repositori, mastertindakan berikut dilakukan:

  • Bangun proyek di atas Travis CI.
  • Semua unit, tes integrasi dan end-to-end dilakukan.

Hanya untuk kode yang masuk ke masterkode berikut:

  • Semua yang dikatakan di atas, ditambah ...
  • Bangun gambar Docker berdasarkan kode, pengaturan, dan lingkungan saat ini.
  • Menempatkan gambar di Docker Hub.
  • Koneksi ke server produksi.
  • Mengunggah gambar dari Docker Hub ke server.
  • Hentikan wadah saat ini dan mulai yang baru berdasarkan gambar baru.

Jika Anda sama sekali tidak tahu tentang Docker, tentang gambar dan wadah - jangan khawatir. Saya akan menceritakan semua tentang ini kepada Anda.

Apa itu CI / CD?


Singkatan CI / CD singkatan dari "integrasi berkelanjutan / penerapan terus menerus" - "integrasi berkelanjutan / penerapan berkelanjutan."

Integration Integrasi berkelanjutan


Integrasi berkelanjutan adalah proses di mana pengembang membuat komit ke repositori utama dari kode sumber proyek (biasanya ke cabang master). Pada saat yang sama, kualitas kode dipastikan dengan melakukan pengujian otomatis.

▍ Penerapan berkelanjutan


Penyebaran terus-menerus adalah penyebaran kode yang sering dilakukan secara otomatis dalam produksi. Bagian kedua dari singkatan CI / CD kadang-kadang diungkapkan sebagai "pengiriman kontinu" ("pengiriman kontinu"). Ini, secara umum, sama dengan "penyebaran berkelanjutan", tetapi "pengiriman berkelanjutan" menyiratkan perlunya konfirmasi perubahan secara manual sebelum memulai proses penyebaran proyek.

Awal pekerjaan


Aplikasi yang saya kuasai semuanya disebut TakeNote . Ini adalah proyek web yang sedang saya kerjakan, yang dirancang untuk membuat catatan. Pertama, saya mencoba membuat proyek JAMStack , atau hanya aplikasi frontend tanpa server, untuk mengambil keuntungan dari hosting standar dan kemampuan penyebaran yang ditawarkan oleh Netlify . Ketika kompleksitas aplikasi bertambah, saya perlu membuat bagian servernya, yang berarti saya perlu merumuskan strategi saya sendiri untuk integrasi otomatis dan penyebaran otomatis proyek.

Dalam kasus saya, aplikasi adalah server Express yang berjalan di lingkungan Node.js, melayani aplikasi Bereaksi satu halaman dan mendukung API server yang aman. Arsitektur ini mengikuti strategi yang ditemukan dalam panduan otentikasi tumpukan penuh ini .

Saya berkonsultasi dengan seorang teman yang merupakan pakar otomatisasi dan bertanya kepadanya apa yang perlu saya lakukan untuk membuatnya bekerja seperti yang saya butuhkan. Dia memberi saya gambaran tentang bagaimana seharusnya alur kerja otomatis, yang diuraikan di bagian Tujuan artikel ini. Fakta bahwa saya menetapkan sendiri tujuan seperti itu berarti saya harus memikirkan cara menggunakan Docker.

Buruh pelabuhan


Docker adalah alat yang, berkat teknologi containerisasi, membuatnya mudah untuk mendistribusikan aplikasi, serta menyebarkan dan meluncurkannya di lingkungan yang sama, bahkan jika platform Docker sendiri bekerja di lingkungan yang berbeda. Sebagai permulaan, saya perlu memiliki alat baris perintah Docker (CLI) yang saya inginkan. Petunjuk untuk menginstal Docker tidak bisa disebut sangat jelas dan dapat dimengerti, tetapi Anda dapat belajar darinya bahwa untuk mengambil langkah pertama instalasi, Anda harus mengunduh Docker Desktop (untuk Mac atau Windows).

Docker Hub hampir sama dengan GitHub untuk repositori git, atau registri npmuntuk paket JavaScript. Ini adalah repositori online untuk gambar Docker. Terhubung ke itu Docker Desktop.

Jadi, untuk memulai Docker, Anda perlu melakukan dua hal:


Setelah itu, Anda dapat memverifikasi bahwa Docker CLI berfungsi dengan menjalankan perintah berikut untuk memverifikasi versi Docker:

docker -v

Selanjutnya, masuk ke Docker Hub dengan memasukkan, ketika ditanya, nama pengguna dan kata sandi Anda:

docker login

Untuk menggunakan Docker, Anda harus memahami konsep gambar dan wadah.

▍ Gambar


Gambar adalah sesuatu seperti rencana yang berisi instruksi untuk membangun wadah. Ini adalah snapshot abadi dari sistem file dan pengaturan aplikasi. Pengembang dapat dengan mudah berbagi gambar.

#     
docker images

Perintah ini akan menampilkan tabel dengan tajuk berikut:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Selanjutnya, kita akan mempertimbangkan beberapa contoh perintah dalam format yang sama - pertama datang perintah dengan komentar, dan kemudian contoh apa yang bisa dihasilkan.

▍Kontainer


Wadah adalah paket yang dapat dieksekusi yang berisi semua yang Anda butuhkan untuk menjalankan aplikasi. Aplikasi dengan pendekatan ini akan selalu bekerja sama, terlepas dari infrastruktur: di lingkungan yang terisolasi dan di lingkungan yang sama. Intinya adalah bahwa di lingkungan yang berbeda, contoh gambar yang sama diluncurkan.

#   
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

Tag


Tag adalah indikasi versi gambar tertentu.

▍ Ringkasan Perintah Docker


Berikut ini adalah ikhtisar dari beberapa perintah Docker yang umum digunakan.
Tim
Konteks
Bertindak
membangun buruh pelabuhan
Bentuk
Merakit gambar dari Dockerfile
tag buruh pelabuhan
Bentuk
Penandaan gambar
gambar buruh pelabuhan
Bentuk
Mendaftar gambar
buruh pelabuhan lari
Wadah
Peluncuran kontainer berbasis gambar
mendorong buruh pelabuhan
Bentuk
Mengirimkan gambar ke registri
buruh pelabuhan menarik
Bentuk
Unduh gambar dari registri
buruh pelabuhan ps
Wadah
Daftar kontainer
pemangkas sistem buruh pelabuhan
Gambar / Wadah
Menghapus wadah dan gambar yang tidak digunakan

▍ Dockerfile


Saya tahu cara menjalankan aplikasi produksi secara lokal. Saya memiliki konfigurasi Webpack yang dirancang untuk membangun aplikasi Bereaksi yang sudah jadi. Selanjutnya, saya memiliki perintah yang memulai server berbasis Node.js di port 5000. Ini terlihat seperti ini:

npm i         #  
npm run build #  React-
npm run start #  Node-

Perlu dicatat bahwa saya tidak memiliki contoh aplikasi untuk materi ini. Tapi di sini, untuk eksperimen, aplikasi Node sederhana apa pun cocok.

Untuk menggunakan wadah, Anda harus memberikan instruksi Docker. Ini dilakukan melalui file yang disebut Dockerfileterletak di direktori root proyek. File ini, pada awalnya, tampak sangat tidak jelas.

Tetapi apa yang ada di dalamnya hanya menjelaskan, dengan perintah khusus, sesuatu yang mirip dengan pengaturan lingkungan kerja. Berikut beberapa perintah ini:

  • FROM - Perintah ini memulai file. Ini menunjukkan gambar dasar berdasarkan wadah yang dibangun.
  • SALIN - Menyalin file dari sumber lokal ke wadah.
  • WORKDIR - Mengatur direktori kerja untuk perintah-perintah berikut.
  • RUN - Menjalankan perintah.
  • EXPOSE - Pengaturan Port.
  • ENTRYPOINT - Menentukan perintah yang akan dijalankan.

Dockerfile mungkin terlihat seperti ini:

#   
FROM node:12-alpine

#        app/
COPY . app/

#  app/    
WORKDIR app/

#   ( npm ci  npm i,     )
RUN npm ci --only-production

#   React-  
RUN npm run build

#   
EXPOSE 5000

#  Node-
ENTRYPOINT npm run start

Tergantung pada gambar dasar yang dipilih, Anda mungkin perlu menginstal dependensi tambahan. Faktanya adalah bahwa beberapa gambar dasar (seperti Node Alpine Linux) dirancang untuk membuatnya seringkas mungkin. Akibatnya, mereka mungkin tidak memiliki beberapa program yang Anda andalkan.

▍ Bangun, tandai, dan luncurkan wadah


Perakitan lokal dan peluncuran kontainer, setelah kami miliki Dockerfile, tugasnya cukup sederhana. Sebelum mengirim gambar ke Docker Hub, Anda harus mengujinya secara lokal.

▍ Majelis


Pertama, Anda perlu mengumpulkan gambar dengan menentukan nama, dan, secara opsional, tag (jika tag tidak ditentukan, sistem akan secara otomatis menetapkan tag ke gambar latest).

#  
docker build -t <image>:<tag> .

Setelah menjalankan perintah ini, Anda dapat mengamati bagaimana Docker membangun gambar.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...  ...
Successfully built 123456789123
Successfully tagged <image>:<tag>

Perakitan mungkin memakan waktu beberapa menit - itu semua tergantung pada berapa banyak dependensi yang Anda miliki. Setelah perakitan selesai, Anda dapat menjalankan perintah docker imagesdan melihat deskripsi gambar baru Anda.

REPOSITORY          TAG               IMAGE ID            CREATED              SIZE
<image>             latest            123456789123        About a minute ago   x.xxGB

▍ Mulai


Gambar dibuat. Dan ini berarti bahwa atas dasar itu mungkin untuk meluncurkan wadah. Karena saya ingin dapat mengakses aplikasi yang berjalan di wadah di alamat yang localhost:5000saya 5000:5000instal di sisi kiri pasangan di perintah berikutnya 5000. Di sisi kanan adalah pelabuhan kontainer.

#      5000    5000
docker run -p 5000:5000 <image>:<tag>

Sekarang wadah dibuat dan diluncurkan, Anda dapat menggunakan perintah docker psuntuk melihat informasi tentang wadah ini (atau Anda dapat menggunakan perintah docker ps -ayang menampilkan informasi tentang semua kontainer, bukan hanya yang berfungsi).

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                      PORTS                    NAMES
987654321234        <image>             "/bin/sh -c 'npm run…"   6 seconds ago        Up 6 seconds                0.0.0.0:5000->5000/tcp   stoic_darwin

Jika Anda pergi ke alamat sekarang localhost:5000, Anda dapat melihat halaman aplikasi yang berfungsi, yang terlihat persis sama dengan halaman aplikasi yang bekerja di lingkungan produksi.

▍ Penugasan dan Publikasi Tag


Untuk menggunakan salah satu gambar yang dibuat di server produksi, kita harus dapat mengunduh gambar ini dari Docker Hub. Ini berarti Anda harus terlebih dahulu membuat repositori untuk proyek di Docker Hub. Setelah itu, kami akan memiliki tempat kami di mana Anda dapat memperbaiki gambar. Gambar harus diganti namanya agar namanya dimulai dengan nama pengguna kami di Docker Hub. Setelah ini harus menjadi nama repositori. Di akhir nama bisa berupa tag apa saja. Berikut ini adalah contoh penamaan gambar menggunakan skema ini.

Sekarang Anda dapat mengumpulkan gambar dengan nama baru dan menjalankan perintah docker pushuntuk mengirimnya ke repositori Docker Hub.

docker build -t <username>/<repository>:<tag> .
docker tag <username>/<repository>:<tag> <username>/<repository>:latest
docker push <username>/<repository>:<tag>

#     , , :
docker build -t user/app:v1.0.0 .
docker tag user/app:v1.0.0 user/app:latest
docker push user/app:v1.0.0

Jika semuanya berjalan dengan baik, gambar akan tersedia di Docker Hub dan dapat dengan mudah diunduh ke server atau ditransfer ke pengembang lain.

Langkah selanjutnya


Sampai saat ini, kami telah memastikan bahwa aplikasi, dalam bentuk wadah Docker, berfungsi secara lokal. Kami mengunggah wadah ke Docker Hub. Semua ini berarti bahwa kami telah membuat kemajuan yang sangat baik menuju sasaran. Sekarang kita perlu menyelesaikan dua pertanyaan lagi:

  • Mengkonfigurasi alat CI untuk menguji dan menggunakan kode.
  • Menyiapkan server produksi sehingga dapat memuat dan menjalankan kode kami.

Dalam kasus kami, Travis CI digunakan sebagai solusi CI / CD . Sebagai server - DitigalOcean .

Perlu dicatat bahwa di sini Anda dapat menggunakan kombinasi layanan lainnya. Misalnya, alih-alih Travis CI, Anda dapat menggunakan CircleCI atau Tindakan Github. Dan bukannya DigitalOcean - AWS atau Linode.

Kami memutuskan untuk bekerja dengan Travis CI, dan dalam layanan ini saya sudah memiliki sesuatu yang dikonfigurasi. Karena itu, sekarang saya akan berbicara singkat tentang bagaimana mempersiapkannya untuk pekerjaan.

Travis ci


Travis CI adalah alat untuk menguji dan menggunakan kode. Saya tidak ingin membahas seluk beluk mendirikan Travis CI, karena setiap proyek unik, dan ini tidak akan membawa banyak manfaat. Tetapi saya akan memberi tahu Anda tentang dasar-dasar yang memungkinkan Anda memulai jika Anda memutuskan untuk menggunakan Travis CI. Apa pun yang Anda pilih - Travis CI, CircleCI, Jenkins, atau yang lainnya, metode konfigurasi serupa akan digunakan di mana-mana.

Untuk mulai bekerja dengan Travis CI, kunjungi situs web proyekdan buat akun. Kemudian mengintegrasikan Travis CI dengan akun GitHub Anda. Selama pengaturan sistem, Anda perlu menentukan repositori yang ingin Anda otomatisasi dan memungkinkan aksesnya. (Saya menggunakan GitHub, tapi saya yakin Travis CI dapat berintegrasi dengan BitBucket, GitLab, dan layanan serupa lainnya).

Setiap kali Travis CI diambil untuk bekerja, server diluncurkan yang mengeksekusi perintah yang ditentukan dalam file konfigurasi, termasuk penyebaran cabang repositori yang sesuai.

▍ Siklus hidup tugas


File konfigurasi Travis CI, dipanggil .travis.ymldan disimpan di direktori root proyek, mendukung konsep peristiwa siklus kehidupan pekerjaan. Peristiwa ini terdaftar dalam urutan di mana mereka terjadi:

  • apt addons
  • cache components
  • before_install
  • install
  • before_script
  • script
  • before_cache
  • after_success after_failure
  • before_deploy
  • deploy
  • after_deploy
  • after_script

EstMenguji


Dalam file konfigurasi, saya akan mengkonfigurasi server Travis CI lokal. Sebagai bahasa, saya memilih Node 12 dan menyuruh sistem untuk menginstal dependensi yang diperlukan untuk menggunakan Docker.

Segala sesuatu yang terdaftar di .travis.ymlakan dieksekusi ketika semua menarik permintaan ke semua cabang repositori dieksekusi, kecuali ditentukan lain. Ini adalah fitur yang berguna, karena itu berarti kita dapat menguji semua kode yang masuk ke repositori. Ini memungkinkan Anda untuk mengetahui apakah kode siap ditulis ke cabang masterdan apakah itu akan mengganggu proses pembangunan proyek. Dalam konfigurasi global ini, saya menginstal semuanya secara lokal, memulai server pengembang Webpack di latar belakang (ini adalah fitur alur kerja saya) dan menjalankan tes.

Jika Anda ingin menampilkan ikon dengan informasi tentang cakupan kode di repositori Anda, di sini Anda dapat menemukan instruksi singkat tentang penggunaan Jest, Travis CI dan Coveralls untuk mengumpulkan dan menampilkan informasi ini.

Jadi di sini adalah isi file tersebut .travis.yml:

#  
language: node_js

#   Node.js
node_js:
  - '12'

services:
  #    Docker
  - docker

install:
  #    
  - npm ci

before_script:
  #      
  - npm run dev &

script:
  #  
  - npm run test

Di sini, tindakan yang dilakukan untuk semua cabang repositori dan untuk menarik permintaan berakhir.

▍ Penempatan


Berdasarkan asumsi bahwa semua tes otomatis selesai dengan sukses, kami, secara opsional, dapat menggunakan kode pada server produksi. Karena kami ingin melakukan ini hanya untuk kode dari cabang master, kami memberikan sistem instruksi yang sesuai dalam pengaturan penyebaran. Sebelum Anda mencoba menggunakan kode dalam proyek Anda, yang akan kami pertimbangkan nanti, saya ingin memperingatkan Anda bahwa Anda harus memiliki skrip nyata yang dipanggil untuk ditempatkan.

deploy:
  #  Docker-     Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

Skrip penerapan memecahkan dua masalah:

  • Buat, tandai dan kirim gambar ke Docker Hub menggunakan alat CI (dalam kasus kami, itu adalah Travis CI).
  • Memuat gambar di server, menghentikan wadah lama dan memulai yang baru (dalam kasus kami, server berjalan pada platform DigitalOcean).

Pertama, Anda perlu mengonfigurasi proses perakitan, penandaan, dan pengiriman gambar otomatis ke Docker Hub. Semua ini sangat mirip dengan apa yang sudah kami lakukan secara manual, kecuali bahwa di sini kami memerlukan strategi untuk menetapkan tag unik untuk gambar dan mengotomatiskan login. Saya mengalami kesulitan dengan beberapa detail skrip penerapan, seperti strategi pemberian tag, masuk, menyandi kunci SSH, membuat koneksi SSH. Tapi, untungnya, pacar saya menangani bash dengan sangat baik, serta banyak hal lainnya. Dia membantu saya menulis naskah ini.

Jadi, bagian pertama dari skrip adalah mengirim gambar ke Hub Docker. Ini sangat sederhana. Skema penandaan yang saya gunakan melibatkan penggabungan git hash dan git tag, jika ada. Ini memungkinkan pembuatan tag unik dan menyederhanakan identifikasi rakitan yang menjadi dasarnya. DOCKER_USERNAMEdan DOCKER_PASSWORDmerupakan variabel lingkungan pengguna yang dapat diatur menggunakan antarmuka Travis CI. Travis CI secara otomatis memproses data sensitif sehingga tidak jatuh ke tangan yang salah.

Ini bagian pertama dari skrip deploy.sh.

#!/bin/sh
set -e #     

IMAGE="<username>/<repository>"                             #  Docker
GIT_VERSION=$(git describe --always --abbrev --tags --long) # Git-  

#    
docker build -t ${IMAGE}:${GIT_VERSION} .
docker tag ${IMAGE}:${GIT_VERSION} ${IMAGE}:latest

#   Docker Hub   
echo "${DOCKER_PASSWORD}" | docker login -u "${DOCKER_USERNAME}" --password-stdin
docker push ${IMAGE}:${GIT_VERSION}

Bagian kedua dari skrip akan sepenuhnya tergantung pada host mana yang Anda gunakan dan bagaimana koneksi ke sana diatur. Dalam kasus saya, karena saya menggunakan Digital Ocean, perintah doctl digunakan untuk terhubung ke server . Saat bekerja dengan Aws, sebuah utilitas akan digunakan aws, dan seterusnya.

Menyiapkan server tidak terlalu sulit. Jadi, saya mengatur tetesan berdasarkan gambar dasar. Perlu dicatat bahwa sistem yang saya pilih membutuhkan instalasi manual Docker satu kali dan peluncuran manual Docker satu kali. Saya menggunakan Ubuntu 18.04 untuk menginstal Docker, jadi jika Anda menggunakan Ubuntu untuk melakukan hal yang sama, Anda bisa mengikuti panduan sederhana ini .

Saya tidak berbicara di sini tentang perintah khusus untuk layanan ini, karena aspek ini dapat sangat bervariasi dalam berbagai kasus. Saya hanya akan memberikan rencana tindakan umum yang dilakukan setelah terhubung melalui SSH ke server tempat proyek akan digunakan:

  • Anda perlu menemukan wadah yang sedang berjalan dan menghentikannya.
  • Kemudian, di latar belakang, Anda harus meluncurkan wadah baru.
  • Anda perlu mengatur port server lokal ke nilai 80- ini akan memungkinkan Anda untuk memasukkan situs di alamat formulir example.com, tanpa menentukan port, dan tidak menggunakan alamat seperti example.com:5000.
  • Dan akhirnya, Anda harus menghapus semua wadah dan gambar lama.

Ini adalah kelanjutan dari skrip.

#  ID  
CONTAINER_ID=$(docker ps | grep takenote | cut -d" " -f1)

#   ,  ,  
docker stop ${CONTAINER_ID}
docker run --restart unless-stopped -d -p 80:5000 ${IMAGE}:${GIT_VERSION}
docker system prune -a -f

Beberapa Hal yang Perlu Dipertimbangkan


Mungkin ketika Anda terhubung ke server melalui SSH dari Travis CI, Anda akan melihat peringatan yang tidak akan membiarkan instalasi berlanjut, karena sistem akan menunggu pengguna untuk merespons.

The authenticity of host '<hostname> (<IP address>)' can't be established.
RSA key fingerprint is <key fingerprint>.
Are you sure you want to continue connecting (yes/no)?

Saya belajar bahwa kunci string dapat dikodekan dalam base64 untuk menyimpannya dalam bentuk yang akan nyaman dan dapat diandalkan untuk bekerja dengannya. Pada tahap instalasi, Anda dapat memecahkan kode kunci publik dan menulisnya ke file known_hostsuntuk menghilangkan kesalahan di atas.

echo <public key> | base64 #  < ,   base64>

Dalam praktiknya, perintah ini mungkin terlihat seperti ini:

echo "123.45.67.89 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU
GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3
Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA
t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En
mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx
NrRFi9wrf+M7Q== you@example.com" | base64

Dan inilah yang ia berikan - string base64 yang dikodekan:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Berikut adalah tim yang disebutkan di atas

install:
  - echo <  ,   base64> | base64 -d >> $HOME/.ssh/known_hosts

Pendekatan yang sama dapat digunakan dengan kunci pribadi saat membuat koneksi, karena Anda mungkin memerlukan kunci pribadi untuk mengakses server. Saat bekerja dengan kunci, Anda hanya perlu memastikan penyimpanannya yang aman dalam variabel lingkungan Travis CI, dan agar tidak ditampilkan di mana pun.

Hal lain yang harus Anda perhatikan adalah bahwa Anda mungkin perlu menjalankan seluruh skrip penerapan, disajikan sebagai satu baris, misalnya, menggunakan doctl. Ini mungkin memerlukan beberapa upaya tambahan.

doctl compute ssh <droplet> --ssh-command "    && "

TLS / SSL dan load balancing


Setelah saya melakukan semua yang dibahas di atas, masalah terakhir yang muncul sebelum saya adalah server tidak memiliki SSL. Karena saya menggunakan server Node.js, untuk mendapatkan reverse proxy Nginx dan Let's Encrypt berfungsi , saya perlu mengotak-atik banyak.

Saya benar-benar tidak merasa ingin melakukan semua pengaturan SSL ini secara manual, jadi saya baru saja membuat penyeimbang beban dan mencatat informasi tentang itu di DNS. Dalam kasus DigitalOcean, misalnya, membuat sertifikat yang ditandatangani sendiri yang memperbaharui diri pada penyeimbang beban adalah prosedur yang sederhana, gratis dan cepat. Pendekatan ini memiliki keunggulan tambahan, yang, jika perlu, membuatnya sangat mudah untuk mengkonfigurasi SSL pada berbagai server yang menjalankan load balancer. Ini memungkinkan server sendiri untuk tidak "memikirkan" SSL sama sekali, tetapi gunakan port seperti biasa 80. Jadi pengaturan SSL pada load balancer jauh lebih sederhana dan lebih nyaman daripada metode konfigurasi SSL alternatif.

Sekarang Anda dapat menutup semua port yang menerima koneksi masuk di server - kecuali untuk port yang 80digunakan untuk komunikasi dengan load balancer, dan port 22untuk SSH. Akibatnya, upaya untuk secara langsung mengakses server pada port apa pun, kecuali dua ini, akan gagal.

Ringkasan


Setelah saya melakukan semua yang dijelaskan dalam materi ini, saya tidak lagi takut pada platform Docker atau konsep rantai CI / CD otomatis. Saya dapat mengatur rantai integrasi berkesinambungan di mana kode diuji sebelum masuk ke produksi dan kode tersebut secara otomatis digunakan untuk server. Semua ini bagi saya masih relatif baru, dan saya yakin ada cara untuk meningkatkan alur kerja otomatis saya dan membuatnya lebih efisien. Karena itu, jika Anda memiliki ide tentang hal ini, beri tahu saya . Saya harap artikel ini telah membantu Anda dalam urusan Anda. Saya ingin percaya bahwa setelah membacanya, Anda telah belajar sebanyak yang saya lakukan, sementara saya menemukan semua yang saya katakan tentang itu.

PS Ada gambar di pasar kamiDocker , yang menginstal dalam satu klik. Anda dapat memeriksa pengoperasian wadah di VPS . Semua pelanggan baru diberikan 3 hari gratis untuk pengujian.

Pembaca yang budiman! Apakah Anda menggunakan teknologi CI / CD dalam proyek Anda?


All Articles