Current section

Files

Jump to
lambda_base lib mix tasks lambda_release.ex
Raw

lib/mix/tasks/lambda_release.ex

defmodule Mix.Tasks.LambdaRelease do
@moduledoc """
Create zip file for AWS Lamdba with custom runtime.
Use this command under Docker image `amazonlinux:2017.03.1.20170812`
`erintheblack/elixir-lambda-builder:20200112.01` is prepared to build.
### How to build
```
$ docker run -d -it --name elx erintheblack/elixir-lambda-builder:20200112.01
$ docker cp ${project} elx:/tmp
$ docker exec elx /bin/bash -c "cd /tmp/${project}; mix deps.get; mix lambda_release"
$ docker cp elx:/tmp/${app_name}.zip .
```
"""
use Mix.Task
@bootstrap """
#!/bin/sh
set -euo pipefail
export HOME=/
RESPONSE=$(bin/app eval "$(echo "$_HANDLER").start()")
"""
@doc """
Create zip file for AWS Lamdba with custom runtime.
"""
@impl Mix.Task
def run(_args) do
app_name = Mix.Project.config |> Keyword.get(:app) |> to_string
Mix.env(:prod)
Mix.Task.run("release")
File.write("./_build/prod/rel/#{app_name}/bootstrap", @bootstrap)
Mix.Shell.cmd("mv ./_build/prod/rel/#{app_name}/bin/#{app_name} ./_build/prod/rel/#{app_name}/bin/app", &IO.puts/1)
Mix.Shell.cmd("rm -f ./_build/prod/rel/#{app_name}/bin/#{app_name}.bat", &IO.puts/1)
Mix.Shell.cmd("chmod +x ./_build/prod/rel/#{app_name}/bin/app", &IO.puts/1)
Mix.Shell.cmd("chmod +x ./_build/prod/rel/#{app_name}/releases/0.1.0/elixir", &IO.puts/1)
Mix.Shell.cmd("chmod +x ./_build/prod/rel/#{app_name}/erts-10.6/bin/erl", &IO.puts/1)
Mix.Shell.cmd("chmod +x ./_build/prod/rel/#{app_name}/bootstrap", &IO.puts/1)
Mix.Shell.cmd("cd ./_build/prod/rel/#{app_name}; zip #{app_name} -r -q *", &IO.puts/1)
Mix.Shell.cmd("mv -f ./_build/prod/rel/#{app_name}/#{app_name}.zip ../", &IO.puts/1)
Mix.Shell.cmd("mv ./_build/prod/rel/#{app_name}/bin/app ./_build/prod/rel/#{app_name}/bin/#{app_name}", &IO.puts/1)
end
end