Skip to content

iam43x/cue-project-tutorial

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Оглавление

  1. Tags
  2. Tool & Makefile
  3. Project Structure
  4. Project Example

Tags

Build-in tag

Реализованные тэги с метаданными

tags.cue

Переменная Тэг Значение Пример
HashCommit hash_commit git rev-parse HEAD 0c172e4396a8875f684f016ca89147e0f866d7e1
AuthorCommit author_commit git log -1 --pretty=format:'%ae' iam4exovskiy@gmail.ru
Version SemVer 2.0.0 git tag --points-at HEAD v1.0.0

FYI не забудь добавить сюда свои если ты их включил в библиотеку

Пример передачи Build-in аргументов в сборку

Makefile

# example
cue cmd \
  -t hash_commit=$(git rev-parse HEAD) \
  -t author_commit=$(git log -1 --pretty=format:'%ae') \
  -t version=$(git tag --points-at HEAD) \
  ${ENV_TAG} \
  dump ./${CUE_MOD}/... ./lib ./tool

Values - стендозависимые параметры

Стендозависимые параметры так же реализованы с помощью тэгов.

Пример определения контейнера таких параметров и ссылка на него через которую мы будем обращаться из наших обьектов чтобы получить значения Values.MyVariable

values.cue

package k8s

import "strings"

//*** schema definition for env parameters */
#Values: {
  //*** fields name, type and constraints */
  MyVariable: string & strings.MinRunes(5)
  ...
}
//*** reference definition */
Values: #Values

Пример инициализации Values для простоты использования имя тэга включено в имя файла values.${tag_name}.cue

values.stage.cue

@if(stage) //if tag value=true file include to build
package k8s

//*** init Values */
Values: {
  MyVariable: "staging!"
  //*** other needed fields */
  ...
}
...

Пример передачи имени окружения в сборку через tag

Makefile

ENV?=stage # default value
cue cmd \
  -t hash_commit=$(git rev-parse HEAD) \
  -t author_commit=$(git log -1 --pretty=format:'%ae') \
  -t version=$(git tag --points-at HEAD) \
  -t ${ENV} \ # this tag value is true
  dump ./${CUE_MOD}/... ./lib ./tool

Tool & Makefile

def.cue - определения словарей по типам API которые потом используются в *_tool.cue


Dump

# example
CUE_MOD=guestbook ENV=stage make | yq

Параметры

Name Description Example
ENV Имя окружения, и фрагмент имени файла values.stage.cue ENV=stage
CUE_MOD путь до каталога cue с логическим модулем CUE_MOD=guestbook

Build

# example
CUE_MOD=guestbook ENV=stage make build

Сохраняет все обьекты в *.yaml формате, раскладывая по каталогам c именем kind - например build/gateway/.. или /build/virtualservice/..

ожидаемые параметы как в dump tool


deps.go - для добавления go-зависимостей клиентов содержащие *.proto которые потом используются для генерации *.cue определений

# example
make generate

Генерация *.cue определений из *.proto схем используется только после их ручной обработки! и уже потом добавления в cue.mod/pkg с обязательной отметкой в CHANGELOG.md


List Resources (ls)

# example
CUE_MOD=guestbook make ls

выводит имена и типы обьектов

┌─ Kind      ─┬─ Name         ─┐
│ Service     │ guestbook-svc  │
│ Deployment  │ guestbook      │
└─           ─┴─              ─┘

Clean

# example
make clean

Удаляет все **/build build cue.mod/gen каталоги и все подкаталоги

чтобы не возникало коллизий рекомендуется выполнять clean перед build или dump


Project structure

Пример организации монорепозитория с модулями

Dir Description
lib содержит переопределения типов k8s API из cue.mod/pkg/..
tool содержит файлы *_tool.cue утилитные скрипты см.tools
proto извлеченные из vendor protobuf описание k8s API
vendor выкаченные go-зависимости в которых описано API= *.proto

.                                     # root directory
├── cue.mod                           # cue gen by default directory
│   ├── gen/..                        # generated types k8s resource api
│   ├── module.cue                    # root module info name, lang version, kind ...
│   ├── pkg                           # DEPRECATED DIR DO NOT USE
│   │   ├── google.golang.org/..
│   │   ├── googleapis.com/..
│   │   ├── istio.io/..
│   │   └── k8s.io/..                 
│   └── usr/..                        # DEPRECATED DIR DO NOT USE
├── guestbook                         # logic unit - component/module k8s
│   ├── build                         # result marshaling structs                 
│   ├── const.cue                     # reusable constants
│   ├── src                           # struct initialize gw,vs,dr,se ...
│   │   ├── deploy.cue
│   │   └── svc.cue
│   ├── values.cue                    # schema definition and reference for use in resource
│   ├── values.prod.cue               # environment variables
│   └── values.stage.cue
├── lib/..                            # lib definition types, constraints, default values
├── tool/..                           # tool scripts ls, dump, build...
├── proto/..                          # protobuf definition k8s API
├── vendor/..                         # downloaded dependencies
├── deps.go                           # go module use dependencies go-client k8s API
├── go.mod                            # module definition
├── go.sum                            # checksum dependencies downloaded
└── def.cue                           # definition resources map

cue.mod/pkg является устаревшей структурой, как написано в документаци CUE но альтернатив пока НЕТ поэтому используем ее для хранения модифицированных пакетов


Project Example

src - каталог для обьявления обьектов

Создаем файл например src/se.cue для определения ServiceEntry

//*** обязательное имя пакета* */
package k8s

//*** добавляем в словарь нужный заполненый обьект, где ключом будет его имя** */
ServiceEntry: <ResourceName>: {
  //*** заполненый обьект */
  spec: {}
}

* пакет имеет обязательное имя k8s для минимизации количества импортов

** имя указанное в ключе будет проброшенно в metadata.name

Для переиспользования каких-либо значений предлагается использовать const.cueа для стендозависимых параметров values.*.cue см.values

Так выглядит самый простой логический модуль содержащий vs, gw, se

.
├── const.cue
├── src
│   ├── vs.cue
│   ├── gw.cue
│   └── se.cue
└── values.cue

About

cuelang project tutorial

Resources

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •  

Languages