Монолит на PHP Монолит на PHP Frontend Микросервис на Go Микросервис на Node.js SPA SPA Микросервис на Go Микросервис на Go Микросервис на Go Микросервис на Go Микросервис на Node.js iframe iframe SPA Микросервис на Go
docker push {branch.buildNo} Makefile build: dep ensure go build -o ... ... Dockerfile FROM debian ADD ... /go/bin/outyet ENTRYPOINT /go/bin/outyet EXPOSE 8080 make build Сервис на Go
docker push {branch.buildNo} Dockerfile FROM golang ADD . /go/src/.../outyet RUN go install .../outyet ENTRYPOINT /go/bin/outyet EXPOSE 8080 Сервис на Go
{branch.buildNo} . docker push {branch.buildNo} Dockerfile FROM golang:alpine as builder COPY . $GOPATH/src/outyet WORKDIR $GOPATH/src/outyet RUN go build -o /go/bin/outyet FROM scratch COPY --from=builder /go/bin/outyet /go/bin/outyet ENTRYPOINT ["/go/bin/outyet"] Сервис на Go
менеджера и командной оболочки У вас нет SSL сертификатов (нельзя выполнять https запросы) У вас нет данных о часовых поясах (tzdata) Решения: 1. github.com/jeremyhuiskamp/golang-docker-scratch 2. использовать alpine
{branch.buildNo} Dockerfile FROM node:11-alpine as frontend COPY ./www /usr/src/www RUN npm install && npm run dist FROM golang:alpine as builder COPY . $GOPATH/src/outyet WORKDIR $GOPATH/src/outyet RUN go build -o /go/bin/outyet FROM scratch COPY --from=builder /go/bin/outyet /go/bin/outyet COPY –from=frontend /usr/src/www/dist/ /go/bin/outyet/www ENTRYPOINT ["/go/bin/outyet"] Сервис на Go
зависимостей через npm install Сборка через npm run dist Запуск модульных тестов и linter через npm run test Пусть фронтенд лежит в отдельном репозитории А в чём проблема? git submodule add [email protected]/frontend
docker push {branch.buildNo} Dockerfile FROM node:11-alpine as frontend COPY ./www /usr/src/www RUN npm install && npm run dist if ! [ -d ${DIR} ]; then git clone ${REPO} ${DIR} fi cd ${DIR} git reset --hard git clean -fdx git fetch origin git checkout origin/${BRANCH} Скрипт обновления frontend Сервис на Go
arg "FRONT=harbour.x.com/frontend:$ {BRANCH.BUILD_NO}" docker push {branch.buildNo} Dockerfile ARG FRONT=nil FROM ${FRONT} as frontend FROM golang:alpine as builder COPY . $GOPATH/src/outyet WORKDIR $GOPATH/src/outyet RUN go build -o /go/bin/outyet FROM scratch Сервис на Go Фронтенд docker build -t {branch.buildNo} . docker push {branch.buildNo}
Y Frontend Y Service Z Монорепозиторий: Service X Frontend X Service Y Fronten Y Service Z https://youtu.be/RSTHex_rKBU Подход к Continuous Deployment в микросервисной архитектуре / Алексей Баитов (2ГИС) Container x:v1.2.3 Container y:v2.0.19 Container z:master Сервис деплоя на Python С конфигами на Python
на Python3 X Platform bin x-platform src сервис сервис k8s … x-platform.yml x-platform.py Скрипт на Python3 ~600 строк Читает x-platform.yml Выполняет сборку и деплой
X Platform bin x-update-builder builders zbackend zfrontend k8s x-platform.yml x-platform.py Dockerfile Файл описания контейнера-сборщика Исходников нет Только база + apt-get Скрипт для сборки контейнеров, собирающего контейнеры x-update-builder zbackend
build --services zbackend Обновление репозитория Сборка Unit тесты docker build docker push <sha-1> docker push <branch> В реестре или локально есть образ с таким sha-1? docker pull <sha-1> Нет Да
монорепозитория Тегирует образ по sha-1 коммита Быстрая локальная сборка Быстрая сборка на сервере Относительно прост в реализации: 600 строк на Python, 2-3 недели разработки
Написан на Go Выполняет сборку образов и согласованный deploy Умеет работать с моно- и мультирепозиториями Умеет кешировать все шаги сборки всех контейнеров Умеет тегировать контейнеры по sha-1 коммита, по ветке, по номеру билда
CI Пишите свой скрипт, если dapp не подходит Не полагайтесь на TeamCity, Gitlab CI, Buildbot – они by design не рассчитаны на микросервисы и Docker