diff --git a/.drone.yml b/.drone.yml index 0ac6ec2..8d1f2b6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -31,6 +31,8 @@ steps: when: ref: - refs/heads/main + depends_on: + - get-tags - name: make-tags-release image: node @@ -39,9 +41,11 @@ steps: when: ref: - refs/tags/** + depends_on: + - get-tags # Build containers from main branch -- name: build +- name: build-gitea image: thegeeklab/drone-docker-buildx privileged: true settings: @@ -55,17 +59,53 @@ steps: platforms: - linux/arm64 - linux/amd64 + depends_on: + - make-tags + - make-tags-release -- name: release +- name: build-github + image: thegeeklab/drone-docker-buildx + privileged: true + settings: + provenance: false + registry: ghcr.io + username: + from_secret: docker_username + password: + from_secret: github_token + repo: ghcr.io/mrmeeb/cronicle + platforms: + - linux/arm64 + - linux/amd64 + depends_on: + - make-tags + - make-tags-release + +- name: release-gitea image: goreleaser/goreleaser environment: GITEA_TOKEN: from_secret: gitea_token commands: - - goreleaser release + - goreleaser release -f .goreleaser-gitea.yaml when: ref: - refs/tags/** + depends_on: + - build-gitea + +- name: release-github + image: goreleaser/goreleaser + environment: + GITHUB_TOKEN: + from_secret: github_token + commands: + - goreleaser release -f .goreleaser-github.yaml + when: + ref: + - refs/tags/** + depends_on: + - build-github - name: notify image: plugins/slack @@ -76,6 +116,9 @@ steps: settings: webhook: from_secret: slack_webhook + depends_on: + - release-gitea + - release-github --- kind: pipeline @@ -100,7 +143,7 @@ steps: - echo -n "develop-${DRONE_COMMIT_SHA:0:8}, develop" > .tags # Build containers from develop branch -- name: build +- name: build-gitea image: thegeeklab/drone-docker-buildx privileged: true settings: @@ -114,6 +157,25 @@ steps: platforms: - linux/arm64 - linux/amd64 + depends_on: + - make-tags + +- name: build-github + image: thegeeklab/drone-docker-buildx + privileged: true + settings: + provenance: false + registry: ghcr.io + username: + from_secret: docker_username + password: + from_secret: github_token + repo: ghcr.io/mrmeeb/cronicle + platforms: + - linux/arm64 + - linux/amd64 + depends_on: + - make-tags - name: notify image: plugins/slack @@ -123,4 +185,7 @@ steps: - failure settings: webhook: - from_secret: slack_webhook \ No newline at end of file + from_secret: slack_webhook + depends_on: + - build-gitea + - build-github \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1479fe9..0b8961c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -dist/ +dist-gitea/ +dist-github/ .tags \ No newline at end of file diff --git a/.goreleaser.yaml b/.goreleaser-gitea.yaml similarity index 95% rename from .goreleaser.yaml rename to .goreleaser-gitea.yaml index 4adcd4c..269d860 100644 --- a/.goreleaser.yaml +++ b/.goreleaser-gitea.yaml @@ -1,3 +1,5 @@ +dist: dist-gitea + build: skip: true diff --git a/.goreleaser-github.yaml b/.goreleaser-github.yaml new file mode 100644 index 0000000..da02521 --- /dev/null +++ b/.goreleaser-github.yaml @@ -0,0 +1,20 @@ +dist: dist-github + +build: + skip: true + +archives: +- format: binary + +release: + draft: true + github: + owner: MrMeeb + name: cronicle-docker + +changelog: + sort: asc + filters: + exclude: + - '^docs:' + - '^test:' \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ada529c..b040120 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,14 +15,15 @@ ARG CRONICLE_EDGE_VERSION=1.6.2 ENV CRONICLE_foreground=1 ENV CRONICLE_echo=1 ENV CRONICLE_color=1 -ENV EDITOR=vi +ENV EDITOR=nano ENV MODE=manager ENV PUID=1000 ENV PGID=1000 ENV TZ=UTC +ENV LOG_LEVEL=9 #Get required packages -RUN apk update && apk add tzdata curl shadow bash xz git procps nodejs npm +RUN apk update && apk add tzdata curl shadow bash xz git procps nodejs npm nano #Make folders RUN mkdir /config && \ diff --git a/README.md b/README.md index 964360f..11a51d8 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,41 @@ # Cronicle Docker -![Drone (self-hosted) with branch](https://img.shields.io/drone/build/MrMeeb/cronicle-docker/main?label=main&server=https%3A%2F%2Fdrone.mrmeeb.stream&style=for-the-badge) ![Drone (self-hosted) with branch](https://img.shields.io/drone/build/MrMeeb/cronicle-docker/develop?label=develop&server=https%3A%2F%2Fdrone.mrmeeb.stream&style=for-the-badge) +![Drone (self-hosted) with branch](https://img.shields.io/drone/build/MrMeeb/cronicle-docker/main?label=latest&server=https%3A%2F%2Fdrone.mrmeeb.stream&style=for-the-badge) ![Drone (self-hosted) with branch](https://img.shields.io/drone/build/MrMeeb/cronicle-docker/develop?label=develop&server=https%3A%2F%2Fdrone.mrmeeb.stream&style=for-the-badge) -Dockerised Cronicle, based on the [Cronicle-Edge](https://github.com/cronicle-edge/cronicle-edge) fork. +Dockerised Cronicle, based on the [Cronicle-Edge](https://github.com/cronicle-edge/cronicle-edge) fork of [Cronicle](https://github.com/jhuckaby/Cronicle). This container was built to include features I value in containers, namely logging to `stdout` and configurable `PUID` and `PGID`. -Can function in both the **manager** and **worker** role. +This container can function in both the **manager** and **worker** role. + +## Links +- :tea: [Gitea Repo (source)](https://git.mrmeeb.stream/MrMeeb/cronicle-docker) +- :whale2: [Containers](https://git.mrmeeb.stream/MrMeeb/-/packages/container/cronicle/latest) (also published the GHCR) +- :mirror: [GitHub mirror](https://github.com/MrMeeb/cronicle-docker) +- :package: [Cronicle Repo](https://github.com/jhuckaby/Cronicle) +- :package: [Cronicle-Edge Repo](https://github.com/cronicle-edge/cronicle-edge) + +*This repo is mirrored to GitHub* + +## Overview + +[**Cronicle**](https://github.com/jhuckaby/Cronicle) is a multi-server task scheduler and runner, with a web based front-end UI. It handles both scheduled, repeating and on-demand jobs, targeting any number of worker servers, with real-time stats and live log viewer. It's basically a fancy [Cron](https://en.wikipedia.org/wiki/Cron) replacement written in [Node.js](https://nodejs.org/). You can give it simple shell commands, or write Plugins in virtually any language. + +![Main Screenshot](https://pixlcore.com/software/cronicle/screenshots-new/job-details-complete.png) + +## Features at a Glance + +* Single or multi-server setup. +* Automated failover to backup servers. +* Auto-discovery of nearby servers. +* Real-time job status with live log viewer. +* Plugins can be written in any language. +* Schedule events in multiple timezones. +* Optionally queue up long-running events. +* Track CPU and memory usage for each job. +* Historical stats with performance graphs. +* Simple JSON messaging system for Plugins. +* Web hooks for external notification systems. +* Simple REST API for scheduling and running events. +* API Keys for authenticating remote apps. ## Tags @@ -19,9 +50,9 @@ Tags relating to releases are also available, for locking in on a specific versi `config.json`, located in `/config/cronicle/conf/config.json`, is automatically generated on the first run of Cronicle in 'manager' mode. This file must be kept identical between the manager and any workers it controls. -If you want to configure Cronicle before first run (e.g to use a different storage engine), download `config_sample.json` and adjust accordingly before placing in `/config/cronicle/conf/config.json`. +If you want to configure Cronicle before first run (e.g to use a different storage engine), download `config_sample.json` and adjust accordingly before placing in `/config/cronicle/conf/config.json`. Make sure to change the `secret`! -:exclamation: NOTE: You must define the hostname of the container. Cronicle expects the hostname to remain the same, so the randomly-generated container hostname can cause problems if it changes. :exclamation: +:exclamation: You must define the hostname of the container. Cronicle expects the hostname to remain the same, so the randomly-generated container hostname can cause problems if it changes. :exclamation: ### Docker CLI ``` @@ -80,3 +111,4 @@ This container automatically checks for scripts in `/config/init` and runs them |PUID |int |1000 |Sets the UID of the user Cronicle runs under |PGID |int |1000 |Sets the GID of the user Cronicle runs under |TZ |[List of valid TZs](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List) |UTC |Sets the timezone of the container and by extension Cronicle +|LOG_LEVEL|1-10 |9 |Sets log level from `1` (quietest) to `10` (loudest)| diff --git a/root/container-init.sh b/root/container-init.sh index 394615d..ce9909a 100644 --- a/root/container-init.sh +++ b/root/container-init.sh @@ -21,6 +21,7 @@ PUID=${PUID} PGID=${PGID} TZ=${TZ} MODE=${MODE} +LOG_LEVEL=${LOG_LEVEL} ---------------------------------------------------------------------- " diff --git a/root/cronicle-prepare.sh b/root/cronicle-prepare.sh index 95c9d1c..699fae4 100644 --- a/root/cronicle-prepare.sh +++ b/root/cronicle-prepare.sh @@ -103,4 +103,22 @@ else echo "'$MODE' is not a recognised appion for the MODE environment variable. Accepted appions are 'manager' and 'worker'." +fi + +#Expose log directory +if [ ! -d /config/cronicle/logs ] +then + + echo "Logs dir is missing, creating." + + cp -r /app/cronicle/logs /config/cronicle/logs + rm -rf /app/cronicle/logs + ln -s /config/cronicle/logs /app/cronicle/logs +else + + echo "Logs dir already exists. Doesn't need creating." + echo "Linking persistent logs dir back into Cronicle." + rm -rf /app/cronicle/logs + ln -s /config/cronicle/logs /app/cronicle/logs + fi \ No newline at end of file diff --git a/root/etc/s6-overlay/s6-rc.d/cronicle/run b/root/etc/s6-overlay/s6-rc.d/cronicle/run index ffe517e..d3b843c 100644 --- a/root/etc/s6-overlay/s6-rc.d/cronicle/run +++ b/root/etc/s6-overlay/s6-rc.d/cronicle/run @@ -1,3 +1,3 @@ #!/command/with-contenv bash # shellcheck shell=bash -exec s6-setuidgid cronicle node /app/cronicle/lib/main.js --color 1 \ No newline at end of file +exec s6-setuidgid cronicle node /app/cronicle/lib/main.js --debug_level ${LOG_LEVEL} --color ${CRONICLE_color} \ No newline at end of file