Ke hana nei i kahi kaulahao CI/CD a me ka hana automating me Docker

Ua kākau wau i kaʻu mau pūnaewele mua i ka hopena o 90s. I kēlā manawa he mea maʻalahi loa ka hoʻokomo ʻana iā lākou i ka papa hana. Aia kekahi kikowaena Apache ma kahi hoʻokipa like, hiki iā ʻoe ke komo i kēia kikowaena ma o FTP ma ke kākau ʻana i kahi mea like ftp://ftp.example.com. A laila pono ʻoe e hoʻokomo i kou inoa a me ka ʻōlelo huna a hoʻouka i nā faila i ke kikowaena. He mau manawa like ʻole, maʻalahi nā mea a pau i kēlā manawa ma mua o kēia manawa.

Ke hana nei i kahi kaulahao CI/CD a me ka hana automating me Docker

I loko o nā makahiki ʻelua mai ia manawa, ua loli nui nā mea a pau. Ua ʻoi aku ka paʻakikī o nā pūnaewele; pono e hōʻuluʻulu ʻia lākou ma mua o ka hoʻokuʻu ʻia ʻana i ka hana. Hoʻokahi kikowaena hoʻokahi i lilo i mau kikowaena e holo ana ma hope o nā mea kaulike ukana, a ua lilo ka hoʻohana ʻana i nā ʻōnaehana mana mana i mea maʻamau.

No kaʻu papahana pilikino ua loaʻa iaʻu kahi hoʻonohonoho kūikawā. A ua ʻike au he pono iaʻu ka hiki ke hoʻokau i ka pūnaewele i ka hana ʻana ma ka hana ʻana i hoʻokahi hana: ke kākau ʻana i ke code i kahi lālā master ma GitHub. Eia hou, ua ʻike au i mea e hōʻoia ai i ka hana ʻana o kaʻu noi pūnaewele liʻiliʻi, ʻaʻole wau makemake e hoʻokele i kahi pūʻulu Kubernetes nui, a hoʻohana paha i ka ʻenehana Docker Swarm, a mālama paha i nā ʻauwaʻa o nā kikowaena me nā pods, nā mea hana a me nā ʻano mea ʻē aʻe. paʻakikī. I mea e hoʻokō ai i ka pahuhopu o ka hana maʻalahi e like me ka hiki, pono wau e kamaʻāina me CI/CD.

Inā he papahana liʻiliʻi kāu (ma kēia hihia, he papahana Node.js) a makemake ʻoe e ʻike pehea e hoʻomaʻamaʻa ai i ka hoʻolaha ʻana o kēia papahana, ʻoiai e hōʻoiaʻiʻo ana i ka mea i mālama ʻia i loko o ka waihona e like me ka mea e hana ana i ka hana, a laila au. manaʻo paha makemake ʻoe i kēia ʻatikala.

Nā Pono

Manaʻo ka mea heluhelu o kēia ʻatikala e loaʻa i kahi ʻike kumu o ka laina kauoha a kākau i nā palapala Bash. Eia kekahi, pono ʻo ia i nā moʻokāki ʻO Travis CI и Hub hoʻokau.

Nń Pahuhopu

ʻAʻole wau e ʻōlelo e hiki ke kapa ʻia kēia ʻatikala he "aʻo". ʻO kēia kahi palapala aʻu e kamaʻilio ai e pili ana i nā mea aʻu i aʻo ai a wehewehe i ke kaʻina hana e kūpono iaʻu no ka hoʻāʻo ʻana a me ka hoʻoili ʻana i nā code i ka hana ʻana, i hana ʻia i hoʻokahi pass automated.

ʻO kēia kaʻu kaʻina hana i pau ai.

No ke code i kau ʻia i kekahi lālā waihona koe master, hana ʻia kēia mau hana:

  • Hoʻomaka ka papahana ma Travis CI.
  • Hana ʻia nā hoʻokolohua ʻāpana āpau, hoʻohui a me ka hopena.

No ke code wale nō i hāʻule i loko master, hana ʻia kēia:

  • ʻO nā mea a pau i ʻōlelo ʻia ma luna, me ...
  • Ke kūkulu nei i kahi kiʻi Docker e pili ana i ke code o kēia manawa, nā hoʻonohonoho a me ke kaiapuni.
  • Ke kau nei i ke kiʻi iā Docker Hub.
  • Pili i ke kikowaena hana.
  • Hoʻouka i kahi kiʻi mai Docker Hub i ke kikowaena.
  • Ke hooki nei i ka ipu o keia manawa a me ka hoomaka ana i kahi hou ma muli o ke kii hou.

Inā ʻike ʻole ʻoe i kahi mea e pili ana iā Docker, nā kiʻi a me nā ipu, mai hopohopo. E haʻi aku wau iā ʻoe no ia mea.

He aha ka CI/CD?

ʻO ka pōkole CI / CD ke kū nei no ka "hoʻohui mau / hoʻomau mau ʻana."

▍Hoʻohui mau

ʻO ka hoʻohui mau ʻana he hana ia e hana ai nā mea hoʻomohala i ka hoʻopaʻa ʻana i ka waihona kumu kumu kumu nui o ka papahana (maʻa mau he lālā. master). I ka manawa like, hōʻoia ʻia ka maikaʻi o ke code ma o ka hoʻāʻo ʻana.

▍Ka hoʻolaha mau

ʻO ka hoʻomau mau ʻana ʻo ia ka hoʻolaha pinepine ʻana o ke code i ka hana. ʻO ka ʻāpana ʻelua o ka acronym CI/CD i kekahi manawa i wehewehe ʻia ma ke ʻano he "hoʻouna mau." ʻO kēia ka mea like me ka "hoʻomau mau", akā ʻo ka "hoʻouna mau" e hōʻike ana i ka pono e hoʻopaʻa lima i nā loli ma mua o ka hoʻomaka ʻana i ke kaʻina hana hoʻolālā.

noho hoʻomaka 'ana

Ua kapa ʻia ka app aʻu i aʻo ai i kēia mau mea a pau Hoʻomaopopo. He papahana pūnaewele kēia aʻu e hana nei, i hoʻolālā ʻia no ka lawe ʻana i nā memo. I ka wā mua ua hoʻāʻo wau e hana ʻO JAMStack-project, a i ʻole kahi noi mua me ka ʻole o kahi kikowaena, i mea e hoʻohana pono ai i ka hoʻokipa maʻamau a me ka hiki ke hoʻolālā papahana i hāʻawi ʻia. netlify. I ka ulu ʻana o ka paʻakikī o ka noi, pono wau e hana i kāna ʻāpana kikowaena, ʻo ia ka mea e pono iaʻu e hoʻolālā i kaʻu hoʻolālā ponoʻī no ka hoʻohui ʻokoʻa a me ka hoʻolaha ʻana o ka papahana.

I koʻu hihia, ʻo ka palapala noi he kikowaena Express e holo ana ma ka Node.js kaiapuni, e lawelawe ana i kahi palapala noi React ʻaoʻao hoʻokahi a kākoʻo i kahi API ʻaoʻao server palekana. Ke hahai nei kēia hoʻolālā i ka hoʻolālā i hiki ke loaʻa ma keia Ke alakaʻi hōʻoia hōʻoia piha.

Ua kūkākūkā au me hoa, ʻo ia ka mea akamai i ka automation, a nīnau iā ia i kaʻu mea e pono ai e hana i mea e hana ai i ke ala aʻu i makemake ai. Ua hāʻawi mai ʻo ia iaʻu i ka manaʻo o ke ʻano o ke kahe hana automated, i wehewehe ʻia ma ka ʻāpana Goals o kēia ʻatikala. ʻO ka loaʻa ʻana o kēia mau pahuhopu he pono iaʻu e noʻonoʻo pehea e hoʻohana ai iā Docker.

Docker

ʻO Docker kahi mea hana, mahalo i ka ʻenehana containerization, e ʻae i nā noi e hoʻohele maʻalahi ʻia, hoʻoili ʻia a holo i loko o ke kaiapuni like, ʻoiai inā holo ka Docker platform i nā wahi like ʻole. ʻO ka mea mua, pono wau e kau i koʻu mau lima ma luna o nā mea hana laina kauoha Docker (CLI). aʻo ʻAʻole hiki ke kapa ʻia ke alakaʻi hoʻonohonoho Docker i maopopo loa a hoʻomaopopo ʻia, akā mai ia mea hiki iā ʻoe ke aʻo i ka hana ʻana i ka pae hoʻonohonoho mua, pono ʻoe e hoʻoiho i ka Docker Desktop (no Mac a i ʻole Windows).

ʻO Docker Hub ka mea like me GitHub no nā waihona git, a i ʻole ka hoʻopaʻa inoa npm no nā pūʻolo JavaScript. He waihona pūnaewele kēia no nā kiʻi Docker. ʻO kēia ka mea e hoʻopili ai ʻo Docker Desktop.

No laila, i mea e hoʻomaka ai me Docker, pono ʻoe e hana i ʻelua mau mea:

Ma hope o kēia, hiki iā ʻoe ke nānā inā e hana ana ka Docker CLI ma ka holo ʻana i kēia kauoha e nānā i ka mana Docker:

docker -v

A laila, e komo i loko o Docker Hub ma ke komo ʻana i kāu inoa inoa a me kāu ʻōlelo huna ke nīnau ʻia:

docker login

No ka hoʻohana ʻana iā Docker, pono ʻoe e hoʻomaopopo i nā manaʻo o nā kiʻi a me nā ipu.

▍ Nā kiʻi

ʻO ke kiʻi kekahi mea e like me ka polū i loaʻa nā ʻōlelo kuhikuhi no ka hoʻohui ʻana i ka ipu. He kiʻi paʻi hiki ʻole kēia o ka ʻōnaehana faila a me nā hoʻonohonoho. Hiki i nā mea hoʻomohala ke kaʻana like i nā kiʻi.

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

Na kēia kauoha e hoʻopuka i kahi papaʻaina me kēia poʻomanaʻo:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

A laila e nānā mākou i kekahi mau hiʻohiʻona o nā kauoha ma ke ʻano like - ʻo ka mua aia kahi kauoha me kahi ʻōlelo, a laila he laʻana o ka mea hiki ke hoʻopuka.

▍Nā pahu

ʻO kahi pahu kahi pūʻolo hoʻokō e loaʻa nā mea āpau e pono ai e holo i kahi noi. ʻO kahi noi me kēia ala e hana like ia, me ka nānā ʻole i ka ʻōnaehana: i kahi kaʻawale a i kahi kaiapuni like. ʻO ka manaʻo, ua hoʻokuʻu ʻia nā hiʻohiʻona o ke kiʻi like i nā kaiapuni like ʻole.

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

▍ Nā Leʻi

ʻO kahi hōʻailona he hōʻailona o kahi mana kikoʻī o kahi kiʻi.

▍ He kuhikuhi wikiwiki i nā kauoha Docker

Eia kahi hiʻohiʻona o kekahi mau kauoha Docker maʻamau.

hui

Pōʻaiapili

kanawai

kūkulu hale hana

Kiʻi

Ke kūkulu nei i kiʻi mai kahi Dockerfile

hōʻailona kauā

Kiʻi

Kau inoa kiʻi

kiʻi kiʻi makecker

Kiʻi

Ke papa inoa nei i nā kiʻi

holo ka hana

Container

Ke holo nei i kahi ipu ma muli o ke kiʻi

hoʻokuʻu ʻana i ka pahu

Kiʻi

Ke hoʻouka ʻana i kahi kiʻi i ke kākau inoa

huki moku

Kiʻi

Ke hoʻouka nei i kahi kiʻi mai ka papa inoa

mele pāʻani

Container

Ka helu ʻana i nā ipu

ʻO ka ʻōnaehana docker prune

Kiʻi/Paʻa

Ke wehe nei i nā pahu i hoʻohana ʻole ʻia a me nā kiʻi

▍Dockerfile

ʻIke wau pehea e holo ai i kahi noi hana ma ka ʻāina. Loaʻa iaʻu kahi hoʻonohonoho Webpack i hoʻolālā ʻia e kūkulu i kahi noi React mākaukau. A laila, loaʻa iaʻu kahi kauoha e hoʻomaka i kahi kikowaena Node.js ma ke awa 5000. Penei kona ano:

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

Pono e hoʻomaopopo ʻia ʻaʻohe oʻu palapala hoʻohālike no kēia mea. Eia naʻe, no nā hoʻokolohua, e hana kekahi noi Node maʻalahi.

I mea e hoʻohana ai i ka ipu, pono ʻoe e hāʻawi i nā ʻōlelo aʻoaʻo iā Docker. Hana ʻia kēia ma o kahi faila i kapa ʻia Dockerfile, aia ma ka papa kuhikuhi kumu o ka papahana. ʻO kēia faila, i ka wā mua, he mea hiki ʻole ke hoʻomaopopo.

Akā ʻo ka mea i loko e wehewehe wale, me nā kauoha kūikawā, kahi mea e like me ka hoʻonohonoho ʻana i kahi ʻano hana. Eia kekahi o kēia mau kauoha:

  • FROM — Hoʻomaka kēia kauoha i kahi faila. Hōʻike ia i ke kiʻi kumu i kūkulu ʻia ai ka ipu.
  • kope - Ke kope ʻana i nā faila mai kahi kumu kūloko i kahi pahu.
  • HANA — Ka hoonoho ana i ka papa kuhikuhi hana no keia mau kauoha.
  • e holo aku - Holo i nā kauoha.
  • OLELO HOAKAKA — Hoonohonoho awa.
  • KUMU KOMO — Hoailona o ke kauoha e hookoia.

Dockerfile e like paha me kēia:

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

Ma muli o ke kiʻi kumu āu e koho ai, pono paha ʻoe e hoʻokomo i nā mea hilinaʻi hou. ʻO ka mea ʻoiaʻiʻo, ua hana ʻia kekahi mau kiʻi kumu (e like me Node Alpine Linux) me ka pahuhopu o ka hana ʻana iā lākou e like me ka hiki. ʻO ka hopena, ʻaʻohe o lākou mau papahana āu e manaʻo ai.

▍Kūkulu, kāʻili ʻana a me ka holo ʻana i ka ipu

ʻO ka hui kūloko a me ka hoʻomaka ʻana o ka ipu ma hope o mākou Dockerfile, maʻalahi nā hana. Ma mua o kou pana ʻana i ke kiʻi i Docker Hub, pono ʻoe e hoʻāʻo iā ia ma ka ʻāina.

▍ ʻAhui

Pono mua ʻoe e ʻohi kiʻi, e wehewehe ana i ka inoa a me ke koho ʻana, he hōʻailona (inā ʻaʻole i kuhikuhi ʻia kahi hōʻailona, ​​e hoʻonohonoho ʻokoʻa ka ʻōnaehana i kahi hōʻailona i ke kiʻi. latest).

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

Ma hope o ka holo ʻana i kēia kauoha, hiki iā ʻoe ke nānā iā Docker e kūkulu i ke kiʻi.

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

He mau minuke paha ke kūkulu ʻana - pili ia i ka nui o kāu mau hilinaʻi. Ke hoʻopau ʻia ke kūkulu ʻana, hiki iā ʻoe ke holo i ke kauoha docker images a nānā i ka wehewehe ʻana o kāu kiʻi hou.

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

▍ Hoʻomaka

Ua hana ʻia ke kiʻi. ʻO ia ke ʻano hiki iā ʻoe ke holo i kahi pahu ma muli o ia. No ka mea makemake wau e hiki ke komo i ka noi e holo ana i ka ipu ma localhost:5000, iaʻu, ma ka ʻaoʻao hema o lāua 5000:5000 i ke kauoha aʻe i kau ʻia 5000. Aia ma ka ʻaoʻao ʻākau ke awa ipu.

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

I kēia manawa ua hana ʻia ka pahu a holo, hiki iā ʻoe ke hoʻohana i ke kauoha docker ps e nānā i ka ʻike e pili ana i kēia pahu (a i ʻole hiki iā ʻoe ke hoʻohana i ke kauoha docker ps -a, e hōʻike ana i ka ʻike e pili ana i nā pahu a pau, ʻaʻole nā ​​​​mea holo wale).

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

Inā ʻoe e hele i ka helu wahi localhost:5000 — hiki iā ʻoe ke ʻike i kahi ʻaoʻao o kahi noi holo e like me ka ʻaoʻao o kahi noi e holo ana i kahi ʻano hana.

▍Ke kau inoa ʻana a me ka paʻi ʻana

I mea e hoʻohana ai i kekahi o nā kiʻi i hana ʻia ma ka kikowaena hana, pono mākou e hoʻoiho i kēia kiʻi mai Docker Hub. ʻO kēia ka mea e pono ai ʻoe e hana i kahi waihona no ka papahana ma Docker Hub. Ma hope o kēia, e loaʻa iā mākou kahi e hoʻouna ai i ke kiʻi. Pono e kapa hou ʻia ke kiʻi i hoʻomaka kona inoa me kā mākou inoa inoa Docker Hub. Pono e hahai ʻia kēia me ka inoa o ka waihona. Hiki ke kau ʻia kekahi lepili ma ka hope o ka inoa. Aia ma lalo kahi laʻana o ka inoa ʻana i nā kiʻi me ka hoʻohana ʻana i kēia hoʻolālā.

I kēia manawa hiki iā ʻoe ke kūkulu i ke kiʻi me kahi inoa hou a holo i ke kauoha docker push e kiola iā ia i ka waihona 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

Inā maikaʻi nā mea a pau, e loaʻa ke kiʻi ma Docker Hub a hiki ke hoʻouka maʻalahi i ka server a i ʻole e hoʻoili ʻia i nā mea hoʻomohala ʻē aʻe.

Nā ʻanuʻu aʻe

I kēia manawa ua hōʻoia mākou i ka noi, ma ke ʻano o kahi pahu Docker, ke holo nei ma ka ʻāina. Ua hoʻouka mākou i ka pahu i Docker Hub. ʻO ke ʻano o kēia mau mea, ua holomua maikaʻi mākou i kā mākou pahuhopu. I kēia manawa pono mākou e hoʻoponopono i ʻelua mau nīnau:

  • Hoʻonohonoho i kahi mea hana CI no ka hoʻāʻo ʻana a me ka lawe ʻana i ke code.
  • Hoʻonohonoho i ka kikowaena hana i hiki iā ia ke hoʻoiho a holo i kā mākou code.

I kā mākou hihia, hoʻohana mākou ʻO Travis CI. Ma ke ʻano he kikowaena - DitigalOcean.

Pono e hoʻomaopopo ʻia ma aneʻi hiki iā ʻoe ke hoʻohana i kahi hui ʻē aʻe o nā lawelawe. No ka laʻana, ma kahi o Travis CI, hiki iā ʻoe ke hoʻohana i ka CircleCI a i ʻole Github Actions. A ma kahi o DigitalOcean - AWS a i ʻole Linode.

Ua hoʻoholo mākou e hana pū me Travis CI, a ua loaʻa iaʻu kahi mea i hoʻonohonoho ʻia i kēia lawelawe. No laila, i kēia manawa e kamaʻilio pōkole wau e pili ana i ka hoʻomākaukau ʻana no ka hana.

ʻO Travis CI

He mea hana ʻo Travis CI no ka hoʻāʻo ʻana a me ka lawe ʻana i nā code. ʻAʻole makemake wau e komo i loko o nā mea paʻakikī o ka hoʻonohonoho ʻana iā Travis CI, no ka mea he ʻokoʻa kēlā me kēia papahana, ʻaʻole ia e lawe mai i ka pōmaikaʻi nui. Akā, e uhi au i nā kumu e hoʻomaka ai inā hoʻoholo ʻoe e hoʻohana iā Travis CI. Inā ʻoe e koho iā Travis CI, CircleCI, Jenkins, a i ʻole kekahi mea ʻē aʻe, e hoʻohana ʻia nā ʻano hoʻonohonoho like ma nā wahi āpau.

E hoʻomaka me Travis CI, hele i pūnaewele papahana a hana i mooolelo. A laila hoʻohui iā Travis CI me kāu moʻokāki GitHub. I ka hoʻonohonoho ʻana i ka ʻōnaehana, pono ʻoe e kuhikuhi i ka waihona āu e makemake ai e hoʻomaʻamaʻa i ka hana a hiki ke komo i laila. (Hoʻohana wau iā GitHub, akā maopopo iaʻu hiki iā Travis CI ke hoʻohui pū me BitBucket, a me GitLab, a me nā lawelawe like ʻole).

I kēlā me kēia manawa e hoʻomaka ai ʻo Travis CI, hoʻomaka ʻia ke kikowaena, e hoʻokō ana i nā kauoha i kuhikuhi ʻia i ka faila hoʻonohonoho, me ka waiho ʻana i nā lālā waihona e pili ana.

▍ ʻO ka pōʻaiapili ola

Ua kāhea ʻia ka faila hoʻonohonoho Travis CI .travis.yml a mālama ʻia i loko o ka papa kuhikuhi kumu papahana, kākoʻo i ka manaʻo o nā hanana pōʻai ola nā hana. Ua helu ʻia kēia mau hanana ma ke ʻano o ka hana ʻana:

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

▍ Hoʻāʻo

Ma ka waihona hoʻonohonoho e hoʻonohonoho wau i ka kikowaena Travis CI kūloko. Ua koho au iā Node 12 e like me ka ʻōlelo a haʻi i ka ʻōnaehana e hoʻokomo i nā hilinaʻi e pono ai e hoʻohana iā Docker.

ʻO nā mea a pau i heluʻia i loko .travis.yml, e hoʻokō ʻia ke hana ʻia nā noi huki a pau i nā lālā āpau o ka waihona, ke ʻole ke kuhikuhi ʻia. He hiʻohiʻona pono kēia no ka mea hiki iā mākou ke hoʻāʻo i nā code āpau e hele mai i loko o ka waihona. Hōʻike kēia iā ʻoe inā mākaukau ke code e kākau ʻia i ka lālā. master, a inā paha e uhaki ia i ke kaʻina hana kūkulu. Ma kēia hoʻonohonoho honua, hoʻokomo au i nā mea āpau ma ka ʻāina, e holo i ka Webpack dev server ma ke kua (he hiʻohiʻona kēia o kaʻu workflow), a holo i nā hoʻokolohua.

Inā makemake ʻoe i kāu waihona e hōʻike i nā ikona uhi hoʻāʻo, maanei Hiki iā ʻoe ke loaʻa nā ʻōlelo aʻoaʻo pōkole no ka hoʻohana ʻana iā Jest, Travis CI a me Coveralls e hōʻiliʻili a hōʻike i kēia ʻike.

No laila eia ka ʻike o ka faila .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

ʻO kēia kahi e pau ai nā hana i hana ʻia no nā lālā āpau o ka waihona a no nā noi huki.

▍Hoʻohana

Ma muli o ka manaʻo ua hoʻopau kūleʻa nā hoʻokolohua automated āpau, hiki iā mākou, ʻo ia ke koho, e kau i ke code i ka kikowaena hana. No ka mea makemake mākou e hana i kēia no ke code mai ka lālā master, hāʻawi mākou i ka ʻōnaehana i nā ʻōlelo kuhikuhi kūpono i nā hoʻonohonoho hoʻonohonoho. Ma mua o kou hoʻāʻo ʻana e hoʻohana i ke code a mākou e nānā ai ma hope o kāu papahana, makemake wau e aʻo iā ʻoe e loaʻa iā ʻoe kahi palapala maoli i kapa ʻia no ka hoʻolaha ʻana.

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

Hoʻoponopono ka palapala hoʻolālā i nā pilikia ʻelua:

  • E kūkulu, e kau a hoʻouna i ke kiʻi iā Docker Hub me ka hoʻohana ʻana i kahi mea hana CI (i kā mākou hihia, Travis CI).
  • Ke hoʻouka nei i ke kiʻi ma ke kikowaena, hoʻokuʻu i ka pahu kahiko a hoʻomaka i kahi mea hou (i kā mākou hihia, holo ke kikowaena ma ka DigitalOcean platform).

ʻO ka mea mua, pono ʻoe e hoʻonohonoho i kahi kaʻina hana maʻalahi no ke kūkulu ʻana, kau inoa ʻana, a me ka pana ʻana i ke kiʻi i Docker Hub. Ua like loa kēia me nā mea a mākou i hana ai me ka lima, koe wale nō ka pono o ka hoʻolālā no ka hāʻawi ʻana i nā hōʻailona kūʻokoʻa i nā kiʻi a me ka hoʻokomo ʻana i nā loina. Ua pilikia au i kekahi mau kiko'ī o ka palapala hoʻolālā, e like me ka hoʻolālā ʻana, ka hoʻopaʻa inoa, ka hoʻopili kī SSH, ka hoʻokumu ʻana i ka pilina SSH. Akā ʻoi aku ka maikaʻi o kaʻu keikikāne me ka bash, e like me nā mea ʻē aʻe he nui. Ua kōkua ʻo ia iaʻu e kākau i kēia palapala.

No laila, ʻo ka hapa mua o ka palapala e hoʻouka ana i ke kiʻi i Docker Hub. He mea maʻalahi kēia e hana. ʻO ka papa kuhikuhi aʻu i hoʻohana ai e hoʻohui i kahi git hash a me kahi git tag, inā loaʻa kekahi. ʻO kēia ka mea e hōʻoiaʻiʻo ai he ʻokoʻa ka tag a maʻalahi ka ʻike ʻana i ka hui i hoʻokumu ʻia ai. DOCKER_USERNAME и DOCKER_PASSWORD he mau mea hoʻohana kaiapuni i hiki ke hoʻonohonoho ʻia me ka hoʻohana ʻana i ka interface Travis CI. E hoʻoponopono maʻalahi ʻo Travis CI i ka ʻikepili koʻikoʻi i ʻole e hāʻule i nā lima hewa.

Eia ka hapa mua o ka palapala 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}

He aha ka ʻāpana ʻelua o ka palapala e pili ana i ka mea hoʻokipa āu e hoʻohana nei a pehea e hoʻonohonoho ʻia ai ka pilina me ia. I koʻu hihia, ʻoiai ke hoʻohana nei au i Digital Ocean, hoʻohana wau i nā kauoha e hoʻopili i ke kikowaena doctl. Ke hana pū me AWS, e hoʻohana ʻia ka pono aws, a laila.

ʻAʻole paʻakikī loa ka hoʻonohonoho ʻana i ke kikowaena. No laila, hoʻonohonoho wau i kahi droplet ma muli o ke kiʻi kumu. Pono e hoʻomaopopo ʻia ʻo ka ʻōnaehana aʻu i koho ai e koi i kahi hoʻonohonoho manual hoʻokahi o Docker a me kahi hoʻokuʻu lima lima o Docker. Ua hoʻohana au i ka Ubuntu 18.04 e hoʻokomo iā Docker, no laila inā ʻoe e hoʻohana ana iā Ubuntu e hana like, hiki iā ʻoe ke hahai. keia alakaʻi maʻalahi.

ʻAʻole wau e kamaʻilio ma aneʻi e pili ana i nā kauoha kikoʻī no ka lawelawe, no ka mea hiki ke ʻokoʻa kēia ʻano i nā hihia like ʻole. E hāʻawi wale wau i kahi hoʻolālā nui o ka hana e hana ʻia ma hope o ka hoʻopili ʻana ma o SSH i ke kikowaena kahi e kau ʻia ai ka papahana:

  • Pono mākou e ʻimi i ka ipu e holo nei a hoʻōki.
  • A laila pono ʻoe e hoʻomaka i kahi pahu hou ma ke kua.
  • Pono ʻoe e hoʻonoho i ke awa kūloko o ke kikowaena 80 - e ʻae kēia iā ʻoe e komo i ka pūnaewele ma kahi helu like example.com, me ka wehewehe ʻole ʻana i ke awa, ma mua o ka hoʻohana ʻana i kahi helu e like me example.com:5000.
  • ʻO ka hope, pono ʻoe e holoi i nā pahu kahiko a me nā kiʻi.

Eia ka hoʻomau o ka palapala.

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

ʻO kekahi mau mea e hoʻolohe ai

Hiki iā ʻoe ke hoʻohui i ke kikowaena ma o SSH mai Travis CI, e ʻike ʻoe i kahi ʻōlelo aʻo e pale aku iā ʻoe mai ka hoʻomau ʻana i ka hoʻonohonoho ʻana e kali ka ʻōnaehana no ka pane a ka mea hoʻohana.

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

Ua aʻo au e hiki ke hoʻopili ʻia ke kī kaula i base64 i mea e mālama ai i kahi ʻano i hiki ke maʻalahi a hilinaʻi hoʻi. Ma ka pae hoʻonohonoho, hiki iā ʻoe ke hoʻokaʻawale i ke kī lehulehu a kākau iā ia i kahi faila known_hosts i mea e pau ai ka hewa maluna.

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

I ka hoʻomaʻamaʻa, ʻano like paha kēia kauoha:

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

A eia ka mea e hana ai - he string i hoʻopaʻa ʻia base64:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Eia ke kauoha i oleloia maluna

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

Hiki ke hoʻohana ʻia ke ala like me kahi kī pilikino i ka wā e hoʻokumu ai i kahi pilina, no ka mea pono paha ʻoe i kahi kī pilikino e komo ai i ke kikowaena. I ka hana ʻana me ke kī, pono ʻoe e hōʻoia i ka mālama paʻa ʻia i loko o kahi ʻano hoʻololi kaiapuni Travis CI a ʻaʻole i hōʻike ʻia ma nā wahi āpau.

ʻO kahi mea ʻē aʻe e hoʻomaopopo ai, pono paha ʻoe e holo i ka palapala hoʻonohonoho holoʻokoʻa ma ke ʻano hoʻokahi laina, no ka laʻana - me doctl. Pono paha kēia i kahi hoʻoikaika hou.

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

TLS/SSL a me ka hoʻouka ʻana

Ma hope o kaʻu hana ʻana i nā mea a pau i ʻōlelo ʻia ma luna nei, ʻo ka pilikia hope loa aʻu i hālāwai ai, ʻaʻole i loaʻa iā SSL ka server. No ka mea ke hoʻohana nei au i kahi kikowaena Node.js, i mea e hoʻoikaika ai e hana reverse proxy Nginx a Let's Encrypt, pono ʻoe e tinker nui.

ʻAʻole wau i makemake e hana lima i kēia hoʻonohonoho SSL, no laila ua hana wau i kahi mea kaulike ukana a hoʻopaʻa i kāna mau kikoʻī ma DNS. I ka hihia o DigitalOcean, no ka laʻana, ʻo ka hana ʻana i kahi palapala hōʻoia i hoʻopaʻa inoa ponoʻī ʻia ma luna o ka mea kaulike ukana he hana maʻalahi, manuahi a wikiwiki hoʻi. Loaʻa i kēia ala ka pōmaikaʻi hou e maʻalahi ai ka hoʻonohonoho ʻana i ka SSL ma nā kikowaena lehulehu e holo ana ma hope o kahi mea kaulike ukana inā pono. Hāʻawi kēia i nā kikowaena iā lākou iho ʻaʻole e "noʻonoʻo" e pili ana i ka SSL, akā i ka manawa like e hoʻohana i ke awa e like me ka mea maʻamau 80. No laila ʻoi aku ka maʻalahi a ʻoi aku ka maʻalahi o ka hoʻonohonoho ʻana i ka SSL ma luna o kahi mea kaulike ma mua o nā ala ʻē aʻe o ka hoʻonohonoho SSL.

I kēia manawa hiki iā ʻoe ke pani i nā awa a pau ma ke kikowaena e ʻae i nā pilina e komo mai - koe wale ke awa 80, hoʻohana ʻia e kamaʻilio me ka mea hoʻohālikelike ukana, a me ke awa 22 no SSH. ʻO ka hopena, ʻaʻole e hāʻule ka hoʻāʻo e komo pololei i ke kikowaena ma nā awa ʻē aʻe.

Nā hopena

Ma hope o kaʻu hana ʻana i nā mea a pau aʻu i kamaʻilio ai ma kēia mea, ʻaʻole i makaʻu hou ka Docker platform a me nā manaʻo o nā kaulahao CI / CD automated iaʻu. Ua hiki iaʻu ke hoʻonohonoho i kahi kaulahao hoʻohui mau, kahi e hoʻāʻo ʻia ai ke code ma mua o ka hoʻokomo ʻana i ka hana a ua kau ʻia ke code ma ke kikowaena. He mea hou kēia iaʻu, a maopopo iaʻu aia nā ala e hoʻomaikaʻi ai i kaʻu kaʻina hana automated a hoʻomaikaʻi maikaʻi. No laila, inā he manaʻo kou no kēia mea, e ʻoluʻolu e haʻi mai iaʻu. mai iaʻu ike. Manaʻo wau ua kōkua kēia ʻatikala iā ʻoe i kāu mau hana. Makemake wau e manaʻoʻiʻo ma hope o ka heluhelu ʻana, ua aʻo ʻoe e like me kaʻu i aʻo ai i ka ʻike ʻana i nā mea a pau aʻu i kamaʻilio ai.

PS I kā mākou wahi kuai he kii Docker, hiki ke hoʻokomo i hoʻokahi kaomi. Hiki iā ʻoe ke nānā i ka hana o nā ipu ma VPS. Hāʻawi ʻia nā mea kūʻai hou a pau i 3 mau lā o ka hoʻāʻo ʻana me ka uku ʻole.

E nā mea heluhelu aloha! Ke hoʻohana nei ʻoe i nā ʻenehana CI/CD i kāu mau papahana?

Ke hana nei i kahi kaulahao CI/CD a me ka hana automating me Docker

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka