Galaxy-Flow & Gxl
GXL 语法
结构
#![allow(unused)] fn main() { mod envs { env dev { } } mod main { flow conf { } } }
- mod 模块
- env 环境
- flow 处理流
flow
示例
简单使用
#![allow(unused)] fn main() { flow test { gx.echo ( "hello world" ); } }
增加描述
#![allow(unused)] fn main() { #[usage(desp="test flow")] flow test() { gx.echo ( "hello world" ); } }
编排
#![allow(unused)] fn main() { flow head { gx.echo ( "head"; ) } flow tail { gx.echo ( "tail"; ) } // 执行过程为: test -> head -> tail flow @test | head | tail { } flow test | head | tail { } // 执行过程为: head -> tail -> test flow | head | tail |@test { } //执行过程为: head -> test -> tail flow head | @test | tail { gx.echo ( "test"; ) } }
定义
#![allow(unused)] fn main() { flow [ <flows>|] @<flow_name> [|<flows>] { } }
分支
#![allow(unused)] fn main() { mod main { api = "1.0" flow conf { if ${API} == "1.0" { gx.echo ( value : "this is if true cond " ); } else { gx.echo ( value : "this is if false cond" ); } } } }
通配比较
#![allow(unused)] fn main() { mod main { api = "1.0" flow conf { if ${API} =* "1*" { gx.echo ( value : "this is if true cond " ); } else { gx.echo ( value : "this is if false cond" ); } } } }
env
环境设定集合
示例
#![allow(unused)] fn main() { env dev { root = "./" ; } }
#![allow(unused)] fn main() { #[useage(desp="开发环境")] env dev { root = "./" ; } }
mix env
#![allow(unused)] fn main() { env base {} env dev : base { root = "./" ; } }
- 默认env: default , 可以省去 gflow -e 参数 ;
定义
#![allow(unused)] fn main() { env <name> [: <mix-envs>] { } }
- name :
- mix-envs : 可继承的env
mod
mod 是顶级的组织结构
只有 envs,main 两个mod 中的 env 和 flow cli 直接load
#![allow(unused)] fn main() { mod envs { prop1 = "prop1" env dev {} } mod main { prop1 = "prop1" flow test {} } }
执行
#![allow(unused)] fn main() { gflow -e dev test }
mod 注解
mod继承
示例
#![allow(unused)] fn main() { }
Activity
- 包装shell 成为 activity
#![allow(unused)] fn main() { activity copy { src = "" ; dst = "" ; log = "1" ; out = "true" executer = "copy_act.sh" ; } }
flow
注解
task (v0.6.0)
#![allow(unused)] fn main() { #[task(name="setup")] flow setup{ ... } }
dryrun (v0.7.0)
#[dryrun(_pub_dryrun)]
flow _pub_dysec {
...
}
flow _pub_dryrun {
...
}
transcation undo (v0.7.0)
flow trans1 | step1 | step2 | step3 ;
#[transaction,undo(_undo_step1)]
flow step1 {
gx.echo (" step1 ");
}
#[undo(_undo_step2)]
flow step2 {
gx.echo (" step2 ");
}
#[undo(_undo_step3)]
flow step3 {
gx.echo (" step3 ");
gx.assert ( value : "true" , expect : "false" );
}
flow _undo_step1 {
gx.echo (" undo step1 ");
}
flow _undo_step2 {
gx.echo (" undo step2 ");
}
flow _undo_step3 {
gx.echo (" undo step3 ");
}
usage
#![allow(unused)] fn main() { #[usage(desp="test")] flow test_1 { } }
auto_load
#![allow(unused)] fn main() { #[auto_load(entry,exit)] //entry: 进入flow //exit : 退出flow 示例: mod main { flow start { gx.echo ( value : "hello" ); } #[auto_load(entry)] flow conf { gx.echo ( value : "hello" ); } } }
gflow
Usage: gflow [OPTIONS] [FLOW]...
Arguments:
[FLOW]... flow name ; eg: conf,test,package
Options:
-e, --env <ENV> env name ; eg: -e dev [default: default]
-d, --debug <DEBUG> debug level ; eg: -d 1 [default: 0]
-f, --conf <CONF> conf file ; default is work(./_rg/work.gxl) adm (./_rg/adm.gxl)
--log <LOG> config log ; eg: --log cmd=debug,parse=info
-q, --quiet
-h, --help Print help
-V, --version Print version
内置常量
- GXL_PRJ_ROOT: 最近定义了 _gal/project.toml 的目录
- GXL_START_ROOT: GXL 启动处理的目录
- GXL_CUR_DIR: GXL 当前所在目录,在调用gx.run时,与GXL_START_ROOT可能不同
- GXL_CMD_ARG: gflow -- <cmd_arg>
gx.assert
#![allow(unused)] fn main() { gx.assert ( value = "hello" , expect = "hello" ); }
参数
- value : [必须]需要验证的变量
- expect : [必须] 期待的结果
- result : "[true|false]" 默认值为 "true"
- err : 验证失败后的错误信息。
示例:
#![allow(unused)] fn main() { gx.assert ( value = "hello" , expect : "hello" , result : "false" , err:"test assert"); }
gx.cmd
#![allow(unused)] fn main() { gx.cmd ( cmd : "${PRJ_ROOT}/do.sh" ); // 可省略 cmd 参数名 gx.cmd ( "${PRJ_ROOT}/do.sh" ); }
属性参数
- cmd [必须][] 执行脚本
- log 日志输出级别
- quiet 静默,不输出出指令和结果
- expect 期待的结果
示例:
#![allow(unused)] fn main() { gx.cmd ( cmd : "${PRJ_ROOT}/do.sh", log : "1" , quiet : "true" , expect : "[0,1,255]" ) }
gx.run
#![allow(unused)] fn main() { gx.run ( local: "${PRJ_ROOT}/mod/" ,env : "dev", flow : "conf,test" ); }
属性参数
- local [必须] 运行所在目录
- env [必须] 运行环境
- flow [必须]运行的flow
- conf 运行的配置文件
示例:
#![allow(unused)] fn main() { gx.cmd ( cmd : "${PRJ_ROOT}/do.sh", log : "1" , out : "true" , expect : "[0,1,255]" ) }
gx.echo
#![allow(unused)] fn main() { gx.echo ( value : "${PRJ_ROOT}/test/main.py" ); // 可省略 value 参数名 gx.echo ( "${PRJ_ROOT}/test/main.py" ); }
属性参数
- value : [必须]需显示的变量
gx.read
读取信息到环境变量。
读取CMD运行结果到 name
#![allow(unused)] fn main() { env dev { gx.read_cmd ( name : "gx" , cmd : "echo rigger-1.0" ); } }
从INI文件中读取;
#![allow(unused)] fn main() { gx.read_file ( file : "${ENV_ROOT}/test.ini" ); gx.read_file ( "${ENV_ROOT}/test.ini" ); }
从标准输入读取;
#![allow(unused)] fn main() { env dev { gx.read_stdin ( prompt : "please input you name", name : "NAME" ); gx.echo ( "${NAME}" ); } }
gx.tpl
通过模板生成文件,使用 handlebars 引擎。
#![allow(unused)] fn main() { gx.tpl ( tpl : "${PRJ_ROOT}/conf_tpl.toml" , dst : "${PRJ_ROOT}/conf.toml" , ); }
属性参数
- tpl : [必须]模板文件
- dst : [必须]生成目标文件
#![allow(unused)] fn main() { gx.tpl ( tpl : "${PRJ_ROOT}/conf_tpl.toml" , dst : "${PRJ_ROOT}/conf.toml" , data : r#" { "name" : "xiaoming", "age" : 3 } "#x ); }
- data : 符合Json格式的模板数据
gx.vars
#![allow(unused)] fn main() { gx.vars { x = "${PRJ_ROOT}/test/main.py" ; y = "${PRJ_ROOT}/test/main.py" ; } }
x,y 自定义的变量,可以在gxL 和扩展脚本使用
gx.ver
#![allow(unused)] fn main() { gx.ver ( file : "./version.txt" , inc : "bugfix" ); }
属性参数
- file : version.txt 文件
- inc: 增长单位。 有 null,build,bugfix,feature,main 六个选项
gx.upload
#![allow(unused)] fn main() { gx.upload ( url: "https://github/galaxy-sec" , method : "put", local_file : "gflow" ); }
gx.download
#![allow(unused)] fn main() { gx.download( url: "https://github/galaxy-sec" , local_file : "gflow" ); }
- username : 用户名
- password : 密码
Changelog
0.7.0
新增
- 支持事务机制
- 支持dryrun机制 - 允许预览操作结果而不实际执行
0.6.4
新增
- 支持 gx.cmd quiet (静默) - 自定义控制cmd的日志输出与否
0.6.2
新增
- 优化日志输出,增加日志的重定向,支持捕获控制台标准日志输出
0.6.0
新增
- 生成任务报告 - 提供执行过程和结果的详细信息
- 支持flow上的Task注解 - 增强流程定义的灵活性
改进
- 改进 flow 编排语法,由: 变为 | 符号
gflow-0.5.3
内置环境变量
- GXL_PRJ_ROOT: 最近定义的 _gal/project.toml 的目录
extern mod 支持变量
extern mod head { path = "${GXL_START_ROOT}/_gal/"; }
0.5.2
内置环境变量
- GXL_START_ROOT: GXL 启动处理的目录
- GXL_CUR_DIR: GXL 当前所在目录,在调用gx.run时,与GXL_START_ROOT可能不同