Packages

Base library to create Elixir IBM Functions

Current section

Files

Jump to
ibm_functions_base lib mix tasks ibm_functions release.ex
Raw

lib/mix/tasks/ibm_functions/release.ex

defmodule Mix.Tasks.IbmFunctions.Release do
@moduledoc """
Create zip file for IBM Functions with custom runtime.
Run this task inside Docker image `elixir:1.10.4-slim`.
## How to build
```
$ docker run -d -it --rm --name elx erintheblack/elixir-ibm-functions-builder:1.10.4
$ docker cp mix.exs elx:/tmp
$ docker cp lib elx:/tmp
$ docker exec elx /bin/bash -c "mix deps.get; MIX_ENV=prod mix ibm_functions.release"
$ docker cp elx:/tmp/${app_name}-${version}.zip .
$ docker stop elx
```
"""
use Mix.Task
@doc """
Create zip file for IBM functions with custom runtime.
"""
@impl Mix.Task
def run([handler_module]) do
app_name = app_name()
version = version()
bootstrap = bootstrap(app_name, handler_module)
env = Mix.env
Mix.Shell.cmd("rm -f -R ./_build/#{env}/*", &IO.puts/1)
Mix.Shell.cmd("MIX_ENV=#{env} mix release --quiet", &IO.puts/1)
File.write("./_build/#{env}/rel/#{app_name}/exec", bootstrap)
Mix.Shell.cmd("chmod +x ./_build/#{env}/rel/#{app_name}/exec", &IO.puts/1)
Mix.Shell.cmd("cd ./_build/#{env}/rel/#{app_name}; zip #{app_name}-#{version}.zip -r -q *", &IO.puts/1)
Mix.Shell.cmd("mv -f ./_build/#{env}/rel/#{app_name}/#{app_name}-#{version}.zip ./", &IO.puts/1)
end
defp app_name do
Mix.Project.config |> Keyword.get(:app) |> to_string
end
defp version do
Mix.Project.config |> Keyword.get(:version)
end
defp bootstrap(app_name, handler_module) do
"""
#!/bin/sh
set -e
export ___EVENT=$1
chmod 755 bin/#{app_name}
chmod 755 releases/*/elixir
chmod 755 erts-*/bin/*
exec "bin/#{app_name}" "eval" "#{handler_module}.start"
"""
end
end