MyNixOS website logo
Description

Github Actions.

This library provides types and instances for serializing and deserializing Github Actions YAML, so that flows can be built and maintained in Haskell.

Github Actions

Haskell-CI

This library provides types and instances for serializing and deserializing GitHub Actions YAML, so that workflows can be built and maintained in Haskell.

As specified here: https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions

Usage Examples

1. Exporting a Workflow to YAML

You can create a workflow in Haskell and export it to YAML format:

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Yaml as Yaml
import qualified Data.Map as Map
import qualified Data.Set as Set
import Data.List.NonEmpty (NonEmpty(..))
import Language.Github.Actions.Workflow
import qualified Language.Github.Actions.Job as Job
import qualified Language.Github.Actions.Job.Id as JobId
import qualified Language.Github.Actions.Step as Step
import qualified Language.Github.Actions.Workflow.Trigger as Trigger

-- Create a simple CI workflow
myWorkflow :: Workflow
myWorkflow = new
  { workflowName = Just "CI"
  , on = Set.singleton (Trigger.PushTrigger Trigger.pushTriggerDefaults)
  , jobs = Map.singleton (JobId.JobId "build") buildJob
  }

buildJob :: Job.Job
buildJob = Job.new
  { Job.jobName = Just "Build and Test"
  , Job.runsOn = Just "ubuntu-latest"
  , Job.steps = Just $ checkoutStep :| [buildStep, testStep]
  }

checkoutStep :: Step.Step
checkoutStep = Step.new
  { Step.name = Just "Checkout repository"
  , Step.uses = Just "actions/checkout@v4"
  }

buildStep :: Step.Step
buildStep = Step.new
  { Step.name = Just "Build project"
  , Step.run = Just "npm install && npm run build"
  }

testStep :: Step.Step
testStep = Step.new
  { Step.name = Just "Run tests"
  , Step.run = Just "npm test"
  }

-- Export to YAML
exportWorkflow :: IO ()
exportWorkflow = Yaml.encodeFile "workflow.yml" myWorkflow

2. Importing a YAML file into a Workflow representation

You can load an existing GitHub Actions YAML file into a Haskell Workflow type:

{-# LANGUAGE TypeApplications #-}

import qualified Data.Yaml as Yaml
import Language.Github.Actions.Workflow (Workflow)

-- Import from YAML file
importWorkflow :: FilePath -> IO (Either String Workflow)
importWorkflow yamlFilePath = do
  result <- Yaml.decodeFileEither @Workflow yamlFilePath
  case result of
    Left parseException ->
      return $ Left $ Yaml.prettyPrintParseException parseException
    Right workflow ->
      return $ Right workflow

-- Example usage
main :: IO ()
main = do
  result <- importWorkflow ".github/workflows/ci.yml"
  case result of
    Left errorMsg -> putStrLn $ "Failed to parse workflow: " ++ errorMsg
    Right workflow -> do
      putStrLn "Successfully parsed workflow!"
      print workflow
Metadata

Version

0.1.0.0

Platforms (76)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-linux
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows