Learn Flowpipe
Flowpipe allows you to create "pipelines as code" to define workflows and other tasks that run in a sequence.
Creating your first pipeline
Getting started is easy! If you haven't already done so, download and install Flowpipe.
Flowpipe pipelines and triggers are packaged into mods, and Flowpipe requires a mod to run. Let's create a new directory for our mod, and then run flowpipe mod init
to initialize it:
mkdir learn_flowpipecd learn_flowpipeflowpipe mod init
The flowpipe mod init
command creates a file named mod.fp
in the directory. This file contains a mod
definition for our new mod:
mod "local" { title = "learn_flowpipe"}
You can customize the mod definition if you like, but the default is sufficient for our purposes.
Let's create our first pipeline.
Flowpipe mods are written in HCL. When Flowpipe runs, it will load the mod from the working directory and will read all files with the .fp
extension from the directory and its subdirectories recursively. Create a file named learn.fp
and add the following code:
pipeline "learn_flowpipe" { step "http" "get_ipv4" { url = "https://api.ipify.org?format=json" }
output "ip_address" { value = step.http.get_ipv4.response_body.ip }}
A Flowpipe pipeline is a sequence of steps to do work. This snippet creates a pipeline called learn_flowpipe
that has a single http step, and a single output.
Let's run it!
flowpipe pipeline run learn_flowpipe
Flowpipe runs the pipeline and prints its outputs once it is complete.
When troubleshooting, it's often useful to view more information about the currently executing steps. You can use the --verbose
flag to show this detailed information.
flowpipe pipeline run learn_flowpipe --verbose
Using mods
Flowpipe's modular design allows you to build pipelines from other pipelines. Let's install the reallyfreegeoip
mod:
flowpipe mod install github.com/turbot/flowpipe-mod-reallyfreegeoip
Installed 1 mod:
localāāā github.com/turbot/flowpipe-mod-reallyfreegeoip@v0.1.0
The mod is installed into the .flowpipe/mods
subdirectory, and a dependency is added to your mod.fp
.
Now that the mod is installed, you should see its pipelines:
flowpipe pipeline list
MOD NAME DESCRIPTIONlocal learn_flowpipereallyfreegeoip reallyfreegeoip.pipeline.get_ip_geolocation Get geolocation data for an IPv4 or IPv6 address.
You can run pipelines from the dependency mod on the command line:
flowpipe pipeline run reallyfreegeoip.pipeline.get_ip_geolocation --arg ip_address=35.236.238.30
Composing with pipelines
While running the dependency pipelines directly in the CLI is useful, the real power is the ability to compose pipelines from other pipelines. Let's add a pipeline step to take our IP address and look up our geo-location information.
pipeline "learn_flowpipe" { step "http" "get_ipv4" { url = "https://api.ipify.org?format=json" }
step "pipeline" "get_geo" { pipeline = reallyfreegeoip.pipeline.get_ip_geolocation args = { ip_address = step.http.get_ipv4.response_body.ip } }
output "ip_address" { value = step.http.get_ipv4.response_body.ip }
output "latitude" { value = step.pipeline.get_geo.output.geolocation.latitude }
output "longitude" { value = step.pipeline.get_geo.output.geolocation.longitude }}
Notice that we used the IP address from the first step (step.http.get_ipv4.response_body.ip
) as an argument to the second step. Flowpipe automatically detects this dependency and runs the steps in the correct order!
Let's add a couple more steps to get the weather forecast for our location.
pipeline "learn_flowpipe" { step "http" "get_ipv4" { url = "https://api.ipify.org?format=json" }
step "pipeline" "get_geo" { pipeline = reallyfreegeoip.pipeline.get_ip_geolocation
args = { ip_address = step.http.get_ipv4.response_body.ip } }
step "http" "get_weather" { url = join("", [ "https://api.open-meteo.com/v1/forecast", "?latitude=${step.pipeline.get_geo.output.geolocation.latitude}", "&longitude=${step.pipeline.get_geo.output.geolocation.longitude}", "¤t=temperature", "&forecast_days=1", "&daily=temperature_2m_min,temperature_2m_max,precipitation_probability_mean", "&temperature_unit=${step.pipeline.get_geo.output.geolocation.country_code == "US" ? "fahrenheit" : "celsius"}" ]) }
step "transform" "friendly_forecast" { value = join("", [ "It is currently ", step.http.get_weather.response_body.current.temperature, step.http.get_weather.response_body.current_units.temperature, ", with a high of ", step.http.get_weather.response_body.daily.temperature_2m_max[0], step.http.get_weather.response_body.daily_units.temperature_2m_max, " and a low of ", step.http.get_weather.response_body.daily.temperature_2m_min[0], step.http.get_weather.response_body.daily_units.temperature_2m_min, ". There is a ", step.http.get_weather.response_body.daily.precipitation_probability_mean[0], step.http.get_weather.response_body.daily_units.precipitation_probability_mean, " chance of precipitation." ]) }
output "ip_address" { value = step.http.get_ipv4.response_body.ip }
output "latitude" { value = step.pipeline.get_geo.output.geolocation.latitude }
output "longitude" { value = step.pipeline.get_geo.output.geolocation.longitude }
output "forecast" { value = step.transform.friendly_forecast.value }}
Send a message
Now we have a pipeline that can get the local forecast - let's send it somewhere! The message step provides a mechanism for sending messages via multiple communication channels, such as Slack and Email.
Add this step to the learn_flowpipe
pipeline.
step "message" "send_forecast" { notifier = notifier.default subject = "Todays Forecast" text = step.transform.friendly_forecast.value }
And run the pipeline again.
flowpipe pipeline run learn_flowpipe
You should see the message printed to the console when you run the pipeline.
Console messages and inputs are useful, but Flowpipe can also route these input requests, approvals and notifications to external systems like Slack, MS Teams, and Email!
Flowpipe Integrations allow you to interface with external systems. Notifiers allow you to route message and input steps to one or more integrations. Integrations are only loaded in server-mode.
Flowpipe server creates a default http
integration as well as a default notifier that routes to it, but you can send it via Email, Slack or Microsoft Teams without modifying the pipeline code. Just create the appropriate integrations, add them to the default notifier, and run the pipeline again from a server instance!
flowpipe server &flowpipe pipeline run learn_flowpipe --host local