Приложения

Введение

Dcape предназначен для построения gitops (CI/CD) решений, в которых на каждом сервере установлен dcape и на одном - web-сервис git (например: gitea), который по факту изменений в репозитории активирует drone на присоединенных серверах.

После развёртывания сервисов git/drone, задача dcape уже решена, но возникает возможность добавить в деплой:

  • Makefile.app для использования в директиве include файла Makefile адаптируемого приложения (чтобы не дублировать цели)
  • docker-compose.app.yml для использования в качестве основы для override в адаптируемом приложении

Эти файлы добавляются в образ dcape-compose, поэтому доступны и на хостовой системе и при развёртывании. Для работы с ними в Makefile приложения надо добавить директивы:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# ------------------------------------------------------------------------------
# Find and include DCAPE_ROOT/Makefile
DCAPE_COMPOSE   ?= dcape-compose
DCAPE_ROOT      ?= $(shell docker inspect -f "{{.Config.Labels.dcape_root}}" $(DCAPE_COMPOSE))

ifeq ($(shell test -e $(DCAPE_ROOT)/Makefile.app && echo -n yes),yes)
  include $(DCAPE_ROOT)/Makefile.app
else
  include /opt/dcape/Makefile.app
endif

Это позволяет

  • не дублировать в make такие цели, как dc, db-create, .drone-default
  • директивой USE_DB=yes добавлять в .env настройки БД и активировать команды db-*
  • директивой ADD_USER=yes добавлять в .env настройки учетной записи пользователя
  • использовать docker-compose.app.yml в цели dc как основу для перезаписи.

См. также: Пример использования

Алгоритм настройки

Первое развёртывание приложения в среде dcape состоит из следующих шагов:

  • создать репозиторий (или зеркало) в gitea
  • активировать репозиторий в drone целевого сервера
  • выполнить git push (или тест вебхука) - drone произведет попытку развёртывания, в результате которой будет создан файл .env и сохранен в enfist с ключом org--repo_name--branch.sample
  • отредактировать конфигурацию и сохранить ее под именем без суффикса .sample
  • повторить деплой в drone или тест вебхука - приложение будет развернуто на целевом сервере

После этого push в репозиторий проекта будет приводить к разворачиванию/обновлению приложения в среде dcape.

Для развертывания приложения в среде dcape, оно должно поддерживать интеграцию с тремя подсистемами:

Ниже описаны примеры такий интеграции

Интеграция с traefik

Производится с помощью меток контейнера.

Пример docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# custom app config
# overrides DCAPE/apps/drone/dcape-app/docker-compose.yml

version: '2'

services:
  app:
    environment:
      - VAR=value
    volumes:
      - ${APP_ROOT}/html:/usr/share/nginx/html:ro

Интеграция с woodpecker

Производится с помощью файла .woodpecker.yml, который размещается в корне репозитория.

Пример .drone.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
---
kind: pipeline
type: docker
name: app

steps:

- name: deploy_local
  pull: never
  image: ${DCAPE_COMPOSE}
  commands:
  - . setup config
  - make .drone-default
  volumes:
  - name: dockersock
    path: /var/run/docker.sock

volumes:
- name: dockersock
  host:
    path: /var/run/docker.sock

Пояснения по строкам

  • 10: использовать для развертывания образ dcape-compose (создается при установке dcape)
  • 12: интеграция с enfist
  • 13: подготовка окружения и запуск docker-compose

Подготовка окружения

создание персистентного каталога

Интеграция с enfist

enfist - это сервис хранения файлов конфигурации, которые в dcape имеют имя .env. Соответственно, приложение должно уметь работать с конфигурацией, размещенной в таком файле. В части переменных, используемых в docker-compose.yml, формат файла должен соответствовать docker-compose env_file.

Файл .env c переменными для docker-compose.yml и другими переменными для запуска приложения не размещается в репозитории, работа с ним при деплое осуществляется командой setup config:

  • если в enfist нет конфигурации для текущей комбинации “организация-репозиторий-ветка”, выполняется make .env.sample (если в репозитории нет .env.sample) и полученный файл сохраняется в enfist с именем “организация-репозиторий-ветка.sample”
  • иначе - конфигурация из enfist выгружается в файл .env

Для каждой ветки репозитория создается своя конфигурация запуска.

Обновление и удаление развернутого приложения

В случае, если префикс (DCAPE_TAG) и имя (APP_TAG) приложения не изменились - контейнер будет остановлен и удален обновлении приложения. В остальных случаях управление контейнерами и образами может прибыть произведено через portainer

См. также