The Rule Cookbook
This document is a (somewhat) random batch of recipes in case you just prefer a learn-by-example approach.
Happy cooking!
Hello World!¶
do: - echo: "Hello World!"
Running the Hello World above¶
The easiest way is to use the web REPL in your Clarive installation.
Just point your browser here:
https://yourclariveserver/r/repl
Write some code and hit Ctrl-Enter (Windows/Linux) or Cmd-Enter (Mac) to run it.
Putting comments in your code¶
do: # now for some hello-worldly stuff - print: Hello - print: World! # here me comment ok is too
Declaring programwise variables¶
vars: myvar: World do: - echo: Hello ${myvar}
Iterating over an array¶
vars: - myarray: - 1 - 2 - 3 do: - foreach: var: mycounter in: ${myarray} do: - echo: Hello number ${mycounter}
Creating and changing a Topic¶
do: - mid = create_topic: category: Enhancement data: description: | Just a short description status: New title: My topic title - update_topic: mid: ${mid} data: title: 'Changed it just now' - change_status: mid: ${mid} to: Fixed
Calling a web-service¶
do: - request: url: http://jsonplaceholder.typicode.com/posts method: POST returning: res - print: hello ${res.content}
Show the server you are deploying to in the job log¶
Use variables in decorators to customize your log output.
deploy: - foreach: var: host in: [ 'server1', 'server2' ] do: - ship [shipping to server ${host}]: host: ${host} from: local/path/file.txt to: /tmp/remotepath/
Send a single file to a remote server¶
do: # first we create a local file in /clarive/local/path/file.txt - write_file: file: local/path/file.txt body: hello world # now we ship local/* but remove the prefix 'local/' - ship: from: local/path/file.txt to: /tmp/remotepath/ host: localhost
Send a whole directory to a remote server¶
do: - mkdir -p mylocaldir/subdir - touch mylocaldir/subdir/my_file # now we ship local/* but remove the prefix 'local/' - ship: from: mylocaldir to: /tmp/remotepath/ host: localhost
Send a relative directory to a remote server¶
do: # first we create a local file in /clarive/local/path/file.txt - write_file: file: local/path/file.txt body: hello world # now we ship local/* but remove the prefix 'local/' - ship: from: local/ anchor_path: local/ to: /tmp/remotepath/ host: localhost include: - \.txt$ # only files that end in \.txt
Import a module¶
import: - .clarive/mymodule.yml
Joining an array into a string¶
do: - users =: - user1 - user2 - echo: | {{ users.map( function(val){ return `<li>${val}</li>` }).join('\n') }}
Using ES6/Babel in ClaJS¶
Using the Babel transpiler in handlebar templates:
do: - foo =: - user1 - user2 - echo: | {{ "use transpiler(babel)"; foo.map( ( val ) => `<li>${val}</li>` ).join('\n') }}
And in a full ClaJS code block:
do: | "use transpiler(babel)"; class Builder { foo(x) { return `value=${x}` } } let obj = new Builder(); print( obj.foo( 123 ) );
Publish a file to the job log¶
build: - tar cvzf dist-files.tgz dist/ - log: msg: build completed file: dist-files.tgz
Zip a directory¶
The base
parameter is not required. By default
it's set to /
, meaning it starts relative to from
.
do: - zip: from: /tmp/zzz/ to: /tmp/rr.zip base: /
If you want to prepend a different base, just add it to base
.
do: - zip: from: /tmp/zzz/ to: /tmp/rr.zip base: myprefix/this/dir
Zip a directory with a different timestamp¶
Sometimes you want to timestamp in a zip to a different
timestamp from what the system offers you. That
can be accomplished with the time
option.
do: - zip: from: /tmp/zzz/ to: /tmp/rr.zip time: 2012-10-11 22:01:00
Tar a directory with relative path and timestamp¶
do: - tar: from: /tmp/zzz/ to: /tmp/mytar.tar base: /myprefix time: "2017-09-18 10:22:10"
Tar a directory including and excluding files¶
Includes are processed before exclude rules. In the following, files or
directories that contain the string file-
anywhere in its full path are
included, but files with the extension .txt
are excluded.
The include/exclude pattern matching does not take into consideration the
base
prefix.
do: - tar: from: /tmp/zzz/ to: /tmp/rr.tar include: - file- exclude: - \.txt
Parse a XML file into the stash¶
For this given XML file:
<xml> <somenode> hello world </somenode> </xml>
We would parse it with this code:
do: - parse_file: file: /path/to/file.xml type: xml returning: myvar - print: "Here we go: ${myvar.xml.somenode}"
Parse a XML file into the stash, removing the root node¶
The KeepRoot
option removes the root node.
do: - parse_file: file: /path/to/file.xml type: xml options: KeepRoot: 1 returning: myvar - print: "Here we go: ${myvar.somenode}" # note that the .xml part is not necessary anymore
Parse a YAML file into the stash¶
Given this input file.yml
aa: 10 bb: 20 foo: - 12 - 13
do: - parse_file: file: /path/to/file.yml type: yaml returning: myvar - print: "Here are the ${myvar.value[1]} reasons why" # ... 13 reasons why
Parse a INI file¶
foo=100 bar=200 log_file=/long/path/file.log [temporary] tmp_dir=/tmp tmp_port=8787
Parse it with:
do: - parse_file: file: /path/to/file.ini type: ini returning: myvar - echo: tmp_dir is ${myvar.temporary.tmp_dir}
Parse a Properties File¶
Here's a properties file straight out of the Wikipedia:
# You are reading the ".properties" entry. ! The exclamation mark can also mark text as comments. # The key characters =, and : should be written with # a preceding backslash to ensure that they are properly loaded. # However, there is no need to preceede the value characters =, and : by a backslash. website = https://en.wikipedia.org/ language = English # The backslash below tells the application to continue reading # the value onto the next line. message = Welcome to \ Wikipedia! # Add spaces to the key key\ with\ spaces = This is the value that could be looked up with the key "key with spaces". # Unicode tab : \u0009 # If you want your property to include a backslash, it should be escaped by another backslash path=c:\\wiki\\templates
Parse it with:
do: - parse_file: file: /path/to/file.properties type: properties returning: myprops - echo: tmp_dir is ${myprops.message}
Parse a JSON file¶
{ "foo": [ { "bar": true } ] }
Can be parsed with the following rulebook:
do: - parse: file: /tmp/tt/file.json type: json returning: aaa - echo: "true is ${aaa.foo[0].bar}" # true is 1
Parse from a string instead of a file¶
The parsed content does not necessarily has to be stored in a file. It could
just come from a variable or a string passed as the body
attribute.
vars: - jsondata: | { "foo": [ { "bar": true } ] } - xml_content: | <xml> <foo name="beautiful" /> </xml> do: - parse: body: ${jsondata} type: json returning: json_parsed - parse: body: ${xml_content} type: xml returning: xml_parsed - echo: "XML is ${xml_parsed.xml.foo.name}"
Replace a string in a file using sed¶
Just use the sed
op.
do: - write_file: file: subdir/foobar.txt body: foo=$${pie} # this is how we scape variables so that the rule won't parse it - pie =: pizza - sed: path: subdir/ - foo = parse: file: subdir/foobar.txt - echo: ${foo} # here is pizza