diff --git a/.gitignore b/.gitignore index f8a3aa0..f6473b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ .idea *.iml - -config.json .vscode .DS_Store + +config.json +config.working.json + +jobs/ +projects/ diff --git a/docker-entrypoint b/docker-entrypoint index 272f182..dd8ada5 100755 --- a/docker-entrypoint +++ b/docker-entrypoint @@ -16,7 +16,7 @@ fi mkdir -p "${HOME_DIR}"/jobs "${HOME_DIR}"/projects if [ -z "${DOCKER_HOST}" ] && [ -a "${DOCKER_PORT_2375_TCP}" ]; then - export DOCKER_HOST='tcp://docker:2375' + export DOCKER_HOST="tcp://docker:2375" fi if [ "${LOG_FILE}" == "" ]; then @@ -37,7 +37,7 @@ normalize_config() { elif [ -f "${HOME_DIR}/config.yaml" ]; then JSON_CONFIG="$(rq -y <<< "$(cat "${HOME_DIR}"/config.yaml)")" fi - jq -r 'map(.)' <<< "${JSON_CONFIG}" > "${HOME_DIR}"/config.working.json + jq -r 'to_entries | map_values(.value + { name: .key })' <<< "${JSON_CONFIG}" > "${HOME_DIR}"/config.working.json } ensure_docker_socket_accessible() { @@ -67,19 +67,19 @@ slugify() { make_image_cmd() { DOCKERARGS=$(echo "${1}" | jq -r .dockerargs) - VOLUMES=$(echo "${1}" | jq -r '.volumes | map(" -v " + .) | join("")') - PORTS=$(echo "${1}" | jq -r '.ports | map(" -p " + .) | join("")') - EXPOSE=$(echo "${1}" | jq -r '.expose | map(" --expose " + .) | join("")') + if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi + VOLUMES=$(echo "${1}" | jq -r 'select(.volumes != null) | .volumes | map(" -v " + .) | join("")') + PORTS=$(echo "${1}" | jq -r 'select(.ports != null) | .ports | map(" -p " + .) | join("")') + EXPOSE=$(echo "${1}" | jq -r 'select(.expose != null) | .expose | map(" --expose " + .) | join("")') NAME=$(echo "${1}" | jq -r 'select(.name != null) | .name') NETWORK=$(echo "${1}" | jq -r 'select(.network != null) | .network') - ENVIRONMENT=$(echo "${1}" | jq -r '.environment | map(" -e " + .) | join("")') - if [ "${DOCKERARGS}" == "null" ]; then DOCKERARGS=; fi - if [ -n "${NAME}" ]; then DOCKERARGS="${DOCKERARGS} --rm --name ${NAME} "; fi - if [ -n "${NETWORK}" ]; then DOCKERARGS="${DOCKERARGS} --network ${NETWORK} "; fi - if [ -n "${VOLUMES}" ]; then DOCKERARGS="${DOCKERARGS}${VOLUMES}"; fi - if [ -n "${ENVIRONMENT}" ]; then DOCKERARGS="${DOCKERARGS}${ENVIRONMENT}"; fi - if [ -n "${PORTS}" ]; then DOCKERARGS="${DOCKERARGS}${PORTS}"; fi - if [ -n "${EXPOSE}" ]; then DOCKERARGS="${DOCKERARGS}${EXPOSE}"; fi + ENVIRONMENT=$(echo "${1}" | jq -r 'select(.environment != null) | .environment | map(" -e " + .) | join("")') + if [ -n "${NAME}" ]; then DOCKERARGS+=" --rm --name ${NAME} "; fi + if [ -n "${NETWORK}" ]; then DOCKERARGS+=" --network ${NETWORK} "; fi + if [ -n "${VOLUMES}" ]; then DOCKERARGS+="${VOLUMES}"; fi + if [ -n "${ENVIRONMENT}" ]; then DOCKERARGS+="${ENVIRONMENT}"; fi + if [ -n "${PORTS}" ]; then DOCKERARGS+="${PORTS}"; fi + if [ -n "${EXPOSE}" ]; then DOCKERARGS+="${EXPOSE}"; fi IMAGE=$(echo "${1}" | jq -r .image | envsubst) TMP_COMMAND=$(echo "${1}" | jq -r .command) echo "docker run ${DOCKERARGS} ${IMAGE} ${TMP_COMMAND}" @@ -104,8 +104,8 @@ cat << EOF > "${HOME_DIR}"/projects/"${SCRIPT_NAME}".sh set -e CONTAINERS=\$(docker ps --format '{{.Names}}' | grep -E "^${PROJECT}_${CONTAINER}.[0-9]+") -for CONTAINER_NAME in \$CONTAINERS; do - docker exec ${DOCKERARGS} \${CONTAINER_NAME} ${TMP_COMMAND} +for CONTAINER_NAME in \${CONTAINERS}; do + docker exec "${DOCKERARGS} \${CONTAINER_NAME} ${TMP_COMMAND}" done EOF echo "/bin/bash ${HOME_DIR}/projects/${SCRIPT_NAME}.sh" @@ -186,23 +186,26 @@ function build_crontab() { ONSTART=() while read -r i ; do - SCHEDULE=$(jq -r .["$i"].schedule "${CONFIG}" | sed 's/\*/\\*/g') if [ "${SCHEDULE}" == "null" ]; then - echo "Schedule Missing: $(jq -r .["$i"].schedule "${CONFIG}")" + echo "'schedule' missing: $(jq -r .["$i"].schedule "${CONFIG}")" continue fi SCHEDULE=$(parse_schedule "${SCHEDULE}" | sed 's/\\//g') COMMAND=$(jq -r .["$i"].command "${CONFIG}") if [ "${COMMAND}" == "null" ]; then - echo "Command Missing: '${COMMAND}'" + echo "'command' missing: '${COMMAND}'" continue fi COMMENT=$(jq -r .["$i"].comment "${CONFIG}") if [ "${COMMENT}" != "null" ]; then - echo "# ${COMMENT}" >> ${CRONTAB_FILE} + COMMENT=" ${COMMENT}" + echo "#${COMMENT}" >> ${CRONTAB_FILE} + else + # Reset COMMENT to empty rather than keep the 'null' value. + COMMENT=" " fi SCRIPT_NAME=$(jq -r .["$i"].name "${CONFIG}") @@ -216,8 +219,7 @@ cat << EOF > "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh #!/usr/bin/env bash set -e -echo "Start Cronjob **${SCRIPT_NAME}** ${COMMENT}" - +echo "start cron job **${SCRIPT_NAME}**${COMMENT}" $(make_cmd "$(jq -c .["$i"] "${CONFIG}")") EOF TRIGGER=$(jq -r .["$i"].trigger "${CONFIG}") @@ -225,14 +227,14 @@ EOF while read -r j ; do TRIGGER_COMMAND=$(jq .["$i"].trigger["$j"].command "${CONFIG}") if [ "${TRIGGER_COMMAND}" == "null" ]; then - echo "Command Missing: '${TRIGGER_COMMAND}'" + echo "'command' missing: '${TRIGGER_COMMAND}'" continue fi make_cmd "${TRIGGER_COMMAND}" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh done < <(jq -r '.['"$i"'].trigger|keys[]' "${CONFIG}") fi - echo "echo \"End Cronjob **${SCRIPT_NAME}** ${COMMENT}\"" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh + echo "echo \"end cron job **${SCRIPT_NAME}**${COMMENT}\"" >> "${HOME_DIR}"/jobs/"${SCRIPT_NAME}".sh echo "${SCHEDULE} ${COMMAND}" >> ${CRONTAB_FILE} @@ -255,7 +257,7 @@ start_app() { normalize_config export CONFIG=${HOME_DIR}/config.working.json if [ ! -f "${CONFIG}" ]; then - echo "Unable to find ${CONFIG}." + echo "generated ${CONFIG} missing." exit 1 fi if [ "${1}" == "crond" ]; then