简单实现一个任务模版

任务模版

介绍

任务模版 在开发中还是非常刚需的,因为任务是高度复用化的,不论是github的workflow还是自研的任务流水线,或多或少都要定义一堆的任务,但是其实会发现一点需要大量定义一些重复的任务配置,这样就会导致维护困难。任务模版+include指令可以很好的解决这些问题,具体可以看下文的例子~~

其中任务模版会有几个概念:

  1. 模版变量:可以根据模版变化渲染任务配置
  • HOME: 用户根路径
  1. 模版函数:一些复杂的逻辑可以通过模版函数来实现, 暂时仅支持了个三元表达式
  • IF: 三元表达式,例如:{{ IF .DEBUG "1" "--debug" "-" }} 表示:如果DEBUG=1则输出--debug否则是-, 注意代码中会将- 认为是空值""
  1. Include 指令:可以引用别的模版配置,实现组合的效果,因此诞生了任务模块的概念

Todo:

  1. 支持并行逻辑,例如下图,即我们需要一个 组任务的概念,目前还没有此类需要,所以暂时没有支持
  1. 解决循环引用的问题,既然我们支持了 include 指令,必不可少的就是循环引用检测

使用说明

devtool工具在这里:github.com/anthony-don...

shell 复制代码
➜  ~ devtool run --help
Name: Run task templates

Usage: devtool run [flags]

Options:
  -c, --config string     The task config file
  -d, --debug             Enable Debug
  -h, --help              help for run
  -I, --include strings   Add an config search path for includes
  -l, --list              List task config files
      --var strings       Define template variables

Global Options:
      --config-file string   Set the config file
      --log-level string     Set the log level in [fatal|error|warn|info|debug]
  -v, --verbose              Turn on verbose mode      

核心介绍一下 -I 参数,你可以指定多个include路径,类似于 gcc -I 这个参数一样搜索头文件,因为我们可能会定义一些公共模块在一个通用目录下。其次 include指令的搜索逻辑是优先当前引用文件的路径,其次是指定-I 的路径下搜索!

例子

相关配置文件在 test 文件夹下

  1. 背景:我们这边有多个API服务,他的框架都一样,因此大概它的启动脚本都一样,字节这边go-api服务基本使用的是hertz/ginex,这里以ginex框架为例子

  2. 第一步: 定义 sd.yaml , 它是一个服务发现[service discovery]的任务模版,主要是用于注册服务

yaml 复制代码
- name: "注册 {{ .SERVICE }} 服务" # 任务名称,其中 {{ .XXX }} 模版表达式,使用的是Go语言的自带的模版
  cmd: "sd" # 命令名称
  daemon: true # 表示后台运行这个程序,当整个程序组结束时会kill掉此进程的
  args:
    - "consul"
    - "--service"
    - "{{ .SERVICE }}"
    - "--env"
    - "{{ .ENV }}"
    - "--cluster"
    - "{{ .CLUSTER }}"
    - "--port"
    - "{{ .PORT }}"
  vars: # 模版变量
    ENV: "dev_xiaoming"
    CLUSTER: "default"
    PORT: 10086
  1. 定义 ginex.yaml 为 ginex 框架的运行模版
yaml 复制代码
- include: "sd.yaml" # include sd.yaml 配置
  vars:
    PORT: 9999 #ginex 服务的端口是9999
- name: "启动 {{ .SERVICE }} 服务"
  cmd: "devtool"
  dir: "{{ .HOME }}/go/src/{{ .REPO }}" # HOME 为全局变量默认是用户根路径
  env:
    - "SSO_DEBUG_USER={{ .USERNAME }}"
    - "LOAD_SERVICE={{ .SERVICE }}"
  args:
    - "go"
    - "run"
    - '{{ IF .DEBUG "1" "--debug" "-" }}' # 通过IF表达式来动态注入--debug参数
    - "--run"
    - "."
    - "--"
    - "-service={{ .SERVICE }}"
    - "-conf-dir=conf"
    - "-log-dir=log"
  vars:
    DEBUG: 0 # 默认是0表示禁止DEBUG
    USERNAME: "xiaoming" # 默认是xiaoming
  1. 定义Api服务 github.search.api.yaml 的配置文件
yaml 复制代码
- include: "ginex.yaml"
  vars:
    SERVICE: "github.search.api"
    REPO: "github.com/github/search_api"
    DEBUG: 1
  1. 测试,可以执行 devtool run -c command/run/test/github.search.api.yaml -d -v 来输出配置信息,检查是否正确
shell 复制代码
➜  golang git:(master) ✗ devtool run -c command/run/test/github.search.api.yaml -d -v
[DEBUG] 13:25:44.496 start cmd: devtool, cmd.args: [], os.args: ["devtool","run","-c","command/run/test/github.search.api.yaml","-d","-v"]
[DEBUG] 13:25:44.496 includes: ["/Users/bytedance/go/src/github.com/anthony-dong/golang"]. debug file: true.
[INFO] 13:25:44.496 init template vars: {
    "HOME": "/Users/bytedance",
    "PWD": "/Users/bytedance/go/src/github.com/anthony-dong/golang"
}
[INFO] 13:25:44.497 file: /Users/bytedance/go/src/github.com/anthony-dong/golang/command/run/test/github.search.api.yaml
- name: 注册 github.search.api 服务
  cmd: sd
  args:
    - consul
    - --service
    - github.search.api
    - --env
    - dev_xiaoming
    - --cluster
    - default
    - --port
    - "9999"
  vars:
    CLUSTER: default
    ENV: dev_xiaoming
    PORT: "9999"
  daemon: true
- name: 启动 github.search.api 服务
  cmd: devtool
  dir: /Users/bytedance/go/src/github.com/github/search_api
  env:
    - SSO_DEBUG_USER=xiaoming
    - LOAD_SERVICE=github.search.api
  args:
    - go
    - run
    - --debug
    - --run
    - .
    - --
    - -service=github.search.api
    - -conf-dir=conf
    - -log-dir=log
  vars:
    DEBUG: "1"
    USERNAME: xiaoming
  1. 执行,只需要把 -d 参数移除掉就会开始执行任务
相关推荐
源码12151 小时前
ASP.NET MVC宠物商城系统
后端·asp.net·宠物
Ai 编码助手2 小时前
Go语言 实现将中文转化为拼音
开发语言·后端·golang
hummhumm2 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang
杜杜的man2 小时前
【go从零单排】Directories、Temporary Files and Directories目录和临时目录、临时文件
开发语言·后端·golang
wywcool2 小时前
JVM学习之路(5)垃圾回收
java·jvm·后端·学习
喜欢打篮球的普通人3 小时前
rust高级特征
开发语言·后端·rust
代码小鑫4 小时前
A032-基于Spring Boot的健康医院门诊在线挂号系统
java·开发语言·spring boot·后端·spring·毕业设计
豌豆花下猫4 小时前
REST API 已经 25 岁了:它是如何形成的,将来可能会怎样?
后端·python·ai
喔喔咿哈哈5 小时前
【手撕 Spring】 -- Bean 的创建以及获取
java·后端·spring·面试·开源·github
夏微凉.5 小时前
【JavaEE进阶】Spring AOP 原理
java·spring boot·后端·spring·java-ee·maven