Current section
Files
Jump to
Current section
Files
lib/skylab/ship_it.ex
defmodule Skylab.ShipIt do
@moduledoc """
创建一个 Ship it 的 MR
"""
use HTTPoison.Base
@endpoint "https://git.helijia.cn/api/v4"
def run(opts) do
Application.ensure_all_started(:timex)
Application.ensure_all_started(:httpoison)
with {:owner, {:ok, owner}} <- {:owner, owner(opts)},
{:ship, :ok} <- {:ship, create_mr(owner, opts)} do
:ok
end
end
defp owner(opts) do
find_gitlab_user(opts[:app_owner_email])
end
defp find_gitlab_user(nil) do
{:error, :app_owner_not_set}
end
defp find_gitlab_user(email) do
[user | _] =
"/users?search=#{email}"
|> get!()
|> Map.get(:body)
|> Jason.decode!()
{:ok, user}
end
defp create_mr(app_owner, opts) do
{:ok, user} = find_gitlab_user(opts[:user_email])
body =
%{
title: "🚀 Ship it! - #{time()}",
description: """
这个 MR 由 小河狸机器人(@robot) 代表 @#{user["username"]} 创建。
合并后会发布到正式环境。
🎉🎉🎉
""",
assignee_id: app_owner["id"],
source_branch: "release",
target_branch: "master",
label: "release,deploy"
}
|> Jason.encode!()
"/projects/#{opts[:project_id]}/merge_requests"
|> post(body)
|> do_handle_response()
end
defp time do
Timex.now()
|> Timex.to_datetime("Asia/Shanghai")
|> Timex.format!("{YYYY}{M}{D}{h24}{m}{s}")
end
defp do_handle_response({:ok, %HTTPoison.Response{status_code: 201, body: _}}), do: :ok
defp do_handle_response({:ok, %HTTPoison.Response{status_code: 409, body: _}}), do: :ok
defp do_handle_response(result) do
{:error, result}
end
def process_url(url) do
@endpoint <> url
end
def process_request_headers(headers) do
[
{"PRIVATE-TOKEN", Skylab.Config.gitlab_api_token()},
{"Content-Type", "application/json"}
] ++ headers
end
end