-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.html
More file actions
516 lines (356 loc) · 27.4 KB
/
index.html
File metadata and controls
516 lines (356 loc) · 27.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb">
<head>
<meta name="generator" content="Hugo 0.54.0" />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title>Floe</title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet">
<link rel="stylesheet" href="http://www.floe.it/css/styles.css">
<link rel="stylesheet" href="http://www.floe.it/css/floe.css">
<link href="http://www.floe.it/index.xml" rel="alternate" type="application/rss+xml" title="Floe" />
</head>
<body>
<div class="sidebar sidebar-">
<div class="navigation">
<div class="logo"><img src="img/flow-big.png" height="32"></div>
<h1 class="site-title"><a href="http://www.floe.it/">loe</a></h1>
<nav class="internal">
<ul>
<li>
<a href="#intro">Introduction</a>
<ul>
<li><a href="#demo">Demo</a></li>
</ul>
</li>
<li>
<a href="#docs">Docs</a>
<ul>
<li><a href="#quick-start">Quick Start</a></li>
<li><a href="#terminology">Terminology</a></li>
<li><a href="#lifecycle">Life Cycle</a></li>
<li><a href="#config">Config</a></li>
</ul>
</li>
</ul>
</nav>
<nav class="external">
<div class="external-title"></div>
<ul id="shortcuts">
<li>
<a href="https://github.com/floeit/floe" target="_blank" rel="noopener">Floe on Github</a>
</li>
</ul>
</nav>
</div>
<div class="version">
generated on Feb 27, 2019
</div>
</div>
<div class="content">
<section class="page" id="intro">
<h1>
<a href="#intro">Introduction</a>
</h1>
<div class="content">
<p>Floe is a continuous delivery cluster written in golang. It can be used for all general build and deploy types, not just go. Essentially a golang alternative to jenkins pipelines, and GoCD.</p>
<p><img src="/img/floe.png" alt="Flow in progress" /></p>
<p>All configuration is via yaml files that are expected to come from a repo. There is no config via a web interface - which is hard to version control.</p>
<div class="block note">
<p>A floe cluster is masterless, so scales well and is robust. Master slave topologies can also easily be created.</p>
</div>
</div>
</section>
<section class="page" id="demo">
<h1>
<a href="#demo">Demo</a>
</h1>
<div class="content">
<p>There is a demo server that checks out and builds the floe code…</p>
<p><a href="https://demo.floe.it/app/flows/floe">DEMO</a> (enter any username and password - it is not checked)</p>
</div>
</section>
<section class="page" id="docs">
<h1>
<a href="#docs">Docs</a>
</h1>
<div class="content">
<p>Get up and running with floe.</p>
</div>
</section>
<section class="page" id="quick-start">
<h1>
<a href="#quick-start">Quick Start</a>
</h1>
<div class="content">
<p><a href="https://github.com/floeit/floe/releases">Download</a> or build from scratch a <code>floe</code> executable, and add a local <a href="http://www.floe.it/#example"><code>config.yml</code></a></p>
<p>Start a host processes:</p>
<p><code>floe -tags=linux,go,couch -admin=123456 -host_name=h1 -pub_bind=127.0.0.1:8080</code></p>
<p>These commands default to reading in the local <code>config.yml</code></p>
<h2 id="web">web</h2>
<p>Open a local browser to <a href="http://localhost:8080/app/dash">http://localhost:8080/app/dash</a></p>
</div>
</section>
<section class="page" id="terminology">
<h1>
<a href="#terminology">Terminology</a>
</h1>
<div class="content">
<p>Flows are coordinated by nodes issuing events to which other nodes <code>listen</code>.</p>
<p><code>Host</code> - Any named running <code>floe</code> service, it could be many such processes on single compute unit (vm, container), or one each.</p>
<p><code>Flow</code> - A description of a set of <code>nodes</code> linked by events. A specific instance of an flow is a <code>Run</code></p>
<p><code>Node</code> - A config item that can respond to and issue events. A Node is part of a flow. Certain Nodes can Execute actions.</p>
<p>The types of Node are.</p>
<ul>
<li><code>Triggers</code> - These start a run for their flow, and are http or polling nodes that respond to http requests or changes in a polled entity.</li>
<li><code>Tasks</code> - Nodes that on responding to an event execute some action, and then emit an event.</li>
<li><code>Merges</code> - A node that waits for <code>all</code> or <code>one</code> of a number of events before issuing its event.</li>
</ul>
<p><code>Run</code> - A specific invocation of a flow, can be in one of three states Pending, Active, Archive.</p>
<p><code>Workspace</code>- A place on disc for this run where most of the run actions should take place. Since flow can execute arbitrary scripts, there is no guarantee that mutations to storage are constrained to this workspace. It is up to the script author to isolate (e.g. using containers, or great care!)</p>
<p><code>RunRef</code> - An ‘adopted’ RunRef is a globally unique compound reference that resolves to a specific Run.</p>
<p><code>Hub</code> - Is the central routing object. It instantiates Runs and executes actions on Nodes in the Run based on its config from any events it observes on its queue.</p>
<p><code>Event</code> - Events are issued after a node has completed its duties. Other nodes are configured to listen for events. Certain other events are emitted that announce other state changes. Events are propagated to any clients connected via web sockets.</p>
<p><code>Queue</code> - The hub event queue is the central chanel for all events.</p>
<p><code>RunStore</code> - the hub references a run store that can persist the following lists - representing the three states of a run..</p>
<ul>
<li><code>Pending</code> - Runs waiting to be executed, a Run on this list is called a Pend.</li>
<li><code>Active</code> - Runs that are executing, and will be matched to events with matching adopted RunRefs.</li>
<li><code>Archive</code> - Runs that are have finished executing.</li>
</ul>
</div>
</section>
<section class="page" id="lifecycle">
<h1>
<a href="#lifecycle">Life Cycle</a>
</h1>
<div class="content">
<p>When a trigger event arrives on the queue that matches a flow, the event reference will be considered ‘un-adopted’ this means it has not got a full run reference. A pending run is created with a globally unique compound reference (now adopted) - this reference (and some other meta data) is added to the pending list of the host that adopted it as a ‘Pend’ - this may not be the host that executes the run later. (These were called TODO’s but that has a very particular meaning!)</p>
<p>A background process tries to assign Pend’s to any host where the <code>HostTags</code> match, and where there are no Runs already matching the <code>ResourceTags</code> asked for - this allows certain nodes to be assigned to certain Runs, and to serialise Runs that need exclusive access to any third party, or other shared resources.</p>
<p>Once a Pend has been dispatched for execution it is moved out of the adopting Pending list and into the Active List on the executing host.</p>
<p>When one of the end conditions for a Run is met the Run is moved out of the Active list and into the Archive list on the host that executed the Run.</p>
<p>All of this is dealt with in the <code>Hub</code> the files are divided into three:</p>
<ul>
<li><code>hub_setup.go</code> - The Hub definition and initial setup code.</li>
<li><code>hub_pend.go</code> - Code that handle events that trigger a pending run, and dispatches them to available hosts.</li>
<li><code>hub_exec.go</code> - Code that accepts a pending run and activates it, directs events to task nodes, and Executes tasks.</li>
</ul>
</div>
</section>
<section class="page" id="config">
<h1>
<a href="#config">Config</a>
</h1>
<div class="content">
<h3 id="common-config">Common Config</h3>
<p>All config has a Common section which has the following top level config items:</p>
<ul>
<li><code>hosts</code> - []string - All other floe Hosts</li>
<li><code>base-url</code> - string - The api base url, in case hosting on a sub domain.</li>
<li><code>config-path</code> - string - Is a path to the config which can be a path to a file in a git repo e.g. git@github.com:floeit/floe.git/build/FLOE.yaml</li>
<li><code>store-type</code> - string - Define which type of store to use - memory, local, ec2</li>
<li><code>git-key</code> - string - The private key to use with git, if empty then the system installed key is used. e.g.</li>
</ul>
<pre><code> git-key: "/home/ubuntu/.ssh/id_floedemo_rsa"
</code></pre>
<h3 id="flow-config">Flow Config</h3>
<p><strong>A note on the workspace var</strong>
Many field values will expand to include the workspace. Any <code>{{ws}}</code> will be replaced by the absolute workspace path.
Task fields that start <code>./</code> (and are not <code>./...</code>) will also be replaced by the absolute workspace path, as will any value <code>.</code> on its own.</p>
<p>A flow has the following top level config items:</p>
<ul>
<li><code>id</code> - string - url friendly ID - computed from the name if not given explicitly.</li>
<li><code>ver</code>- int - Flow version, together with an ID form a global compound unique key.</li>
<li><code>name</code> - string - human friendly name for the flow - will show up in web interface.</li>
<li><code>reuse-space</code> - bool - If true then will use the single workspace and will mutex with other instances of this Flow on the same host.</li>
<li><code>host-tags</code> - ([]string) - Tags that must match the tags on the host, useful for assigning specific flows to specific hosts.</li>
<li><code>resource-tags</code> - ([]string) - Tags that represent a set of shared resources that should not be accessed by two or more runs. So if any flow has an active run on a host then no other flow can launch a run if the flow has any tags matching the one running.</li>
<li><p><code>env</code> - ([]string) - In the form of key=value environment variable to be set in the context of the command being executed, can include <code>{{ws}}</code> to expand to full absolute path - <code>.</code> at the start will be treated like <code>{{ws}}</code>.</p></li>
<li><p><code>flow-file</code> - string - the reference to a file that can be loaded as the pending run is generated, this file will override the config of the floe - so can be used like a jenkinsfile, three types of reference can be used…</p>
<ul>
<li><code>file</code> - load it from the local file system. e.g. <code>floes/floe.yaml</code></li>
<li><code>git</code> - do the shallowest clone of the repo specified and grab the content e.g. <code>git@github.com:floeit/floe.git/build/FLOE.yaml</code> in this case if the opts contain a ref then the ref (git ref - e.g. tag, branch etc.) will be used</li>
<li><code>fetch</code> - Fetch a file via http(s) e.g. <code>https://raw.githubusercontent.com/floeit/floe/redesign/confog.yaml</code></li>
</ul></li>
</ul>
<h3 id="triggers">Triggers</h3>
<p>Triggers are the things that start a flow off there are a few types of trigger.</p>
<ul>
<li><code>data</code> - Where a web request pushing data to the server may trigger a flow - for example the web interface uses this, to explicitly launch a run.</li>
<li><code>timer</code> - A flow can be triggered periodically - as a timer does not contain any repo version info this can only include git</li>
<li><code>poll-git</code> - A git repo will be polled for changes matching the parameters. One or more runs may be added to the pending queue.</li>
</ul>
<h3 id="trigger-types">Trigger Types</h3>
<h4 id="data">data</h4>
<p>Data triggers set up a http endpoint on the host that responds to a <code>POST</code> request on the <code>/data</code> url (e.g. <a href="http://localhost:8080/build/api/push/data">http://localhost:8080/build/api/push/data</a> )</p>
<p>Options:</p>
<ul>
<li><code>cmd</code> - Use this if you are running an executable that only depends on the</li>
</ul>
<h3 id="tasks">Tasks</h3>
<p>All tasks have the following top level fields:</p>
<ul>
<li><code>id</code> - (string) A url friendly identity for this node, it has to be unique within a flow. If an id is not give then the name will be used to generate the ID.</li>
<li><code>name</code> - (string) A human friendly name to display in the web interface. If a name is not given then one will be generated from the id (either a <code>name</code> or <code>id</code> must be given).</li>
<li><code>class</code> - There are only two task classes:<br />
<ul>
<li><code>task</code> - A standard task does something - this is the default, and does not need to be in the config explicitly.</li>
<li><code>merge</code> - A merge task waits for all or one of a list of events.</li>
</ul></li>
<li><code>listen</code> - (string) The event tag that will trigger this</li>
</ul>
<p>Standard tasks (class <code>task</code>) have the following fields.</p>
<ul>
<li><code>ignore-fail</code> - Only ever send an event tag containing the <code>good</code>postfix, even if the node failed. Can’t be used in conjunction with <code>use-status</code>.</li>
<li><code>type</code> - The specific type of task to execute.
<ul>
<li><code>end</code> - Special task that when reached positively indicates the flow ended.</li>
<li><code>data</code> - Accepts data from the web API, and is used to create web forms.</li>
<li><code>timer</code> - Waits a certain amount of time before firing its success event.</li>
<li><code>exec</code> - The main work horse, execute commands directly or via invoking a shell.</li>
<li><code>fetch</code> - Downloads a file over http(s).</li>
<li><code>git-checkout</code> - Checkout a git repo</li>
</ul></li>
<li><code>good</code> - ([]int) The array of exit status codes considered a success. Default is <code>0</code> (an array of this one value)</li>
<li><code>use-status</code> - (bool) If true then rather emit an event on task end containing the postfix <code>good</code> or <code>bad</code> use the actual exit code.</li>
<li><code>opts</code> - (map) The variable map of options as needed by each <code>type</code>.</li>
</ul>
<p>Merge tasks (class <code>merge</code>) have the following fields.</p>
<ul>
<li><code>wait</code> - ([]string) - Array of event tags to wait for.</li>
<li><code>type</code> - The type of merge.
<ul>
<li><code>all</code> - Wait for all events in the wait array.</li>
<li><code>any</code> - Wait for any of the events in the wait array.</li>
</ul></li>
</ul>
<h3 id="task-types">Task Types</h3>
<p>The specific task types and associated options.</p>
<h4 id="exec">exec</h4>
<p>The most common type of task node - executes a command, e.g. runs a mke command or a bash script.</p>
<p>Options:</p>
<ul>
<li><code>cmd</code> - Use this if you are running an executable that only depends on the binary, and does not use shell expansions in the args like ‘*‘, ‘.’ etc.</li>
<li><code>shell</code> - Use this if you are running something that requires the shell, e.g. bash scripts, or other sell extensions like ‘*‘, ‘.’ etc. This version is generally more forgiving than ‘cmd’.</li>
<li><code>args</code> - An array of command line arguments - for simple arguments these can be included space delimited in the <code>cmd</code> or <code>shell</code> lines, if there are quote enclosed arguments then use this args array for them.</li>
<li><code>sub-dir</code> - The sub directory (relative to the run workspace) to execute the command in.</li>
<li><code>env</code> - ([]string) - In the form of key=value environment variable to be set in the context of the command being executed.</li>
<li><code>git-key</code> - (string) - the path to a private key to use with this command. If you are mutating a remote repo (that is not the repo already used) using the command <code>git</code> then you probably want to include a specific key here (in Github a per repo deploy key may be in order.) This will override the common config git-key, and will be the setting used for all subsequent nodes, until the next occurrence of .</li>
</ul>
<h4 id="fetch">fetch</h4>
<p>Downloads and caches a file from the web.</p>
<p>Options:</p>
<ul>
<li><code>url</code> - The URL to get the file from.</li>
<li><code>checksum</code> - The checksum to validate the file.</li>
<li><code>checksum-algo</code> - What algorithm to use to compute the checksum <code>sha256</code>, <code>sha1</code> or <code>md5</code> are supported.</li>
<li><code>location</code> - Where to link the file once downloaded - can use <code>{{ws}}</code> substitution. Relative paths will be relative to the workspace folder for the run in any case. If no location is given it will be linked to the root of the workspace. If the location ends in <code>/</code> (or <code>\</code> on some systems) then the file will be named as the download name, but linked to the location specified.</li>
</ul>
<h2 id="example">Example</h2>
<p>The following is the example config taken from the git repo…</p>
<div class="highlight"><pre style="color:#272822;background-color:#fafafa;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-yaml" data-lang="yaml">common<span style="color:#111">:</span>
base-url<span style="color:#111">:</span> <span style="color:#d88200">"/build/api"</span>
store-type<span style="color:#111">:</span> local
hosts<span style="color:#111">:</span> <span style="color:#75715e"># defines the cluster topology</span>
- http<span style="color:#111">:</span>//<span style="color:#ae81ff">127.0</span>.<span style="color:#ae81ff">0.1</span><span style="color:#111">:</span><span style="color:#ae81ff">8080</span>
<span style="color:#75715e"># - http://127.0.0.1:8090</span>
flows<span style="color:#111">:</span>
- id<span style="color:#111">:</span> build-project <span style="color:#75715e"># the name of this flow</span>
name<span style="color:#111">:</span> Build Project
ver<span style="color:#111">:</span> <span style="color:#ae81ff">1</span>
reuse-space<span style="color:#111">:</span> <span style="color:#00a8c8">false</span> <span style="color:#75715e"># reuse the workspace (false) - if true /single used </span>
resource-tags<span style="color:#111">:</span> <span style="color:#111">[</span>couchbase<span style="color:#111">,</span> nic<span style="color:#111">]</span> <span style="color:#75715e"># resource labels that any other flows cant share</span>
host-tags<span style="color:#111">:</span> <span style="color:#111">[</span>linux<span style="color:#111">,</span> go<span style="color:#111">,</span> couch<span style="color:#111">]</span> <span style="color:#75715e"># all these tags must match the tags on any host for it to be able to run there</span>
triggers<span style="color:#111">:</span> <span style="color:#75715e"># external events to subscribe to</span>
- name<span style="color:#111">:</span> push <span style="color:#75715e"># name of this trigger</span>
type<span style="color:#111">:</span> git-push <span style="color:#75715e"># the type of this trigger</span>
opts<span style="color:#111">:</span>
url<span style="color:#111">:</span> blah.blah <span style="color:#75715e"># which url to monitor</span>
- name<span style="color:#111">:</span> start
type<span style="color:#111">:</span> data
opts<span style="color:#111">:</span>
form<span style="color:#111">:</span>
title<span style="color:#111">:</span> Start
fields<span style="color:#111">:</span>
- id<span style="color:#111">:</span> ref
prompt<span style="color:#111">:</span> Ref (branch or hash)
type<span style="color:#111">:</span> text
value<span style="color:#111">:</span> master
- id<span style="color:#111">:</span> from-ref
prompt<span style="color:#111">:</span> Ref to merge (branch or hash)
type<span style="color:#111">:</span> text
tasks<span style="color:#111">:</span>
- name<span style="color:#111">:</span> Checkout <span style="color:#75715e"># the name of this node </span>
type<span style="color:#111">:</span> git-merge <span style="color:#75715e"># the task type </span>
listen<span style="color:#111">:</span> trigger.good <span style="color:#75715e"># the event tag that triggers this node</span>
good<span style="color:#111">:</span> <span style="color:#111">[</span><span style="color:#ae81ff">0</span><span style="color:#111">]</span> <span style="color:#75715e"># define what the good statuses are, default [0]</span>
ignore-fail<span style="color:#111">:</span> <span style="color:#00a8c8">false</span> <span style="color:#75715e"># if true only emit good</span>
opts<span style="color:#111">:</span>
sub-dir<span style="color:#111">:</span> src/github.com/floeit
url<span style="color:#111">:</span> git@github.com<span style="color:#111">:</span>floeit/floe.git
- name<span style="color:#111">:</span> Echo
type<span style="color:#111">:</span> exec
listen<span style="color:#111">:</span> task.checkout.good
opts<span style="color:#111">:</span>
cmd<span style="color:#111">:</span> <span style="color:#d88200">"echo"</span>
args<span style="color:#111">:</span> <span style="color:#111">[</span><span style="color:#d88200">"dan is a goon"</span><span style="color:#111">]</span>
- name<span style="color:#111">:</span> Build
type<span style="color:#111">:</span> exec
listen<span style="color:#111">:</span> task.checkout.good
opts<span style="color:#111">:</span>
cmd<span style="color:#111">:</span> <span style="color:#d88200">"ls"</span> <span style="color:#75715e"># the command to execute </span>
args<span style="color:#111">:</span> <span style="color:#111">[</span><span style="color:#d88200">"-lrt"</span><span style="color:#111">,</span> <span style="color:#d88200">"/"</span><span style="color:#111">]</span>
- name<span style="color:#111">:</span> Test
type<span style="color:#111">:</span> exec <span style="color:#75715e"># execute a command</span>
listen<span style="color:#111">:</span> task.build.good
opts<span style="color:#111">:</span>
shell<span style="color:#111">:</span> <span style="color:#d88200">"sleep 10"</span> <span style="color:#75715e"># the command to execute </span>
- name<span style="color:#111">:</span> Sign Off
type<span style="color:#111">:</span> data
listen<span style="color:#111">:</span> task.build.good <span style="color:#75715e"># for a data node this event has to have occured before the data node can accept data</span>
opts<span style="color:#111">:</span>
form<span style="color:#111">:</span>
title<span style="color:#111">:</span> Sign off Manual Testing
fields<span style="color:#111">:</span>
- id<span style="color:#111">:</span> tests_passed
prompt<span style="color:#111">:</span> Did the manual testing pass<span style="color:#111">?</span>
type<span style="color:#111">:</span> bool
- id<span style="color:#111">:</span> to_hash
prompt<span style="color:#111">:</span> To Branch (or hash)
type<span style="color:#111">:</span> string
- name<span style="color:#111">:</span> Wait For Tests and Sign Off
class<span style="color:#111">:</span> merge
id<span style="color:#111">:</span> signed
type<span style="color:#111">:</span> all
wait<span style="color:#111">:</span> <span style="color:#111">[</span>task.echo.good<span style="color:#111">,</span> task.test.good<span style="color:#111">,</span> task.sign-off.good<span style="color:#111">]</span>
- name<span style="color:#111">:</span> Final Task
type<span style="color:#111">:</span> exec <span style="color:#75715e"># execute a command</span>
listen<span style="color:#111">:</span> merge.signed.good
opts<span style="color:#111">:</span>
cmd<span style="color:#111">:</span> <span style="color:#d88200">"ls"</span> <span style="color:#75715e"># the command to execute </span>
- name<span style="color:#111">:</span> complete
listen<span style="color:#111">:</span> task.final-task.good
type<span style="color:#111">:</span> end <span style="color:#75715e"># getting here means the flow was a success 'end' is the special definitive end event</span>
- id<span style="color:#111">:</span> danmux
ver<span style="color:#111">:</span> <span style="color:#ae81ff">1</span>
triggers<span style="color:#111">:</span>
- name<span style="color:#111">:</span> start
type<span style="color:#111">:</span> data
opts<span style="color:#111">:</span>
form<span style="color:#111">:</span>
title<span style="color:#111">:</span> Start
fields<span style="color:#111">:</span>
- id<span style="color:#111">:</span> ref <span style="color:#75715e"># ref is a magic name that the git-checkout task type will use</span>
prompt<span style="color:#111">:</span> Git Ref (branch or hash etc)
type<span style="color:#111">:</span> text
- name<span style="color:#111">:</span> Every <span style="color:#ae81ff">5</span> Minutes
type<span style="color:#111">:</span> timer <span style="color:#75715e"># fires every period seconds</span>
opts<span style="color:#111">:</span>
period<span style="color:#111">:</span> <span style="color:#ae81ff">300</span> <span style="color:#75715e"># how often to fire in seconds</span>
flow-file<span style="color:#111">:</span> floe.yml <span style="color:#75715e"># get the actual flow from this file</span></code></pre></div>
</div>
</section>
</div>
</body>
</html>