#shell #template #variables #jinja2 #devops #tera-templates #yaml

bin+lib jintemplify

一个用于使用 Jinja2(Rust Tera) 模板和 YAML 变量组合文件的 CLI 工具

8 个版本

0.1.8 2023 年 10 月 20 日
0.1.7 2023 年 10 月 11 日
0.1.3 2023 年 9 月 27 日

#180模板引擎

Download history

每月 66 次下载

MIT 许可证

52KB
1K SLoC

Jintemplify

jintemplify 是一个 CLI(命令行界面)工具,允许用户将 Jinja2(rust Tera 库)模板与 YAML 变量相结合,以任何所需的格式生成文件,包括 Dockerfiles 和 Makefiles。设计上具有灵活性,jintemplify 可无缝集成到现代 DevOps 工作流程中的 Jenkins、Tekton 和其他 CI(持续集成)系统。应用程序还支持基于 shell 脚本和 Webassembler(WASM)模块的插件系统,使用户能够通过熟悉的脚本技术扩展其功能。

功能

  • 模板渲染:使用 Jinja2 模板定义文件的结构。
  • 变量支持:将模板与 YAML 定义的变量相结合。
  • 插件系统(基于 shell 脚本):使用基于 shell 脚本的插件扩展应用程序的功能。这允许使用熟悉的脚本方法和 Wasm 模块的性能优势进行广泛的扩展。

高级模板功能

访问环境变量和命令行参数

在 Jinja2 模板中,您可以使用 vars 对象访问环境变量或使用 --env 命令行选项传递的任何值。这为根据环境或运行时条件将动态值无缝地纳入模板提供了一种方法。

{{ vars.my_environment_variable }}
{{ vars.my_cli_argument }}

在上面的示例中,my_environment_variable 可以是环境变量,而 my_cli_argument 可以是通过 --env 传递的值。

插件

对于那些想要通过插件扩展应用程序功能的人来说,以下是对插件配置的基本结构

functions:
  - name: "function_name"
    params:
      - name: parameter_name
    env:
      CC: clang
      MAKEVARS: ...
    script: your_shell_script_command_here
  - name: ...
    wasm:
      path: path/to/myplugin.wasm
      import: your_function

在此配置中

  • name:代表您要添加的函数的名称,可以直接在您的 Jinja2 模板中调用。
  • params:列举了您的函数或过滤器所必需的参数。对于过滤器,使用 $(input) 访问默认输入(表示要过滤的值)。
  • env:指定了在执行时shell命令可以访问的环境变量。当根据环境调整脚本行为时,这一点至关重要。
  • script:包含在函数调用时执行的shell命令。
  • wasm:指定Wasm插件配置。在这个
    • path:指向包含插件函数的wasm二进制文件。
    • import:表示封装在wasm二进制中的特定插件函数。

过滤器和函数

使用 jintemplify,您不仅限于基本的Jinja2模板。我们引入了专门的过滤器和函数,以提供更大的灵活性

函数

  • 直接读取文件:使用read_file函数,您可以直接将文件的內容读入Jinja2模板中。这对于包含大量数据或内容而不必手动将其复制到模板中非常有用。
  • 将数组转换为对象:使用to_object过滤器,您可以将交替键和值的数组(例如,[key1, value1, key2, value2])转换为Jinja2可访问的对象({key1: value1, key2: value2})。
  • 执行shell命令:使用shell函数,您可以直接在Jinja2模板中执行shell命令。这对于根据命令输出动态生成内容特别有用。例如,shell("echo hello", world="Jinja")将在执行echo hello命令之前将环境变量world设置为"Jinja"。

过滤器

  • 从字符串中读取:如果您在模板中将数据作为字符串嵌入,可以使用以下过滤器将它们转换为可用的Jinja2对象
    • from_read_json:解析JSON字符串并将其转换为Jinja2对象。
    • from_read_yaml:解析YAML字符串并将其转换为Jinja2对象。
    • from_read_toml:解析TOML字符串并将其转换为Jinja2对象。

通过使用这些过滤器,您可以将内联数据无缝集成到模板中,然后使用Jinja2强大的模板功能进行操作。

示例:使用my_read_file在plugin.yaml.j2中使用JSON解析

jintemplify中,您可以结合使用的一个强大功能是直接读取文件并解析其内容。以下是一个快速示例

{# plugin.yaml.j2 #}
functions:
  - name: my_read_file
    params:
      - name: file_path
        description: file path
    script: cat $(file_path)

  - name: my_echo
    env:
      my_var: "hello plugin"
    script: echo ${my_var}

filters:
  - name: my_indent
    params:
      - name: prefix
    description: "description for my filter"
    script: |
      #!/bin/bash
      echo -e $(input) | sed 's/^/$(prefix)/'

{# main.yaml.j2 #}
{% set conf = my_read_file(file_path='./examples/test.json') | from_json %}
{{conf.hello}}

在这个例子中,我们使用read_file函数读取test.json的内容。然后,我们利用from_json过滤器解析读取的JSON字符串,将其转换为可用的Jinja2对象。这使得您可以直接访问JSON的属性,如上面的例子中的conf.hello

安装

使用Cargo

如果您已安装Rust和Cargo,则可以使用以下命令安装jintemplify

cargo instll jintemplify

手动安装

  1. 克隆仓库
git clone https://github.com/your_username/jintemplify.git
  1. 导航到项目目录并使用Cargo构建
cd jintemplify
cargo build --release

使用

jintemplify -t <template_path> -v <variables_path> --plugin <plugin_path>
jintemplify --help
jintemplify allows you to combine Jinja2 templates with YAML variables to produce files in any desired format. Use the --template argument to specify the main Jinja2 template and the --variables argument (optional) to specify the YAML variables template.

Usage: jintemplify [OPTIONS] --template <template>

Options:
  -e, --env <env>
          Environment variables in the format key=value

      --default-env <default-env>
          Optional environment variables in the format key=default_value

  -t, --template <template>
          Template file: main.yaml.j2, main.txt.j2, main.json.j2

  -v, --variables <variables>
          Variables file: variables.yaml.j2

  -p, --plugin <plugin>
          Path to the plugin configuration: plugin.yaml

      --output-file <FILE>
          Sets an output file, stdout if not set

      --disable-builtin-functions
          Disables the registration of built-in functions

      --include-dir <include-dir>
          Include directory for templates. Format: /path/to/dir:alias or /path/to/dir. Use '{}' for direct naming without an alias.

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

开发

要添加新过滤器,请修改filter.rs。有关添加或修改插件的说明,请参阅plugin.rs

贡献

欢迎提交拉取请求。对于重大更改,请先开启一个issue来讨论您希望进行哪些更改。

支持的平台

https://rust-lang.github.io/rustup-components-history/

许可协议

MIT

依赖项

~24–36MB
~586K SLoC