Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.3 下载

0.5.2

内置环境变量

  • GXL_START_ROOT: GXL 启动处理的目录
  • GXL_CUR_DIR: GXL 当前所在目录,在调用gx.run时,与GXL_START_ROOT可能不同

0.5.1