Skip to content

kulikov/serve

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#Манифест

Манифест файл в формате yaml, в котором в декларативном стиле описывается вся метаинформация, необходимая для автоматизации жизненного цикла компонента в процессах разработки: сборка, тестирование, деплой в разных средах, мониторинг и анализ работы и так далее.

##Структура.

###Формат узлов.

Каждый узел документа может содержать директиву match или ее короткий эквивалент „?“. Указанная после имени узла директива match говорит интерпретатору о специфичной интерпретации дочерних ключей узла. Имя каждого дочернего ключа становится паттерном матчинга для переменной, указанной после директивы match в имени узла. Только один дочерний узел может быть результатом паттерн-матчинга. В качестве приоритета паттернов используются следующие правила:

  • полное совпадение значения;
  • совпадение с регулярным выражением;
  • выражение "*";

Все дочернее дерево сматченного узла становится принимается как дочернее дерево узла с директивой match. Данные о директиве match после обработки удаляются.

Пример:

some ? {{ vars.env }}:
  q*:
    name: q
  qa: qa
  live: live

Результат:

// result on vars.env == 'qa'
some:
  name: q
// because 'qa' matches 'q*'

###Формат значений

В манифесте в значениях узлов можно использовать переменные. Синтаксис https://golang.org/pkg/text/template/: "Привет {{ vars.variableName }}, как дела?".

Все переменные окружения и аргументы, указанные в контексте интерпретации манифеста, помещаются в раздел vars. Там же для них можно указать значения по умолчанию. Через символ | можно указывать функции-модификаторы с параметрами или без, первым параметром всегда будет предыдущее значение по конвееру обработки.

Пример:

vars:
  answer: 42
//а потом использовать:
meta:
  answer: "{{ vars.answer }}"
  home: "{{ vars.HOME|replace("\W","_")  }}"
  env: "{{ vars.env }}"

###Импорт манифестов

Для импорта деревьев из файла необходимо указать узел file в дереве import и указать путь к файлу YAML, узлы которого импортируются в текущий документ.

import:
  file: /etc/default/manifest.yml

При импорте деревьев может произойти перезапись одноименных дочерних узлов с узлами в импортируемых дереве. Приоритет перезаписи будут иметь описанные в текущем документе.

Пример:

// file_1.yml
var: other
var-1: var 1
// file_2.yml
var: var 1
import:
 - file: file_1.yml

Результат:

var: var 1
var-1: var 1

##Правила объединения Правило вставки якорей. Якоря используются в рамках одного файла манифеста и не доступны для использования между файлами.

Пример:

vars: &v
  env: qa
deploy:
  <<: *v

Результат:

vars:
  env: qa
deploy:
  env: qa

Правило слияния map. При слиянии перезаписываются соответствующие узлы. Результат зависит от того, какой из этих элементов является базовым при слиянии. Базовым определяется элемент, который следует первым в порядке потока документа.

Пример:

var:
  var-1: "var 1"
  var-2: "var 2"

var:
  var-1: "new var 1"
  var-3: "var-3"

Результат:

var:
  var-1: "new var 1"
  var-2: "var 2"
  var-3: "var-3"

Правило слияния списков.

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

Правило 2 При слиянии списка и map результат зависит от того, какой из этих элементов является базовым при слиянии. Базовым определяется элемент, который следует первым в порядке потока документа.

Правило 2.1 Если базовым элементом является map, то каждый ключ этой map используется как базовый для одноименных ключей каждого элемента в списке. В итоге получается список определенный от оригинального, каждый элемент которого расширен базовой map.

Пример 2.1.1

import:
  stages:
    debian:
      repo: some
    zip:
      compression: deflate

stages:
  - sh: false
  - debian:
      name: one
  - zip:
      name: two
  - debian:
      name: three

Результат:

stages:
  - sh: false
  - debian:
      repo: some
      name: one
  - zip:
      compression: deflate
      name: two
  - debian:
      repo: some
      name: three

Пример:

import:
  stages:
    type: generic

stages:
  - debian: yes
    type: debian
  - zip: yes
  - type: other

Результат:

stages:
  - debian: yes
    type: debian
  - zip: yes
    type: generic
  - type: other

Правило 2.2 Если базовым элементом является список, то результат определяется как оригинальный map и список игнорируется.

Пример

import:
  stages:
    - sh: echo 1
    - sh: echo 2

stages:
  sh: echo 3

Результат

stages:
  sh: echo 3

serve

Утилита для парсинга манифеста и запуска плагинов

    serve <plugin-name> args...

Поддерживаемые флаги:

  • --manifest=./manifest.yml Путь до файла манифеста, по-умолчанию ищется в текущей дериктории.

  • --var name=value Параметры, которые нужно передать в манифест. В манифесте будут доступны так {{ var.name }}. Можно указать несколько. Например так: serve deploy --var env=qa --var build-number=34 --var branch=feature-superman

  • --dry-run При указании этого флага serve только распарсит манифест и выведет название плагина и параметры запуска. Если при этом не указать плагин, то будет выведен весь манифест. Полезно для отладки

  • --plugin-data='{"some":"json"}' Можно вызвать конкретный плагин, передав ему на вход ранее сформированный json со всеми необходимыми параметрами. Тогда serve не будет искать и парсить манифест, а просто вызовет указанный плагин с переданными параметрами.

Утилиту serve можно запустить указав плагин, которому будет передана часть дерева, определенная для плагина и управление. serve осуществляет поиск плагинов по следующему правилу:

  • поиск начинается с узла, указанного в качестве <plugin-name>;
  • узел является элементом списка, в этом случае осуществляется поиск плагина с именем составленным из имени узла и родительских узлов через разделитель ".". Если плагин в вернет неуспешный статус выполнения, то следующие плагины в запускать не будут. При запуске плагина содержимое одноименного узла передается в виде простого дерева на вход плагину.

Утилита serve выполняет поиск плагинов:

  • в папке /etc/serve/plugins/;
  • в реестре плагинов, с которыми она скомпилирована.

Плагины

build.sh

Просто вызывает любую sh команду.

sh: <str> // bash command

build.sbt-pack

Вызывает sbt с параметрами:

sbt ';set version := "%s"' clean test pack
version: <str> // version

build.marathon

Упаковывает source директорию в tar.gz архив и заливает через webdav в marathon task-registry по указанному в registry-url урлу.

registry-url: <str // uri
source: <str> //

build.debian

Создает deb-пакет и заливает его в apt репозиторий. Используются inn-ci-tools скрипты.

build-number: <str>
category: <str>
ci-tools-path: <str> // for example: "/var/go/inn-ci-tools",
cron: <str>
daemon: <str> // for example: "$APPLICATION_PATH/bin/start"
daemon-args: <str> // for example: "--port=$PORT1 --env=${ENV_NAME}",
daemon-port: <int>
daemon-user: <str>
depends: <str> // for exanple: "python3-setuptools, python3-dev, python3-pip",
description: <str>
distribution: <str> // "unstable"/"stable"
init: <str>
install-root: <str>
maintainer-email: <str> // for example: "bamboo@inn.ru",
maintainer-name: <str> // for example: "Continuous Integration",
make-pidfile: <str> // "yes"/"no"
name: <str>
package: <str>
service-owner: <str>
stage-counter: <str>
version: <str>

deploy.marathon

Запускает приложение в марафоне. Оборачивает cmd в специальный скрипт-враппер, который регистрирует запущенный сервис в консуле в реестре сервисов.

 app-name: <str>
 cmd: <str>
 constraints: <str:bool>
 consul-address: <str>
 cpu: <float>
 environment:
  ENV: <str>
  MEMORY: <str>
  SERVICE_NAME: <str>
  SERVICE_VERSION: <str>
 instances: <int>
 marathon-host: <str>
  mem: <int>
  package-uri: <uri>

release

Обновляет маршруты для http-роутинга в консуле. На базе этих данных consul-template автоматически сгенерит конфиг nginx В параметре --var route='{"stage":"staging"}' можно передавать доп. параметры для роутинга.

consul-address: <str> // consul host name
full-name: <str>
name-prefix: <str>
outdated:
 marathon:
  marathon-host": <str> // marathon host name
route: <str> //
routes:
 - host: <str> // host nmae
   location: <str> // host
 ...

db.create.postgresql

Создает клон или удаляет БД Postgresql. Параметры для клонирования

purge: <bool> // if delete database purge=false
ssh-user: <str> // ssh user name
target: <str> //target database name
source: <str> // source database name
host: <str> // host name

License

serve is licensed under BSD 3-clause as stated in file LICENSE

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •