DEV Community

Cover image for If statements on Github Actions
Tomas Sirio
Tomas Sirio

Posted on

If statements on Github Actions

Hey there!

Last week I faced the need to have different steps to be run when Github Actions was executed. Today I brought you a simple solution to how I managed to achieve this. Be warned, the important content of this post will be the Github Actions Workflow.

on: push

jobs:
    project-a-or-project-b:
        runs-on: ubuntu-latest
        name: Project A or Project B

        steps:

        - name: Checkout Main repository
          uses: actions/checkout@v2
          with:
            path: ./mainRepository

        - uses: actions/setup-go@v1
          with:
            go-version: '1.9.3' # The Go version to download (if necessary) and use.

        - name: Run Main Repository 
          id: main
          run: |
            cd ./mainRepository &&
            OUTPUT=$(go run main.go | tail -1) &&
            echo "::set-output name=OUTPUT::$OUTPUT"

        - name: Run Project A
          if: steps.main.outputs.OUTPUT == 0
          run: |
            cd ./mainRepository/projectA &&
            go run main.go

        - name: Run Project B
          if: steps.main.outputs.OUTPUT == 1
          run: |
            cd ./mainRepository/projectB &&
            go run main.go
Enter fullscreen mode Exit fullscreen mode

Step by step:

We define a workflow that will be run on a 'push' event. We name this job 'project-a-or-project-b' and we assign it to a ubuntu container with the latest version possible.

Our main program only calculates a random number between 0 and 1. We could say it's mostly a flip-coin program. If we get 0 we will run our 'projectA' program and if we get 1, we run 'projectB'

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    s1 := rand.NewSource(time.Now().UnixNano())
    r1 := rand.New(s1)
    result := r1.Intn(2)
    fmt.Println(result)
}
Enter fullscreen mode Exit fullscreen mode

Inside 'projectA' and 'projectB' there's just a Print indicating which routine is being run

package main

import "fmt"

func main() {
    fmt.Println("I'm running Project A")
}
Enter fullscreen mode Exit fullscreen mode

Our first step on the workflow is going to check-out the main repository in the ./mainRepository folder and then it will install go 1.9.3 in order to run the main program.

Once we get to the 'Run Main Repository' step, we assign it the id 'main' which will allow us later to get it's outputs. So we define an output of the program:

OUTPUT=$(go run main.go | tail -1)
Enter fullscreen mode Exit fullscreen mode

and then we indicate Github Actions that the OUPUT variable is going to be an output on that step:

echo "::set-output name=OUTPUT::$OUTPUT"
Enter fullscreen mode Exit fullscreen mode

Now it's time to know which side our coin landed on:

if: steps.main.outputs.OUTPUT == 0
Enter fullscreen mode Exit fullscreen mode

We can define an if statement on the steps that will depend on our OUTPUT from the last step. You can get your outputs concatenating the string 'steps.{step_name}.outputs.{step_output}

Alt Text

That's it for today. I'll leave you the repo so you can check if you are missing something while trying it

Top comments (1)

Collapse
 
kishanbsh profile image
Kishan B • Edited

it would be really useful if you can add examples for complex if conditions with && || and ()