diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2957ec6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +FROM debian:jessie + +RUN apt-get update &&\ + apt-get install jq + +ADD build.sh /root/build.sh +RUN chmod +x /root/build.sh + +VOLUME /project +VOLUME /dist + +CMD /root/build.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..6fec079 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Simple Deb package builder + + +``` +docker run --rm -v=":/packages" . +``` diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..83e9f0f --- /dev/null +++ b/build.sh @@ -0,0 +1,127 @@ +#!/usr/bin/env bash + +DIST_DIR="${BASE_DIR}/dist" +PROJECT_DIR="${BASE_DIR}/project" + +function info { + echo "[INFO] ${1}" +} + +function debug { + echo "[DEBUG] ${1}" +} + +function error { + echo "[ERROR] ${1}" +} + +function get_project_opt { + filter=${1} + manifest_path=${PROJECT_DIR}/bricklayer.json + cat ${manifest_path} | jq -r ${filter} +} + +function get_build_dir { + project_name="${1}" + temp_dir=$(mktemp -d) + build_dir="${temp_dir}/${project_name}" + mkdir -p "${build_dir}" + echo ${build_dir} +} + +function exec_hook { + + hook_name=${1} + build_dir=${2} + + hook_script="${PROJECT_DIR}/$(get_project_opt .hooks.${hook_name})" + + # Test hook script existence + if [ ! -f "${hook_script}" ]; then + info "No ${hook_name} hook." + exit + fi + + info "Executing ${hook_name} hook..." + + # Ensure the hook script is executable + chmod +x "${hook_script}" + + # Execute hook in a subshell + ( BUILD_DIR="${build_dir}" PROJECT_DIR="${PROJECT_DIR}" exec "${hook_script}" ) + + # If the script did not execute properly, we stop here + if [ $? != 0 ]; then + error "The '${hook_name}' hook script did not finished properly !" + exit 1 + fi + +} + +function create_control_file { + + build_dir="${1}" + mkdir -p "${build_dir}/DEBIAN" + + control_file="${build_dir}/DEBIAN/control" + touch "${control_file}" + + echo "Package: $(get_project_opt .name)" > "${control_file}" + echo "Version: $(get_project_opt .version)" >> "${control_file}" + echo "Section: $(get_project_opt .section)" >> "${control_file}" + echo "Priority: $(get_project_opt .priority)" >> "${control_file}" + echo "Architecture: $(get_project_opt .arch)" >> "${control_file}" + + echo "Depends: " >> "${control_file}" + echo "Maintainer: $(get_project_opt .maintainer)" >> "${control_file}" + echo "Description: $(get_project_opt .description)" >> "${control_file}" + +} + +function build_project { + + project_name="$(get_project_opt '.name')" + + info "Building project '${project_name}'..." + + build_dir="$(get_build_dir "${project_name}")" + + debug "Build dir: ${build_dir}" + + create_control_file "${build_dir}" + + exec_hook "preBuild" "${build_dir}" + + cd "${build_dir}/.." + dpkg-deb --build "${project_name}" + + if [ $? != 0 ]; then + error "The build process has not completed successfuly !" + exit 1 + fi + + cd - + + exec_hook "postBuild" "${build_dir}" + + mkdir -p "${DIST_DIR}" + cp "${build_dir}/../${project_name}.deb" "${DIST_DIR}/${project_name}.deb" + + info "Done" + +} + +function main { + + manifest_path=${PROJECT_DIR}/bricklayer.json + + if [ ! -f "${manifest_path}" ]; then + error "There is no 'bricklayer.json' file found in the project directory !" + exit 1 + fi + + build_project + +} + +main