Tutorial: Running parallel stages
This tutorial will take 5 minutes.
Installation
To start off, you need to have togomak installed on your system.
If you haven't installed it yet, check out the GitHub Releases (opens in a new tab)
to find an appropriate version for your system, or you could take a look
at the installation too.
Project Initialization
Create a new directory for your Togomak project and navigate to it in your terminal.
mkdir tutorial-parallel-stages
cd tutorial-parallel-stagesInitializing
Create a file called togomak.hcl, this is a bare minimum pipeline
that is required for togomak to identify it as a valid pipeline.
togomak {
  version = 2
}You may give a shot executing it now,
INFO[0000] togomak (version=dev)
INFO[0000] took 0sAdding stages
Now, let's create your first Togomak stage. Add the following code to your togomak.hcl file:
 
stage "hello_world" {
  script = <<-EOT
  for i in apple orange mango; do 
    echo Hello, World! $i
    sleep 1
  done
  EOT 
}
 
stage "another_stage" {
  script = <<-EOT
  for i in go rust python; do 
    echo I use $i
    sleep 1
  done
  EOT 
}<<-EOT is called a Heredoc. If you are not familiar with this syntax,
you should definitely check out Indented Heredocs. It's going to be handy.
Run your pipeline
You can run your pipeline, by either using togomak run or just togomak
togomakYou will notice that, although another_stage was defined after hello_stage,
both of them runs in parallel. This is because togomak is parallel by default.
INFO[0000] togomak (version=dev)
INFO[0000] [stage=hello_world] [+] hello_world
INFO[0000] [stage=another_stage] [+] another_stage
INFO[0000] [stage=hello_world] Hello, World! apple
INFO[0000] [stage=another_stage] I use go
INFO[0001] [stage=another_stage] I use rust
INFO[0001] [stage=hello_world] Hello, World! orange
INFO[0002] [stage=hello_world] Hello, World! mango
INFO[0002] [stage=another_stage] I use python
INFO[0003] took 3.009sYou will notice that the entire pipeline execution took 3 seconds. This is intuitively because both stages which was supposed to take 3 seconds ran in parallel.
Running one stage after another
Now, we will modify the pipeline such that the stage, stage.another_stage runs
exactly after stage.hello_world completes, here is our new pipeline:
togomak {
  version = 2
}
 
stage "hello_world" {
  script = <<-EOT
  for i in apple orange mango; do 
    echo Hello, World! $i
    sleep 1
  done
  EOT 
}
 
stage "another_stage" {
  depends_on = [stage.hello_world]
  script = <<-EOT
  for i in go rust python; do 
    echo I use $i
    sleep 1
  done
  EOT 
}Notice the new depends_on parameter? This implies that stage.another_stage
depends on the completion of stage.hello_world. Let's see how this turns out when we
run togomak.
togomakINFO[0000] togomak (version=dev)
INFO[0000] [stage=hello_world] [+] hello_world
INFO[0000] [stage=hello_world] Hello, World! apple
INFO[0001] [stage=hello_world] Hello, World! orange
INFO[0002] [stage=hello_world] Hello, World! mango
INFO[0003] [stage=another_stage] [+] another_stage
INFO[0003] [stage=another_stage] I use go
INFO[0004] [stage=another_stage] I use rust
INFO[0005] [stage=another_stage] I use python
INFO[0006] took 6.02sYep, now it ran one after another. The time taken, 6 seconds proves it too.
Run a specific stage
You can run specific stages.
togomak stage.another_stageINFO[0000] togomak (version=dev)
INFO[0000] [stage=hello_world] [+] hello_world (skipped)
INFO[0000] [stage=another_stage] [+] another_stage (overriden)
INFO[0000] [stage=another_stage] I use go
INFO[0001] [stage=another_stage] I use rust
INFO[0002] [stage=another_stage] I use python
INFO[0003] took 3.006s🎉 Congratulations
You just learnt about how the Togomak dependency resolution and default parallelism works. Note that, Togomak uses Topological Sort (opens in a new tab) to figure out the dependency tree.