Nyiptakeun ranté CI / CD sareng ngotomatisasi karya sareng Docker

Kuring nulis situs web munggaran kuring dina ahir 90an. Jaman harita éta gampang pisan pikeun nempatkeun aranjeunna dina urutan kerja. Aya hiji server Apache dina sababaraha dibagikeun hosting, anjeun bisa asup kana server ieu via FTP ku nulis hal kawas ftp://ftp.example.com. Teras anjeun kedah ngalebetkeun nami sareng kecap konci anjeun sareng unggah file ka server. Aya waktos anu béda, sadayana langkung saderhana tibatan ayeuna.

Nyiptakeun ranté CI / CD sareng ngotomatisasi karya sareng Docker

Dina dua dekade ti harita, sagalana geus robah pisan. Situs wéb parantos janten langkung kompleks; aranjeunna kedah dirakit sateuacan dileupaskeun kana produksi. Hiji server tunggal jadi loba server ngajalankeun balik balancers beban, sarta pamakéan sistem kontrol versi janten lumrah.

Pikeun proyék pribadi kuring kuring ngagaduhan konfigurasi khusus. Sareng kuring terang yén kuring peryogi kamampuan pikeun nyebarkeun situs dina produksi ku ngan ukur hiji tindakan: nyerat kode ka cabang master dina GitHub. Salaku tambahan, kuring terang yén pikeun mastikeun operasi aplikasi wéb leutik kuring, kuring henteu hoyong ngatur klaster Kubernetes anu ageung, atanapi nganggo téknologi Docker Swarm, atanapi ngajaga armada server sareng pods, agén sareng sagala rupa anu sanés. pajeulitna. Dina raraga ngahontal tujuan nyieun karya sagampangna mungkin, abdi diperlukeun pikeun jadi akrab jeung CI / CD.

Upami Anjeun gaduh proyék leutik (dina hal ieu, proyék Node.js) jeung anjeun hoyong terang kumaha ngajadikeun otomatis deployment proyék ieu, bari mastikeun yén naon anu disimpen dina Repository persis cocog naon gawéna dina produksi, lajeng abdi pikir anjeun bisa jadi kabetot dina artikel ieu.

Prasyarat

Anu maca tulisan ieu diperkirakeun gaduh pamahaman dasar ngeunaan garis paréntah sareng nyerat skrip Bash. Salaku tambahan, anjeunna peryogi akun Travis C.I. и Hub Docker.

gol

Kuring moal nyebutkeun yén artikel ieu tanpa syarat bisa disebut "tutorial". Ieu leuwih ti hiji dokumen nu kuring ngobrol ngeunaan naon geus I diajar sarta ngajelaskeun prosés nu cocog kuring pikeun nguji sarta deploying kode ka produksi, dipigawé dina hiji pass otomatis.

Ieu mangrupikeun alur kerja kuring.

Pikeun kode dipasang kana sagala cabang gudang iwal master, tindakan di handap ieu dilaksanakeun:

  • Proyék ngawangun on Travis CI dimimitian.
  • Sadaya unit, integrasi sareng tés tungtung-ka-tungtung dilaksanakeun.

Ngan pikeun kode nu ragrag kana master, di handap ieu dilaksanakeun:

  • Sadayana anu disebatkeun di luhur, tambah ...
  • Ngawangun gambar Docker dumasar kana kode ayeuna, setélan sareng lingkungan.
  • Nyebarkeun gambar ka Docker Hub.
  • Sambungan ka server produksi.
  • Unggah gambar tina Docker Hub ka server.
  • Ngeureunkeun wadah anu ayeuna sareng ngamimitian anu énggal dumasar kana gambar énggal.

Upami anjeun teu terang nanaon ngeunaan Docker, gambar sareng wadahna, tong hariwang. Kuring gé ngabejaan Anjeun sakabéh ngeunaan eta.

Naon CI / CD?

Singketan CI / CD nangtung pikeun "integrasi kontinyu / panyebaran kontinyu."

▍ Integrasi kontinyu

Integrasi kontinyu mangrupikeun prosés dimana pamekar ngadamel komitmen kana gudang kode sumber utama proyék (biasana cabang master). Dina waktos anu sami, kualitas kode dipastikeun ku uji otomatis.

▍Panyebaran kontinyu

Panyebaran kontinyu mangrupikeun panyebaran kode anu sering, otomatis kana produksi. Bagian kadua akronim CI/CD kadang dieja salaku "pangiriman kontinyu". Ieu dasarna sami sareng "penyebaran kontinyu", tapi "pangiriman kontinyu" nunjukkeun kabutuhan pikeun mastikeun parobahan sacara manual sateuacan ngamimitian prosés panyebaran proyék.

Ngalalanyahan

Aplikasi anu kuring biasa diajar sadayana ieu disebut TakeNote. Ieu mangrupikeun proyék wéb anu kuring damel, dirancang pikeun nyandak catetan. Mimitina kuring nyoba ngalakukeun JAMStack-proyék, atawa ngan hiji aplikasi hareup-tungtung tanpa server a, guna ngamangpaatkeun standar hosting jeung kamampuhan deployment proyék nu ditawarkeunana. Netlify. Salaku pajeulitna aplikasi nu tumuwuh, abdi diperlukeun pikeun nyieun bagian server na, nu dimaksudkan yén kuring bakal perlu ngarumuskeun strategi sorangan pikeun integrasi otomatis tur deployment otomatis tina proyék.

Bisi kuring, aplikasi mangrupa server Express ngajalankeun di lingkungan Node.js, porsi hiji-kaca aplikasi React sarta ngarojong API server-sisi aman. Arsitéktur ieu nuturkeun strategi anu tiasa dipendakan dina dibikeun Pituduh auténtikasi tumpukan lengkep.

Kuring consulted kalawan sobat, Anu ahli automation, sareng naroskeun ka anjeunna naon anu kuring kedah laksanakeun pikeun ngajantenkeun sadayana jalan anu dipikahoyong. Anjeunna masihan kuring ide kumaha alur kerja otomatis kedahna, digariskeun dina bagian Goals tina tulisan ieu. Ngagaduhan tujuan ieu hartosna kuring kedah terang kumaha ngagunakeun Docker.

Docker

Docker mangrupikeun alat anu, berkat téknologi containerization, ngamungkinkeun aplikasi gampang disebarkeun, disebarkeun sareng dijalankeun dina lingkungan anu sami, sanaos platform Docker nyalira dijalankeun dina lingkungan anu béda. Anu mimiti, kuring kedah kéngingkeun panangan alat garis paréntah Docker (CLI). parentah Pituduh pamasangan Docker henteu tiasa disebat jelas pisan sareng kaharti, tapi ti dinya anjeun tiasa diajar yén pikeun nyandak léngkah pamasangan anu munggaran, anjeun kedah ngaunduh Docker Desktop (pikeun Mac atanapi Windows).

Docker Hub kasarna sami sareng GitHub pikeun repositori git, atanapi pendaptaran npm pikeun pakét JavaScript. Ieu mangrupikeun gudang online pikeun gambar Docker. Ieu naon Docker Desktop nyambung ka.

Janten, pikeun ngamimitian sareng Docker, anjeun kedah ngalakukeun dua hal:

Saatos ieu, anjeun tiasa pariksa naha Docker CLI jalan ku ngajalankeun paréntah di handap ieu pikeun pariksa versi Docker:

docker -v

Salajengna, lebet kana Docker Hub ku ngalebetkeun nami pangguna sareng kecap konci anjeun nalika ditaros:

docker login

Pikeun ngagunakeun Docker, anjeun kedah ngartos konsép gambar sareng wadahna.

▍ Gambar

Hiji gambar mangrupa hal kawas blueprint nu ngandung parentah pikeun assembling wadahna. Ieu mangrupikeun snapshot anu teu tiasa dirobih tina sistem file sareng setélan aplikasi. Pamekar tiasa ngabagi gambar kalayan gampang.

# Вывод сведений обо всех образах
docker images

Paréntah ieu bakal ngahasilkeun méja kalayan lulugu di handap ieu:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Salajengna urang bakal ningali sababaraha conto paréntah dina format anu sami - mimitina aya paréntah kalayan koméntar, teras conto naon anu tiasa kaluaran.

▍Wadahna

Wadahna mangrupikeun pakét anu tiasa dieksekusi anu ngandung sadayana anu diperyogikeun pikeun ngajalankeun aplikasi. Aplikasi sareng pendekatan ieu bakal tiasa dianggo sami, henteu paduli infrastrukturna: di lingkungan anu terasing sareng di lingkungan anu sami. Intina nyaéta yén conto gambar anu sami diluncurkeun dina lingkungan anu béda.

# Перечисление всех контейнеров
docker ps -a
CONTAINER ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES
---

▍Tag

Tag mangrupa indikasi versi husus tina hiji gambar.

▍ Rujukan gancang kana paréntah Docker

Ieu tinjauan sababaraha paréntah Docker anu biasa dianggo.

regu

Kontéks

epek

docker ngawangun

Gambar

Ngawangun gambar tina Dockerfile

tag docker

Gambar

Tag gambar

gambar docker

Gambar

Listing gambar

docker ngaji

wadah

Ngajalankeun wadah dumasar kana gambar

docker docker

Gambar

Unggah gambar ka pendaptaran

docker tarik

Gambar

Ngamuat gambar tina pendaptaran

docker ps

wadah

Listing wadahna

sistem docker prune

Gambar/Wadahna

Nyoplokkeun wadah sareng gambar anu henteu kapake

▍Dockerfile

Kuring terang kumaha ngajalankeun aplikasi produksi sacara lokal. Kuring boga konfigurasi Webpack dirancang pikeun ngawangun hiji siap-dijieun meta aplikasi. Salajengna, abdi gaduh paréntah nu dimimitian server dumasar Node.js on port nu 5000. Sigana mah kieu:

npm i         # установка зависимостей
npm run build # сборка React-приложения
npm run start # запуск Node-сервера

Ieu kudu dicatet yén kuring teu boga conto aplikasi pikeun bahan ieu. Tapi di dieu, pikeun ékspérimén, naon waé aplikasi Node saderhana bakal dilakukeun.

Pikeun ngagunakeun wadahna, anjeun kedah masihan petunjuk ka Docker. Hal ieu dilakukeun ngaliwatan file disebut Dockerfile, ayana dina diréktori akar proyék. Berkas ieu, mimitina, sigana teu kaharti.

Tapi naon anu dikandungna ngan ukur ngajelaskeun, kalayan paréntah khusus, hal anu sami sareng nyetél lingkungan kerja. Ieu sababaraha paréntah ieu:

  • FROM - Paréntah ieu ngamimitian file. Ieu nangtukeun gambar dasar dimana wadahna diwangun.
  • NYALIN - Nyalin file tina sumber lokal kana wadahna.
  • WORKDIR - Nyetél diréktori kerja pikeun paréntah di handap ieu.
  • lalumpatan - Paréntah ngajalankeun.
  • NGABUNGKEUN - Setélan port.
  • ENTRYPOINT - Indikasi paréntah pikeun dieksekusi.

Dockerfile bisa kasampak kawas kieu:

# Загрузить базовый образ
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

Gumantung kana gambar dasar anu anjeun pilih, anjeun panginten kedah pasang katergantungan tambahan. Kanyataan yén sababaraha gambar dasar (sapertos Node Alpine Linux) didamel kalayan tujuan ngajantenkeun kompak-gancang. Hasilna, aranjeunna moal gaduh sababaraha program anu anjeun ngarepkeun.

▍Ngawangun, méré tag sareng ngajalankeun wadahna

assembly lokal sarta peluncuran wadahna téh sanggeus urang boga Dockerfile, tugas anu cukup basajan. Sateuacan anjeun nyorong gambar ka Docker Hub, anjeun kedah nguji sacara lokal.

▍ Majelis

Kahiji maneh kudu ngumpulkeun gambaran, nangtukeun ngaran jeung, optionally, tag (lamun tag teu dieusian, sistem bakal otomatis napelkeun tag ka gambar latest).

# Сборка образа
docker build -t <image>:<tag> .

Saatos ngajalankeun paréntah ieu, anjeun tiasa nonton Docker ngawangun gambar.

Sending build context to Docker daemon   2.88MB
Step 1/9 : FROM node:12-alpine
 ---> ...выполнение этапов сборки...
Successfully built 123456789123
Successfully tagged <image>:<tag>

Pangwangunan tiasa nyandak sababaraha menit - éta sadayana gumantung kana sabaraha katergantungan anjeun. Saatos ngawangun parantos réngsé, anjeun tiasa ngajalankeun paréntah docker images sareng tingali katerangan gambar énggal anjeun.

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

▍ Jalankeun

Gambar geus dijieun. Ieu ngandung harti yén anjeun tiasa ngajalankeun wadahna dumasar kana éta. Kusabab kuring hayang bisa ngakses aplikasi ngajalankeun dina wadahna di localhost:5000, abdi, di sisi kénca pasangan 5000:5000 dina paréntah salajengna dipasang 5000. Di sisi katuhu nyaéta port wadahna.

# Запуск с использованием локального порта 5000 и порта контейнера 5000
docker run -p 5000:5000 <image>:<tag>

Ayeuna wadahna didamel sareng dijalankeun, anjeun tiasa nganggo paréntah docker ps pikeun ningali inpormasi ngeunaan wadah ieu (atanapi anjeun tiasa nganggo paréntah docker ps -a, nu mintonkeun informasi ngeunaan sagala peti, teu ngan ngajalankeun).

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

Lamun ayeuna indit ka alamat localhost:5000 — anjeun tiasa ningali halaman aplikasi anu dijalankeun anu katingalina sami sareng halaman aplikasi anu dijalankeun di lingkungan produksi.

▍ Tagging sareng penerbitan

Dina raraga ngagunakeun salah sahiji gambar dijieun dina server produksi, urang kudu bisa ngundeur gambar ieu ti Docker Hub. Ieu ngandung harti yén anjeun mimitina kudu nyieun Repository pikeun proyék on Docker Hub. Saatos ieu, urang bakal ngagaduhan tempat dimana urang tiasa ngirim gambar. Gambarna kedah diganti namina supados namina dimimitian ku nami pangguna Docker Hub kami. Ieu kedah dituturkeun ku nami Repository. Tag naon waé tiasa ditempatkeun di tungtung nami. Di handap ieu conto ngaran gambar ngagunakeun skéma ieu.

Ayeuna anjeun tiasa ngawangun gambar nganggo nami énggal sareng ngajalankeun paréntahna docker push pikeun nyorong kana gudang 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

Upami sadayana lancar, gambarna bakal sayogi dina Docker Hub sareng tiasa gampang diunggah ka server atanapi ditransferkeun ka pamekar anu sanés.

Léngkah-léngkah salajengna

Ayeuna kami parantos mastikeun yén aplikasi éta, dina bentuk wadah Docker, ngajalankeun sacara lokal. Kami parantos unggah wadahna ka Docker Hub. Sadaya ieu hartosna urang parantos ngadamel kamajuan anu saé pikeun tujuan urang. Ayeuna urang kedah ngajawab dua patarosan deui:

  • Nyetel alat CI pikeun nguji sareng nyebarkeun kode.
  • Nyetél pangladén produksi supados tiasa ngaunduh sareng ngajalankeun kode kami.

Dina kasus urang, urang ngagunakeun Travis C.I.. Salaku server - DitigalOcean.

Perlu dicatet yén di dieu anjeun tiasa nganggo kombinasi jasa anu sanés. Salaku conto, tibatan Travis CI, anjeun tiasa nganggo CircleCI atanapi Github Actions. Jeung tinimbang DigitalOcean - AWS atanapi Linode.

Urang mutuskeun pikeun gawé bareng Travis CI, sarta kuring geus boga hal ngonpigurasi dina layanan ieu. Ku alatan éta, ayeuna kuring bakal ngobrol sakeudeung ngeunaan kumaha carana nyiapkeun eta pikeun digawé.

Travis C.I.

Travis CI mangrupikeun alat pikeun nguji sareng nyebarkeun kode. Abdi teu hoyong lebet kana intricacies nyetel Travis CI, saprak unggal proyék téh unik, sarta ieu moal mawa loba kauntungan. Tapi kuring bakal nutupan dasar pikeun ngamimitian anjeun upami anjeun mutuskeun nganggo Travis CI. Naha anjeun milih Travis CI, CircleCI, Jenkins, atanapi anu sanés, metode konfigurasi anu sami bakal dianggo dimana-mana.

Pikeun ngamimitian sareng Travis CI, angkat ka ramatloka proyék jeung nyieun hiji akun. Teras integrasikeun Travis CI sareng akun GitHub anjeun. Nalika nyetél sistem, anjeun kedah netepkeun gudang dimana anjeun badé ngajadikeun otomatis damel sareng aktipkeun aksés kana éta. (Kuring nganggo GitHub, tapi kuring yakin yén Travis CI tiasa ngahijikeun sareng BitBucket, sareng GitLab, sareng jasa anu sami).

Unggal waktos Travis CI dimimitian, server diluncurkeun, ngalaksanakeun paréntah anu ditunjuk dina file konfigurasi, kalebet nyebarkeun cabang gudang anu saluyu.

▍ Daur hirup padamelan

file konfigurasi Travis CI disebut .travis.yml tur disimpen dina diréktori akar proyék, ngarojong konsép acara siklus kahirupan tugas. Kajadian ieu dibéréndélkeun dina urutan lumangsungna:

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

▍ Nguji

Dina file konfigurasi Kaula bade ngonpigurasikeun server Travis CI lokal. Kuring milih Node 12 salaku basa sareng nyarios ka sistem masang katergantungan anu diperyogikeun pikeun ngagunakeun Docker.

Sagalana nu didaptarkeun di .travis.yml, bakal dieksekusi nalika sagala requests tarikan dijieun ka sadaya cabang Repository nu, iwal mun disebutkeun dieusian. Ieu mangrupikeun fitur anu mangpaat sabab éta hartosna urang tiasa nguji sadaya kode anu asup kana gudang. Ieu ngamungkinkeun anjeun terang upami kodeu siap diserat ka cabang. master, jeung naha éta bakal megatkeun prosés ngawangun proyék. Dina konfigurasi global ieu, abdi install sagalana lokal, ngajalankeun Webpack dev server di tukang (ieu fitur tina workflow kuring), sarta ngajalankeun tés.

Upami anjeun hoyong gudang anjeun ningalikeun lencana anu nunjukkeun sinyalna tés, di dieu Anjeun tiasa manggihan parentah pondok dina pamakéan Jest, Travis CI na Coveralls pikeun ngumpulkeun sarta nembongkeun inpo ieu.

Tah ieu eusi filena .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

Ieu dimana lampah anu dipigawé pikeun sakabéh cabang Repository sarta pikeun requests tarikan tungtung.

▍Panyebaran

Dumasar kana anggapan yén sadaya tés otomatis réngsé suksés, urang tiasa, anu pilihan, nyebarkeun kodeu ka server produksi. Kusabab urang rék ngalakukeun ieu ngan pikeun kode ti cabang master, kami masihan sistem parentah luyu dina setélan deployment. Sateuacan anjeun nyobian nganggo kode anu bakal urang tingali salajengna dina proyék anjeun, kuring hoyong ngingetkeun yén anjeun kedah gaduh naskah anu leres anu disebat pikeun nyebarkeun.

deploy:
  # Собрать Docker-контейнер и отправить его на Docker Hub
  provider: script
  script: bash deploy.sh
  on:
    branch: master

Skrip penyebaran ngarengsekeun dua masalah:

  • Bangun, tag sareng kirimkeun gambar ka Docker Hub nganggo alat CI (bisi kami, Travis CI).
  • Ngamuat gambar dina server, ngeureunkeun wadahna anu lami sareng ngamimitian anu énggal (bisi kami, server dijalankeun dina platform DigitalOcean).

Mimiti, anjeun kedah nyetél prosés otomatis pikeun ngawangun, méré tag, sareng ngadorong gambar ka Docker Hub. Ieu sadayana sami sareng anu urang parantos dilakukeun sacara manual, kecuali urang peryogi strategi pikeun napelkeun tag unik kana gambar sareng otomatis login. Kuring kungsi kasusah jeung sababaraha rinci ngeunaan Aksara deployment, kayaning strategi tagging, login, SSH konci encoding, ngadegna sambungan SSH. Tapi untungna kabogoh kuring pohara alus kalawan bash, sakumaha kalayan loba hal séjén. Anjeunna ngabantosan abdi nyerat naskah ieu.

Janten, bagian mimiti naskah nyaéta unggah gambar ka Docker Hub. Ieu rada gampang pikeun ngalakukeun. Skéma tagging anu kuring dianggo ngalibatkeun ngagabungkeun git Hash sareng git tag, upami aya. Ieu ensures yén tag téh unik tur matak ngamudahkeun pikeun ngaidentipikasi assembly on mana eta dumasar. DOCKER_USERNAME и DOCKER_PASSWORD mangrupakeun variabel lingkungan pamaké nu bisa diatur ngagunakeun panganteur Travis CI. Travis CI bakal otomatis ngolah data sénsitip supados henteu digolongkeun kana panangan anu salah.

Ieu bagian mimiti naskah 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}

Naon bagian kadua naskah bakal gumantung sagemblengna kana host naon anu anjeun anggo sareng kumaha hubunganana diatur. Bisi kuring, saprak kuring nganggo Samudra Digital, kuring nganggo paréntah pikeun nyambung ka server doctl. Nalika damel sareng AWS, utilitas bakal dianggo aws, teras salajengna.

Nyetél pangladén henteu sesah. Janten, kuring nyetél tetesan dumasar kana gambar dasar. Perlu dicatet yén sistem anu kuring pilih butuh pamasangan manual hiji-waktos Docker sareng peluncuran manual Docker hiji-waktos. Kuring nganggo Ubuntu 18.04 pikeun masang Docker, janten upami anjeun ogé nganggo Ubuntu pikeun ngalakukeun anu sami, anjeun tiasa nuturkeun. ieu pituduh basajan.

Kuring teu ngawangkong di dieu ngeunaan paréntah husus pikeun layanan, saprak aspék ieu bisa greatly rupa-rupa dina kasus béda. Kuring ngan ukur bakal masihan rencana umum tindakan anu bakal dilakukeun saatos nyambungkeun via SSH ka server dimana proyékna bakal disebarkeun:

  • Urang kedah milarian wadah anu ayeuna jalan sareng ngeureunkeunana.
  • Teras anjeun kedah ngaluncurkeun wadah énggal di latar tukang.
  • Anjeun kedah nyetél port lokal pangladén 80 - ieu bakal ngidinan Anjeun pikeun nuliskeun situs dina alamat kawas example.com, tanpa nangtukeun port, tinimbang ngagunakeun alamat kawas example.com:5000.
  • Tungtungna, anjeun kedah mupus sadaya wadah sareng gambar anu lami.

Di dieu téh tuluyan tina naskah.

# Найти 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

Sababaraha hal pikeun nengetan

Ieu mungkin nu sawaktos Anjeun nyambung ka server via SSH ti Travis CI, anjeun bakal nempo peringatan anu bakal nyegah anjeun neraskeun instalasi sakumaha sistem bakal ngadagoan respon pamaké.

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)?

Kuring diajar yén konci string bisa disandikeun dina base64 guna nyimpen eta dina formulir nu eta bisa merenah tur reliably digarap kalawan. Dina tahap pamasangan, anjeun tiasa nga-decode konci umum sareng nyerat kana file known_hosts pikeun ngaleungitkeun kasalahan di luhur.

echo <public key> | base64 # выводит <публичный ключ, закодированный в base64>

Dina prakték, paréntah ieu bisa kasampak kawas kieu:

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== [email protected]" | base64

Sareng ieu anu ngahasilkeun - string anu disandikeun base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Ieu paréntah anu disebatkeun di luhur

install:
  - echo < публичный ключ, закодированный в base64> | base64 -d >> $HOME/.ssh/known_hosts

Pendekatan anu sami tiasa dianggo sareng konci pribadi nalika ngadamel sambungan, sabab anjeun panginten peryogi konci pribadi pikeun ngakses server. Nalika damel sareng konci, anjeun ngan ukur kedah mastikeun yén éta disimpen sacara aman dina variabel lingkungan Travis CI sareng henteu ditampilkeun di mana waé.

Hal séjén anu kedah diperhatoskeun nyaéta anjeun kedah ngajalankeun sadaya skrip penyebaran salaku hiji garis, contona - sareng doctl. Ieu bisa merlukeun sababaraha usaha tambahan.

doctl compute ssh <droplet> --ssh-command "все команды будут здесь && здесь"

TLS / SSL sareng Balancing Beban

Sanggeus kuring ngalakukeun sagalana disebutkeun di luhur, masalah panungtungan I encountered éta server teu boga SSL. Kusabab kuring make server Node.js, guna maksakeun gawe proxy sabalikna Nginx sareng Hayu Encrypt, anjeun kedah seueur pisan.

Nyaan kuring henteu hoyong ngalakukeun sadayana konfigurasi SSL ieu sacara manual, janten kuring ngan ukur nyiptakeun load balancer sareng ngarékam detilna dina DNS. Dina kasus DigitalOcean, contona, nyiptakeun sertipikat anu ditandatanganan diri otomatis dina pangimbang beban mangrupikeun prosedur anu sederhana, gratis sareng gancang. Pendekatan ieu ngagaduhan kauntungan tambihan yén éta ngagampangkeun pikeun nyetél SSL dina sababaraha server anu ngajalankeun tukangeun kasaimbangan beban upami diperyogikeun. Hal ieu ngamungkinkeun server sorangan teu "pikir" ngeunaan SSL pisan, tapi dina waktos anu sareng nganggo port sakumaha biasa 80. Janten netepkeun SSL dina pangimbang beban langkung gampang sareng langkung gampang tibatan metode alternatif pikeun nyetél SSL.

Ayeuna anjeun tiasa nutup sadaya palabuhan dina server anu nampi sambungan anu asup - kecuali palabuhan 80, dipaké pikeun komunikasi sareng balancer beban, sarta port 22 pikeun SSH. Hasilna, usaha pikeun langsung ngaksés server dina palabuhan anu sanés ti dua ieu bakal gagal.

hasil

Saatos kuring ngalakukeun sadayana anu kuring nyarioskeun dina bahan ieu, platform Docker atanapi konsép ranté CI / CD otomatis henteu sieun deui. Kuring bisa nyetél ranté integrasi kontinyu, salila kode ieu dites saméméh mana kana produksi jeung kode ieu otomatis deployed on server. Ieu sadayana masih kawilang anyar pikeun kuring, sareng kuring yakin aya cara pikeun ningkatkeun alur kerja otomatis kuring sareng ngajantenkeun langkung éfisién. Janten upami anjeun gaduh ide ngeunaan masalah ieu, punten wartosan kuring. kanggo kuring nyaho. Abdi ngarepkeun tulisan ieu ngabantosan anjeun dina usaha anjeun. Abdi hoyong yakin yén saatos maca éta, anjeun diajar saloba anu kuring diajar bari terangkeun sadayana anu kuring nyarioskeun di dinya.

PS Di urang pasar aya gambar Docker, nu bisa dipasang dina hiji klik. Anjeun tiasa pariksa operasi wadahna di VPS. Sadaya klien anyar dibéré 3 dinten tés gratis.

Pamiarsa Hadirin! Naha anjeun nganggo téknologi CI / CD dina proyék anjeun?

Nyiptakeun ranté CI / CD sareng ngotomatisasi karya sareng Docker

sumber: www.habr.com

Tambahkeun komentar