# Release of ElixirScript, a Github Action to run Elixir code in workflow steps

**URL:** <https://forum.elixirforum.com/t/release-of-elixirscript-a-github-action-to-run-elixir-code-in-workflow-steps/59855>\
**Category:** Discussions\
**Tags:** github, github-actions\
**Created:** [November 21, 2023, 1:17am UTC](https://forum.elixirforum.com/t/release-of-elixirscript-a-github-action-to-run-elixir-code-in-workflow-steps/59855 "2023-11-21T01:17:35Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![gaggle](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/gaggle/32/30793_2.png) [@gaggle](https://forum.elixirforum.com/u/gaggle)\
**Post date:** [November 21, 2023, 1:17am UTC](https://forum.elixirforum.com/t/release-of-elixirscript-a-github-action-to-run-elixir-code-in-workflow-steps/59855/1 "2023-11-21T01:17:35Z")

</div>

Hi everyone,

I’ve released this new GitHub Actions called [Elixir Script](https://github.com/marketplace/actions/elixir-script), because I wanted a way to script various tasks in my GitHub Actions workflows and wished for a way to use Elixir to do it.

Thus: **ElixirScript, a Github Action to run Elixir code in workflow steps.**

It works by taking a script as input, which gets run, and then the script’s return is available in `outputs.result` for later steps to use. Like this:

`.github/workflows/example.yml`:

```elixir
- uses: gaggle/elixir_script@v0
  id: script
  with:
    script: |
      defmodule Greeter do
        def greet(name), do: "Oh hi #{name}!"
      end
      Greeter.greet("Mark")

- name: Get result
  run: echo "${{steps.script.outputs.result}}"
  # Echos "Oh hi Mark!"

```

And the script is run with bindings to the GitHub Actions context that caused the run, so it’s easy to react to run-specific information. For example, :

```elixir
  script: |
    "🚀 Pushed to #{context.payload.repository.name} by @#{context.actor}! 

```

I think it’s a pretty easy, very low-friction way of getting to write some of the devopsy glue-code automations in Elixir. And it was a lot of fun to write as I got to learn about Elixir and GitHub Actions 🙂.

Happy to hear any thoughts, feedback, suggestions, etc.

The actual marketplace page is here: [Elixir Script · Actions · GitHub Marketplace · GitHub](https://github.com/marketplace/actions/elixir-script)

---

<div class="post-metadata">

**Author:** ![gaggle](https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/gaggle/32/30793_2.png) [@gaggle](https://forum.elixirforum.com/u/gaggle)\
**Post date:** [November 26, 2023, 12:42am UTC](https://forum.elixirforum.com/t/release-of-elixirscript-a-github-action-to-run-elixir-code-in-workflow-steps/59855/2 "2023-11-26T00:42:52Z")

</div>

Hi everyone,

I’ve released **0.3.0** , introducing a pre-authenticated GitHub client via [Tentacat](https://github.com/edgurgel/tentacat), so it’s now really easy to write scripts that interacts with the GitHub API. Here I get a list of stargazers:

```elixir
- uses: gaggle/elixir_script@v0
  with:
  script: |
    {200, stargazers, _} = Tentacat.Users.Starring.stargazers(client, "gaggle", "elixir_script")
    IO.inspect(Enum.map_join(stargazers, ", ", & &1["login"]), label: "Stargazers")

```

And it can also cause changes, here I star a repository:

```elixir
- uses: gaggle/elixir_script@v0
  with:
  script: |
    {204, _, _} = Tentacat.Users.Starring.star(client, "gaggle", "elixir_script")
    :ok

```

You can also pass in a custom **Personal Access Token** via the GH\_TOKEN environment variable, if you need specific permissions the built-in token doesn’t provide:

```elixir
- uses: gaggle/elixir_script@v0
  with:
  script: |
    IO.puts("client now uses the passed-in custom token")
  env:
    GH_TOKEN: ${{ secrets.PAT }}

```

It was really simple to add, so my deepest thanks to [Eduardo Gurgel](https://github.com/edgurgel) for providing such an easy-to-use GitHub client!
