summaryrefslogtreecommitdiff
path: root/content/posts/2021-02-13-jsonnet.md
diff options
context:
space:
mode:
author2026-02-02 00:35:54 +0300
committer2026-02-02 00:35:54 +0300
commitbfdd73d7324a4f66a16f55d4fb064b0ff08d40e9 (patch)
tree27fff9c802dcdd22960bb2e776e58278000d0364 /content/posts/2021-02-13-jsonnet.md
parentПоправил шаблон (diff)
downloadblog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.tar.gz
blog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.tar.bz2
blog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.tar.xz
blog-bfdd73d7324a4f66a16f55d4fb064b0ff08d40e9.zip
Большая чистка блога
Diffstat (limited to 'content/posts/2021-02-13-jsonnet.md')
-rw-r--r--content/posts/2021-02-13-jsonnet.md92
1 files changed, 0 insertions, 92 deletions
diff --git a/content/posts/2021-02-13-jsonnet.md b/content/posts/2021-02-13-jsonnet.md
deleted file mode 100644
index 9b03e5d..0000000
--- a/content/posts/2021-02-13-jsonnet.md
+++ /dev/null
@@ -1,92 +0,0 @@
----
-date: "2021-02-13T22:08:19Z"
-image: files/2021-02-13-jsonnet_logo.webp
-tags:
- - go
- - it
- - разное
-categories:
- - Без рубрики
-title: Jsonnet
----
-
-Редко такое бывает, что случайно натыкаешься на какую-то технологию и она
-вызывает вау-эффект и буквально переворачивает всё верх дном. На днях для меня
-такой технологией стал [Jsonnet](https://jsonnet.org/) от Google.
-
-В кратце, это надмножество JSON являющееся языком описания шаблонов. Пока звучит
-не очень круто, да? На деле это офигенный Тьюринг полный функциональный язык,
-результатом выполнения которого будет сформированый JSON (и не только)
-документ(или несколько документов[^1]).
-[^1]:https://jsonnet.org/learning/getting_started.html#multi
-
-Если интересно, рекомендую сразу переходить к туториалу —
-https://jsonnet.org/learning/tutorial.html.
-
-## Почему же это круто?
-
-Ну, во-первых, он реально мощный и простой. С его помощью можно формировать
-документы любой сложности.
-
-Во-вторых, его можно встроить в свою программу на Go (и не только, но на Go —
-проще всего — https://jsonnet.org/ref/bindings.html), и это даст бесплатно
-мощный DSL для написания очень гибких конфигов.
-
-В третьих, ну камон, приятно же когда компьютер берет на себя рутинную работу по
-формированию больших и сложных JSON’ов!
-
-## Пример
-
-Накидал простенький пример который формирует конфигурацию пайплайна для
-гипотетической CI системы:
-
-```jsonnet
-local map(arr, predicate) = // определяем функцию map
-if std.length(arr) == 0 then
- []
- else
- [
- predicate(arr[0])
- ] + map(arr[1:], predicate); // функциональненько!
-local tasks = [['go1.14', '1.14-alpine'],['go1.15', '1.15-alpine'],['go1.16-RC', '1.16-rc-alpine']];
-local commands = ['go build', 'go test']; // Общая часть
-{ // Результирующий JSON
- pipeline: map(tasks, function (task) { // Вызов map от tasks
- name: task[0],
- image: "golang:"+task[1],
- commands: commands,
- })
-}
-```
-
-Результат:
-
-```json
-{
- "pipeline": [
- {
- "commands": ["go build", "go test"],
- "image": "golang:1.14-alpine",
- "name": "go1.14"
- },
- {
- "commands": ["go build", "go test"],
- "image": "golang:1.15-alpine",
- "name": "go1.15"
- },
- {
- "commands": ["go build", "go test"],
- "image": "golang:1.16-rc-alpine",
- "name": "go1.16-RC"
- }
- ]
-}
-```
-
-Круть же!
-
-Да, на небольшом примере не очень показательно, но даже тут, скажем, при добавлении новой цели сборки будет достаточно слегка подправить массив tasks и автоматически сформируется все остальное, а не копипаст целой секции и ручная правка в нужных местах.
-
-Я оставил за скобками то, что этот шаблонизатора позволяет формировать не только JSON но и фактически любой другой текстовый формат. И даже из одного скрипта формировать несколько документов разного формата. При этом локальные переменные будут использоваться общие. Теоретически, если упороться, можно одним скриптом сформировать весь /etc на новом сервере. Почему бы и нет?:)
-
-Не знаю смог ли передать ощущение своего восторга, но я охренеть как рад и жду выходных, чтобы с головой нырнуть в эту технологию, которая открывает столько новых интересных перспектив!