View Source GitHubActions.Workflow (GitHubActions v0.2.1)

The GitHubActions.Workflow is used to create a GitHub actions workflow.

defmodule Minimal do
  use GitHubActions.Workflow

  def workflow do
    [
      name: "CI"
    ]
  end
end

The workflow module must define the workflow/0 function. This function returns a nested data structure that will be translated in a yml-file.

The line use GitHubActions.Workflow imports GitHubActions.Workflow, GitHubActions.Mix and GitHubActions.Sigils and adds the aliases GitHubActions.Config, GitHubActions.Project and GitHubActions.Versions.

List entries with the value :skip are not taken over.

Key-value pairs with a value of :skip are also not part of the resulting data structure.

With :skip, you can handle optional parts in a workflow script.

defmodule Simple do
  use GitHubActions.Workflow

  def workflow do
    [
      name: "CI",
      jobs: [
        linux: linux(),
        os2: os2()
      ]
    ]
  end

  defp linux do
    job(:linux,
      name: "Test on #{Config.fetch!([:linux, :name])}",
      runs_on: Config.fetch!([:linux, :runs_on])
    )
  end

  defp os2 do
    job(:linux,
      name: "Test on #{Config.fetch!([:os2, :name])}",
      runs_on: Config.fetch!([:os2, :runs_on])
    )
  end

  defp job(os, cofig) do
    case :jobs |> Config.get([]) |> Enum.member?(os) do
      true -> config
      false -> :skip
    end
  end
end

It is also possible to add steps when a dependency is available in the current project.

defmodule Simple do
  use GitHubActions.Workflow

  def workflow do
    [
      name: "CI",
      jobs: [linux: linux()]
    ]
  end

  defp linux do
    name: "Test on #{Config.fetch!([:linux, :name])}",
    runs_on: Config.fetch!([:linux, :runs_on])
    steps: [
      checkout(),
      check_code_format(),
      lint_code()
    ]
  end

  defp checkout do
    [
      name: "Checkout",
      uses: "actions/checkout@v3"
    ]
  end

  defp lint_code do
    case Project.has_dep?(:credo) do
      false ->
        :skip

      true ->
        [
          name: "Lint code",
          run: mix(:credo, strict: true, env: :test)
        ]
    end
  end

  defp check_code_format do
    case Config.get(:check_code_format, true) do
      false ->
        :skip

      true ->
        [
          name: "Check code format",
          run: mix(:format, check_formatted: true, env: :test)
        ]
    end
  end
end

Link to this section Summary

Functions

Evaluates a workflow script and returns the workflow data structure.

Link to this section Functions

@spec eval(Path.t()) :: {:ok, term()} | :error

Evaluates a workflow script and returns the workflow data structure.