Creando CI/CD catena et automating opus cum Docker

Primas paginas meas nuper 90s scripsi. Retro igitur facillime eos in ordinem redegit. Apache cultor erat alicuius hospitii communis, in hunc servo per FTP scribendo aliquid simile inire potes ftp://ftp.example.com. Tunc nomen tuum et tesseram inire debebas et tabellas servo fasciculos. Variis temporibus, omnia tunc simpliciora erant quam nunc.

Creando CI/CD catena et automating opus cum Docker

In duobus anteactis decenniis deinde omnia multum mutata sunt. Websites magis implicatae factae sunt, colligendae sunt antequam in productionem dimittantur. Unus servulus unus factus est multi servientes ab onere librariorum currentium, et usus systematis versionis communis locus factus est.

Pro personale propositum habui specialem configurationem. Et sciebam me egere facultatem explicandi locum in productione operandi unum tantum agendi: codicem scribendo ad ramum master on GitHub. Praeterea sciebam quod ut operatio applicationis parvae meae telae curaret, nolui ingentem botrum Kubernetes regere, vel technologiam Docker examen uti, vel classem ministrantium cum legumine, agentibus et omnibus aliis conservare. complexiones. Ad finem laboris efficiendi quam facillime assequendum, necesse habui familiarem fieri cum CI/CD.

Si parvum consilium habes (hoc in casu, Node.js) et scire velis automate instruere huius instituti, dum id quod in promptuario repositum est, prorsus congruit illis quae in productione operantur, tunc ego Puto te in hoc articulo interesse posse.

PRAEREQUISITIS

Lector huius articuli expectatur habere basic intelligentiam mandatum lineae et scripturae Bash scripta. Insuper rationibus eget Cogito Ergo C. и Docker hub.

proposita

Non dicam hunc articulum sine condicione "tutoriale" dici posse. Hoc documentum magis est in quo loquimur de iis quae didici et describemus processum qui me probandi et explicandi codicem ad productionem convenit, in uno automated saltu peracto.

Hoc est quod meus workflow finivit esse.

Ad codicem missae ad aliquem repositorium, excepto mastersequuntur actiones fiunt;

  • Exertum aedificare incipit in Travis CI.
  • Omnis unitas, integratio et finis ad-finem probationes peraguntur.

Tantum in codice quod incidit in mastersequens fit;

  • Omnia supradicta, plus...
  • Aedificium Docker imaginem ex currenti codice, occasus et ambitus habet.
  • Imaginem explicant ad Docker Hub.
  • Connection ad productionem server.
  • Imaginem ex Docker Hub discas cum servo.
  • Reprimens hodiernam continens et novam inchoans ex nova imagine.

Si nihil omnino nosti de Docker, imaginibus et vasis, ne cures. Dicam tibi omnia.

Quid est CI/CD?

Abbreviatio CI/CD significat pro "integratione continua/continua instruere".

Continuous integration

Integratio continua est processus in quo developers facere committit in project scriptor principale codice repositorium (plerumque ramum master). Eodem tempore, qualitas codicis per probationem automated conservatur.

Continuus instruere

Continua instruere est crebra, automata instruere ad productionem codicis. Secunda pars CI/CD acronym interdum scripta est ut "partus continua." Hoc fundamentaliter idem est ac "instrumentum continuum", sed "continua traditio" necessitatem importat ad confirmandas mutationes manually antequam processus instituti de instrueretur.

questus Coepi

In app ego discere omne quod dicitur Leva oculos tuos. Hoc est propositum interretialem quo laboro, notandi causa destinata. Primo conatus sum facere JAMStack-proiectum, vel solum applicationem ante-finis sine servo, ut capias commoditatem normae obnoxiae et exstent facultates instruere quas offert. Netlify. Cum multiplicitas applicationis crevit, opus erat ut partem servi sui crearet, quae significabat me meum consilium ad integrationem automated integrationem et automated instruere.

In casu meo, applicatio est servo Expressi currenti in Node.js environment, unius paginae applicatio React ministrans et securam lateris API sustentans. Haec architectura consilium sequitur, quod inveniri potest datum Plena BIBLIOTHECA authentica rector.

Consului aliumqui automationis peritus est, et quaesivit quid mihi opus esset ut id omne opus facere vellem. Ideam mihi dedit quid laboris fluxus automated videretur, delineatum in sectione Metarum huius articuli. Cum haec proposita significasset me opus esse ad instar sicco quomodo Docker uteretur.

Docker

Docker instrumentum est quod propter technologiam continentis applicationes facile distribuitur, explicatur et in eodem ambitu currit, etiam si Docker suggestum ipsum in diversis ambitibus decurrit. Primum, opus erat ut manus meas in Docker linea instrumentorum iuberet (CLI). Instructiones Dux institutionis Docker non potest dici clarissimus et comprehensibilis, sed ex eo discere potes quod ad primum gradum institutionis capiendum, debes Docker Desktop (pro Mac vel Windows).

Docker Hub fere idem est quod GitHub ad git repositoria vel subcriptio npm pro JavaScript packages. Hoc est repositio online pro imaginibus Docker. Hoc est quod Docker Desktop connectit.

Ita ut cum Docker incipias, duo facere debes;

Postea inspicias, si Docker CLI laborat cursu sequenti mandatum ad versionem Docker reprimendam:

docker -v

Deinde, aperi in Docker Hub intrando usoris et tesserae tuae rogatae:

docker login

Uti Docker, conceptus imaginum et vasorum debes intelligere.

Imagines

Imago est aliquid simile caeruleo impressum, quod continet instructiones ad contionem continens. Haec incommutabilis snapshot applicationis lima ratio et occasus. Facile tincidunt imagines communicant.

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

Hoc mandatum output mensam cum capite sequenti:

REPOSITORY     TAG     IMAGE ID     CREATED     SIZE
---

Deinde exempla quaedam mandatorum in eadem forma videbimus - primum praeceptum est cum commento, et deinde exemplum quid outputare possit.

Containers

Continens sarcinam exsecutabilem est quae continet omnia quae ad applicationem currendum sunt. Applicatio cum hac accessu semper idem faciet, cuiuscumque infrastructuræ: in ambitu solitario et in eodem ambitu. Punctum est quod instantiae eiusdem imaginis in diversis ambitibus inducuntur.

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

Tags

Tag signum est certae imaginis versionem.

A velox ad Docker imperium

Hic est recensio quorumdam communium usus Praeceptorum Docker.

bigas

context

modum

docker constructum

imagini

Ad aedificationem imago ex Dockerfile

docker tag

imagini

Imago tagging

Docker imaginibus

imagini

Imagines varius

currere Docker

continens

Currentem vas secundum imaginem

docker dis

imagini

Ad subcriptio imaginem discas

docker viverra

imagini

Ex registro imago Loading

Docker ps

continens

Vasa varius

docker ratio putabis

Imago / Continens

Desueta continentia et imagines removere

Dockerfile

Scio quomodo ad applicationem productionis localiter percurramus. Webpack configuratione constitutum habeo ad aedificandum paratam applicationem React. Deinde mandatum habeo quod incipit a Node.js servo in portu fundatum 5000. Hoc sic videtur:

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

Notandum quod exemplum applicationis huius materiae non habeo. Sed hic, ad experimenta, quaevis simplex Node applicatio faciet.

Ut vase utaris, mandata Docker dare debes. Hoc fit per tabellam vocatam Dockerfileposita in indice rei. Hic fasciculus, primo, satis incomprehensibilis videtur.

Quod autem continet, tantum describit, cum specialibus mandatis, simile quid ad constituendum ambitum laboris. Horum mandatorum nonnulla hic sunt;

  • a — Hoc praeceptum fasciculus incipit. Basi imaginem designat, in qua vas fabricatur.
  • PERSEQUOR — Imagines ex fonte locali ad continentem effingo.
  • WORKDIR — Proponere directorium laboris ad sequentia mandata.
  • CURRE — Currite imperata.
  • EXPOSITIO — Portus occasus.
  • ENTRYPOINT - Indicatio mandati exsecutioni mandari.

Dockerfile videre aliquid simile hoc;

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

Secundum basim imaginem quam eligis, insuper clientelas instituere debes. Res etenim est imagines quasdam basis (sicut Node Alpine Linux) creatas esse cum fini eas quam maxime compactas conficiendi. Ita fit, ut non habeas quod expectes.

Aedificium, tagging et currens continens

Conventus localis et launches continentis postquam habemus Dockerfilesunt operae admodum simplices. Antequam imaginem ad Docker Hub impellas, necesse est eam localiter probare.

Conventus

Primum opus est ad colligunt imaginiNomen specificans et optionally tag (si tag not specificatum est, ratio sponte tag imagini assignabit latest).

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

Post hoc praeceptum currit, imaginem aedificare Docker spectare potes.

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

Aedificium duobus minutis capere potest - Refert quot clientelas habes. Semel aedificatum completum est, mandatum currere potes docker images et vide descriptionem imaginis novae tuae.

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

Launch

Imago creata est. Hoc significat quod vas ex eo potest currere. Quia applicatio currit in vase ad localhost:5000me ad sinistram par 5000:5000 in proximo imperio installed 5000. A dextro latere est portus continens.

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

Continens autem creatur et currit, uti potest imperio docker ps spectare ad informationem de hoc vase (vel imperio uti potes docker ps -aqui informationem exhibet de omnibus vasis, non tantum currentibus).

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

Si nunc ad inscriptione localhost:5000 - videre potes paginam applicationis currentis quae prorsus eadem spectat ac pagina applicationis currens in ambitu productionis.

-Tagging and publishing

Ut una ex imaginibus creatis in servo productionis utamur, necesse est ut hanc imaginem ex Docker Hub extrahere possimus. Hoc significat quod primum debes creare repositio pro incepto in Docker Hub. Post hoc habebimus locum ubi imaginem mittamus. Imago renominari debet ut nomen eius incipit cum nostro Docker Hub usuario. Hoc sequitur nomen repositorium. Quaelibet tag in fine nominis poni potest. Infra exemplum est nominandi imagines hoc schemate utentes.

Nunc imaginem novo nomine aedificare potes atque iussum es docker push impellat ad Reconditorium 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

Si omnia bene valent, imago praesto erit in Docker Hub et facile potest ministrari vel in alias tincidunt transferri.

Deinde gradibus

Nunc compertum habemus applicationem in forma Docker continentis currere localiter. Continentem ad Docker Hub imposuisti. Hoc totum significat quod iam valde bene proficimus ad propositum nostrum. Nunc opus est duas quaestiones solvere;

  • Instrumentum ci erigendi ad codicem probandi et explicandi.
  • Servo productionis instituens ut codicem nostrum accurrere possit.

In nostro casu utimur Cogito Ergo C.. Ut servo - DitigalOcean.

Notandum, quod hie uti potes alia compositione officiorum. Exempli gratia, loco Travis CI, actionibus CircleCI vel Github uti potes. Et pro DigitalOcean - AWS vel Linode.

Cum Travis CI laborare decrevimus, et iam aliquid in hoc ministerio figuratum habemus. Nunc ergo quomodo ad opus praeparandum sit breviter dicam.

Cogito Ergo C.

Travis CI instrumentum est ad codicem probandi et explicandi. Nolo venire in subtilitates erigendi Travis CI, cum unumquodque propositum sit unicum, et hoc non multum prodest. Sed fundamenta operiam ut incipias si volueris uti Travis CI. Utrum Travis CI, CircleCI, Jenkins, vel quid aliud eligatis, ubique similes modi conformationis adhibebuntur.

Ut incipias cum Travis CI, vade ad project website et rationem crea. Tunc integrare Travis CI cum GitHub rationem. Cum systema instituens, repositum denotare debes quo opus automaterium vis ac accessum ad illud perfice. (GitHub utar, sed certo scio Travis CI cum BitBucket, et GitLab, aliisque similibus officiis integrari posse).

Singulis diebus Travis CI incepit, ministratur, mittitur, mandata exsequens in file configurationis specificata, inter ramos repositoriorum respondentium explicans.

Job vita cycle

Travis CI configuration file vocavit .travis.yml et condita in directorio radix project, notionem eventuum sustinet vitae cyclum munia. Haec eo ordine recensentur quo occurrunt;

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

Testing

In fasciculo configurationis Eo ad configurandum loci servo Travis CI. Node 12 tamquam lingua delegi et systema indicavi ut clientelas instituendi ad usum Docker requirebat.

Omnia quae enumerantur in .travis.ymlexsecutioni mandari debet cum omnes petitiones trahentium fiunt ad omnes repositorii, nisi aliud constet. Hoc pluma utilis est, quia significat nos probare posse totum codicem venientem in conditorio. Hoc permitte te scire, si codicem ad banc scribendam paratus sit. masteret sive projectum processum comminuet. In hac globali conformatione, omnia localiter instituo, in curriculo Webpack dev servo currendo (hoc est notae laboris mei), et probationes currunt.

Si vis repositorium tuum ostentare vela indicans test coverage, hic Potes invenire breves instructiones de utendo Jest, Travis CI et Coverall ad informationem hanc colligendam et exhibendam.

Hic igitur est contentum tabellae .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

Hoc est ubi actiones quae pro omnibus ramis reposito peraguntur et pro petitionibus collige finem.

Deployment

Ex suppositione omnes automated probationes feliciter peractae, possumus, quae ad libitum est, codicem ad servo productionis explicandam. Cum hoc solum codicem e ramo facere velimus mastersystema opportunum praebemus instructiones in instruere occasus. Priusquam codicem uti conaris, quem proxime in tuo consilio videbimus, te admonere velim te ipsam scripturam instruere necesse habere.

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

Scriptum instruere duas difficultates solvit:

  • Aedificare, tag et imaginem mittere ad Docker Hub utens instrumento CI (in nostro casu, Travis CI).
  • Loading imaginem in calculonis, reprimendo vas vetus et novum incipiens (in nostro casu server in suggestu DigitalOceano decurrit).

Primum, opus est processum automaticum constituere ad aedificandum, tagging, imaginem ad Docker Hub impellendo. Haec omnia simillima sunt iis quae manually iam fecimus, praeter quod consilio opus est ad imagines et logins automandas singulares tags assignandas. Difficultatem habui cum aliquibus singularibus scriptionis instruere, ut tagging consilium, login, SSH clavem descriptam, nexum SSH instituendi. Sed fortunatus amicus meus valde bonus est vere, ut cum multis aliis rebus. Adiuvit me scribe hoc scriptum.

Prima igitur pars scripti imaginem ad Docker Hub immittit. Id perfacile factu est. Consilium tagging usus sum involvit coniungendo git Nullam et git tag, si quis est. Hoc efficit ut tag singulare sit et facilius cognoscas ecclesiam in qua innititur. DOCKER_USERNAME и DOCKER_PASSWORD in usuario rerum variabilium variabilium quae in programmate Travis CI constitui possunt. Travis CI statim notitia sensitiva processus erit ut in manus iniurias non cadat.

Haec est prima pars scriptoris 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}

Quae secunda pars scriptionis omnino dependet ab quo exercitu uteris et quomodo nexus ad constitutum est. In casu meo, quoniam Oceano Digitali utor, iussa utor servo coniungo doctl. Cum opus est AWS, utilitas adhibebitur aws, et sic porro.

Servos erigere haud difficile erat. Itaque guttam basi imaginis fundatam posui. Animadvertendum est quod ratio quam elegi requirit unum tempus manualem de Docker et unum tempus manuale de Docker. Ubuntu 18.04 ad instituendum Docker usus sum, itaque si etiam Ubuntu utens ut idem facias, mox sequi potes. hoc simplex dux.

Non hic loquor de specialibus mandatis ad usus, quod aspectus haec in diversis casibus multum variari potest. Dabo modo rationem generalem agendi perficiendi cum via SSH connectens cum servo in quo explicabitur consilium:

  • Oportet nos invenire continens quod currently currit et illud prohibet.
  • Tunc novum vas in curriculo mittere debes.
  • Necesse est ut ministri loci portum to 80 - hoc permittet te ad locum similem inscriptionis ingredi example.com, non specificato portu , magis quam tali inscriptione utens example.com:5000.
  • Denique omnia vetera vasa et imagines delere debes.

Hic est continuatio scripturae.

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

Quaedam attendere

Fieri potest ut cum servo per SSH ex Travis CI coniungas, monitionem videbis quae te impedit quominus cum institutione perseveret sicut systema responsionem usoris exspectabit.

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

Didici clavem nervum in base 64 coarctari posse ut eam servaret in forma qua commode et fideliter operabatur. Ad scaenam institutionem destruere potes clavem publicam et ad limam scribe known_hosts ut supra errorem tollendum.

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

Re, id mandatum videre licet;

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

Et hic est quod producit - chorda base64 encoded:

MTIzLjQ1LjY3Ljg5IHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQWtsT1Vwa0RIcmZIWTE3U2JybVRJcE5MVEdLOVRqb20vQldEU1UKR1BsK25hZnpsSERUWVc3aGRJNHlaNWV3MThKSDRKVzlqYmhVRnJ2aVF6TTd4bEVMRVZmNGg5bEZYNVFWa2JQcHBTd2cwY2RhMwpQYnY3a09kSi9NVHlCbFdYRkNSK0hBbzNGWFJpdEJxeGlYMW5LaFhwSEFac01jaUxxOFY2UmpzTkFRd2RzZE1GdlNsVksvN1hBCnQzRmFvSm9Bc25jTTFROXg1KzNWMFd3NjgvZUlGbWIxenVVRmxqUUpLcHJyWDg4WHlwTkR2allOYnk2dncvUGIwcndlcnQvRW4KbVorQVc0T1pQblRQSTg5WlBtVk1MdWF5ckQyY0U4NlovaWw4YitndzNyMysxbkthdG1Ja2puMnNvMWQwMVFyYVRsTXFWU3NieApOclJGaTl3cmYrTTdRPT0geW91QGV4YW1wbGUuY29tCg==

Hic est praeceptum de quo supra

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

Eadem ratio adhiberi potest cum clavibus privatis cum nexum constituendo, quoniam clavis privata bene egere potes ut servo accederem. Cum operando cum clave, solum debes curare ut in a Travis CI ambitu variabili reponatur et ne alicubi exponatur.

Alia res notanda est, ut necesse sit totam instruere scripturam unam lineam, exempli gratia - cum doctl. Hoc opus est ut aliquid extra conatum requirat.

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

TLS / SSL et Libra Libra

Postquam omnia supradicta feci, ultimum problema quod mihi occurrit fuit quod SSL ministrans non haberet. Quia utor a Node.js servo, ut ad vim opus vicissim procuratorem Nginx et Encrypt scriptor, multum opus est tinker.

Vere nolebam omnia haec SSL configuratione manually facere, itaque libratorem onus tantum creavi et singula in DNS notavit. In casu DigitalOceano, exempli gratia, testimonium auto-renovationis libratoris oneris sui signati creando simplex, liberum et celeriter procedendum est. Accessus hic beneficium addidit quod facillime efficeret ut SSL in pluribus servientibus post onus libratorem currentibus, si opus fuerit, constitueretur. Hoc permittit ut ipsi ministris non omnino de SSL "cogitare", sed eodem tempore uti solito portu 80. Itaque constituendum SSL in librario oneris multo facilius et commodius est quam modos modos SSL erigendi.

Nunc omnes portus claudere potes in calculonis servi qui hospites advenientes accipiant - praeter portum 80communicabat cum librario onere et portu 22 ad SSH. Quam ob rem, conatum directe accedere ministranti in quibusvis portibus praeter haec duo deficiet.

results

Postquam omnia peregi in hac materia, neque Docker suggestus neque notiones automated CI/CD vincula me amplius terrebant. Continuam integrationem catenam constituere potui, in qua codice probatur antequam ad productionem ingrediatur et signum ipso servo explicatur. Haec omnia mihi adhuc nova sunt relative, et certo scio viae meae laboris automated emendandi et efficaciorem reddere. Quare si quid de hac re habes, fac ut sciam. mihi novimus. Spero hunc articulum adiuvit te in conatibus tuis. Credere volo quod perlectis, tantum didicisti, dum omnia, quae in eo locutus sum, remanens.

PS In nostro forum ibi imago Dockerquae in uno clic institui potest. Vos can reprehendo operatio vasorum in VPS. Omnes clientes novi dantur 3 diebus probationis gratis.

Carissimi legentibus! Uteris CI/CD technologiae in inceptis tuis?

Creando CI/CD catena et automating opus cum Docker

Source: www.habr.com

Add a comment