diff --git a/example/.README.j2 b/example/.README.j2 new file mode 100644 index 0000000..d54b5b9 --- /dev/null +++ b/example/.README.j2 @@ -0,0 +1,80 @@ +# Home Assistant Community Add-on: Example + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Sponsor Frenck via GitHub Sponsors][github-sponsors-shield]][github-sponsors] + +[![Support Frenck on Patreon][patreon-shield]][patreon] + +Example add-on by Community Home Assistant add-ons. + +## About + +This is an example add-on for Home Assistant. When started, it displays a +random quote every 5 seconds. + +It shows off several features and structures like: + +- Full blown GitHub repository. +- General Dockerfile structure and setup. +- The use of the `config.yaml` and `build.yaml` files. +- General shell scripting structure (`run.sh`). +- Quality assurance using CodeClimate. +- Continuous integration and deployment using GitLab. +- Usage of the Community Home Assistant Add-ons build environment. +- Small use of the Bash function library in our base images. +- The use of Docker label schema. + +{% if channel == "edge" %} +## WARNING! THIS IS AN EDGE VERSION! + +This Home Assistant Add-ons repository contains edge builds of add-ons. +Edge builds add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +{% if channel == "beta" %} +## WARNING! THIS IS A BETA VERSION! + +This Home Assistant Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io?u=frenck +[github-sponsors-shield]: https://frenck.dev/wp-content/uploads/2019/12/github_sponsor.png +[github-sponsors]: https://github.com/sponsors/frenck +[maintenance-shield]: https://img.shields.io/maintenance/yes/2024.svg +[patreon-shield]: https://frenck.dev/wp-content/uploads/2019/12/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} diff --git a/example/DOCS.md b/example/DOCS.md new file mode 100644 index 0000000..8d7a662 --- /dev/null +++ b/example/DOCS.md @@ -0,0 +1,139 @@ +# Home Assistant Community Add-on: Example + +This is an example add-on for Home Assistant. When started, it displays a +random quote every 5 seconds. + +It shows off several features and structures like: + +- Full blown GitHub repository. +- General Dockerfile structure and setup. +- The use of the `config.yaml` and `build.yaml` files. +- General shell scripting structure (`run.sh`). +- Quality assurance using CodeClimate. +- Continuous integration and deployment using GitLab. +- Usage of the Community Home Assistant Add-ons build environment. +- Small use of the Bash function library in our base images. +- The use of Docker label schema. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Home Assistant add-on. + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Start the "Example" add-on. +1. Check the logs of the "Example" add-on to see it in action. + +## Configuration + +Eventought this add-on is just an example add-on, it does come with some +configuration options to play around with. + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```yaml +log_level: info +seconds_between_quotes: 5 +``` + +### Option: `log_level` + +The `log_level` option controls the level of log output by the add-on and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `seconds_between_quotes` + +Sets the number of seconds between the output of each quote. The value +must be between `1` and `120` seconds. This value is set to `5` seconds by +default. + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. + +Releases are based on [Semantic Versioning][semver], and use the format +of `MAJOR.MINOR.PATCH`. In a nutshell, the version will be incremented +based on the following: + +- `MAJOR`: Incompatible or major changes. +- `MINOR`: Backwards-compatible new features and enhancements. +- `PATCH`: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Authors & contributors + +The original setup of this repository is by [Franck Nijhof][frenck]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## License + +MIT License + +Copyright (c) 2017-2024 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[addon-badge]: https://my.home-assistant.io/badges/supervisor_addon.svg +[addon]: https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_example&repository_url=https%3A%2F%2Fgithub.com%2Fhassio-addons%2Frepository +[contributors]: https://github.com/hassio-addons/addon-example/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord]: https://discord.me/hassioaddons +[forum]: https://community.home-assistant.io/t/repository-community-hass-io-add-ons/24705?u=frenck +[frenck]: https://github.com/frenck +[issue]: https://github.com/hassio-addons/addon-example/issues +[reddit]: https://reddit.com/r/homeassistant +[releases]: https://github.com/hassio-addons/addon-example/releases +[semver]: http://semver.org/spec/v2.0.0.html diff --git a/example/Dockerfile b/example/Dockerfile new file mode 100644 index 0000000..ea2b4d7 --- /dev/null +++ b/example/Dockerfile @@ -0,0 +1,40 @@ +ARG BUILD_FROM=ghcr.io/hassio-addons/base:16.3.4 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} + +# Copy root filesystem +COPY rootfs / + +# Setup base +RUN apk add --no-cache \ + coreutils=9.5-r1 \ + wget=1.24.5-r0 + +# Build arguments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION + +# Labels +LABEL \ + io.hass.name="${BUILD_NAME}" \ + io.hass.description="${BUILD_DESCRIPTION}" \ + io.hass.arch="${BUILD_ARCH}" \ + io.hass.type="addon" \ + io.hass.version=${BUILD_VERSION} \ + maintainer="Franck Nijhof " \ + org.opencontainers.image.title="${BUILD_NAME}" \ + org.opencontainers.image.description="${BUILD_DESCRIPTION}" \ + org.opencontainers.image.vendor="Home Assistant Community Add-ons" \ + org.opencontainers.image.authors="Franck Nijhof " \ + org.opencontainers.image.licenses="MIT" \ + org.opencontainers.image.url="https://addons.community" \ + org.opencontainers.image.source="https://github.com/${BUILD_REPOSITORY}" \ + org.opencontainers.image.documentation="https://github.com/${BUILD_REPOSITORY}/blob/main/README.md" \ + org.opencontainers.image.created=${BUILD_DATE} \ + org.opencontainers.image.revision=${BUILD_REF} \ + org.opencontainers.image.version=${BUILD_VERSION} diff --git a/example/build.yaml b/example/build.yaml new file mode 100644 index 0000000..b88c410 --- /dev/null +++ b/example/build.yaml @@ -0,0 +1,8 @@ +--- +build_from: + aarch64: ghcr.io/hassio-addons/base:16.3.4 + amd64: ghcr.io/hassio-addons/base:16.3.4 + armv7: ghcr.io/hassio-addons/base:16.3.4 +codenotary: + base_image: codenotary@frenck.dev + signer: codenotary@frenck.dev diff --git a/example/config.yaml b/example/config.yaml new file mode 100644 index 0000000..214a6c9 --- /dev/null +++ b/example/config.yaml @@ -0,0 +1,18 @@ +--- +name: Example +version: dev +slug: example +description: Example add-on by Community Home Assistant Add-ons +url: https://github.com/hassio-addons/addon-example +codenotary: codenotary@frenck.dev +init: false +arch: + - aarch64 + - amd64 + - armv7 +options: + log_level: info + seconds_between_quotes: 5 +schema: + log_level: list(trace|debug|info|notice|warning|error|fatal) + seconds_between_quotes: int(1,120) diff --git a/example/icon.png b/example/icon.png new file mode 100644 index 0000000..2b10fa1 Binary files /dev/null and b/example/icon.png differ diff --git a/example/logo.png b/example/logo.png new file mode 100644 index 0000000..106e5c2 Binary files /dev/null and b/example/logo.png differ diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example1/dependencies.d/init-example b/example/rootfs/etc/s6-overlay/s6-rc.d/example1/dependencies.d/init-example new file mode 100644 index 0000000..e69de29 diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example1/finish b/example/rootfs/etc/s6-overlay/s6-rc.d/example1/finish new file mode 100644 index 0000000..2853f90 --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/example1/finish @@ -0,0 +1,45 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# ============================================================================== +declare exit_code +readonly exit_code_container=$( /run/s6-linux-init-container-results/exitcode + fi + + # If the signal is SIGTERM, we should halt the container and take down + # the whole process tree. + [[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt + +# The service exited with a non-zero exit code, which means it crashed. +elif [[ "${exit_code_service}" -ne 0 ]]; then + + # The service might be a result of another service crashing. Only + # overwrite the container exit code if it is not already set. + if [[ "${exit_code_container}" -eq 0 ]]; then + echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode + fi + + # We should halt the container and take down the whole process tree. + exec /run/s6/basedir/bin/halt + +# The service exited with a zero exit code, which means it exited, let +# S6 supervision restart it. +else + bashio::log.info "Service ${service} restarting..." +fi diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example1/run b/example/rootfs/etc/s6-overlay/s6-rc.d/example1/run new file mode 100644 index 0000000..1b2ef45 --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/example1/run @@ -0,0 +1,10 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# Runs example1 script +# ============================================================================== + +bashio::log.info "Starting Example1..." + +exec /usr/bin/example1.sh diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example1/type b/example/rootfs/etc/s6-overlay/s6-rc.d/example1/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/example1/type @@ -0,0 +1 @@ +longrun diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example2/dependencies.d/example1 b/example/rootfs/etc/s6-overlay/s6-rc.d/example2/dependencies.d/example1 new file mode 100644 index 0000000..e69de29 diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example2/finish b/example/rootfs/etc/s6-overlay/s6-rc.d/example2/finish new file mode 100644 index 0000000..83560f3 --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/example2/finish @@ -0,0 +1,45 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# ============================================================================== +declare exit_code +readonly exit_code_container=$( /run/s6-linux-init-container-results/exitcode + fi + + # If the signal is SIGTERM, we should halt the container and take down + # the whole process tree. + [[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt + +# The service exited with a non-zero exit code, which means it crashed. +elif [[ "${exit_code_service}" -ne 0 ]]; then + + # The service might be a result of another service crashing. Only + # overwrite the container exit code if it is not already set. + if [[ "${exit_code_container}" -eq 0 ]]; then + echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode + fi + + # We should halt the container and take down the whole process tree. + exec /run/s6/basedir/bin/halt + +# The service exited with a zero exit code, which means it exited, let +# S6 supervision restart it. +else + bashio::log.info "Service ${service} restarting..." +fi diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example2/run b/example/rootfs/etc/s6-overlay/s6-rc.d/example2/run new file mode 100644 index 0000000..942f5af --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/example2/run @@ -0,0 +1,10 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# Runs example2 script +# ============================================================================== + +bashio::log.info "Starting Example2..." + +exec /usr/bin/example2.sh diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/example2/type b/example/rootfs/etc/s6-overlay/s6-rc.d/example2/type new file mode 100644 index 0000000..5883cff --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/example2/type @@ -0,0 +1 @@ +longrun diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/dependencies.d/base b/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/dependencies.d/base new file mode 100644 index 0000000..e69de29 diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/run b/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/run new file mode 100644 index 0000000..3fab621 --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/run @@ -0,0 +1,8 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# Example init script, runs before any other service +# ============================================================================== + +bashio::log.info "Oh, hi! I'm the init script!" diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/type b/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/type new file mode 100644 index 0000000..bdd22a1 --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/type @@ -0,0 +1 @@ +oneshot diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/up b/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/up new file mode 100644 index 0000000..d4a2c00 --- /dev/null +++ b/example/rootfs/etc/s6-overlay/s6-rc.d/init-example/up @@ -0,0 +1 @@ +/etc/s6-overlay/s6-rc.d/init-example/run diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/example1 b/example/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/example1 new file mode 100644 index 0000000..e69de29 diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/example2 b/example/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/example2 new file mode 100644 index 0000000..e69de29 diff --git a/example/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-example b/example/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-example new file mode 100644 index 0000000..e69de29 diff --git a/example/rootfs/usr/bin/example1.sh b/example/rootfs/usr/bin/example1.sh new file mode 100644 index 0000000..8059e8b --- /dev/null +++ b/example/rootfs/usr/bin/example1.sh @@ -0,0 +1,116 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# +# Example add-on for Home Assistant. +# This add-on displays a random quote every X seconds. +# ============================================================================== + +# ------------------------------------------------------------------------------ +# Get a random quote from quotationspage.com +# +# Arguments: +# None +# Returns: +# String with the quote +# ------------------------------------------------------------------------------ +get_quote_online() { + local number + local html + local quote + + bashio::log.trace "${FUNCNAME[0]}" + + number=$(( ( RANDOM % 999 ) + 1 )) + html=$(wget -q -O - "http://www.quotationspage.com/quote/${number}.html") + + quote=$(grep -e "
" -e "" <<< "${html}" \ + | awk -F'[<>]' '{ + if($2 ~ /dt/) + { print $3 } + else if($4 ~ /b/) + { print "-- " $7 " n(" $19 ")"} + }' + ) + + echo "${quote}" +} + +# ------------------------------------------------------------------------------ +# Get a random quote from a prefined set of quotes +# +# Arguments: +# None +# Returns: +# String with the quote +# ------------------------------------------------------------------------------ +get_quote_offline() { + local -i number + local -a quotes + + bashio::log.trace "${FUNCNAME[0]}" + + quotes+=("Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.\\n -Samuel Beckett") + quotes+=("Never give up, for that is just the place and time that the tide will turn.\\n -Harriet Beecher Stowe") + quotes+=("Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.\\n -Thomas A. Edison") + quotes+=("Life isn't about getting and having, it's about giving and being.\\n -Kevin Kruse") + quotes+=("Strive not to be a success, but rather to be of value.\\n -Albert Einstein") + quotes+=("You miss 100% of the shots you don't take.\\n -Wayne Gretzky") + quotes+=("People who are unable to motivate themselves must be content with mediocrity, no matter how impressive their other talents. \\n -Andrew Carnegie") + quotes+=("Design is not just what it looks like and feels like. Design is how it works.\\n -Steve Jobs") + quotes+=("Only those who dare to fail greatly can ever achieve greatly.\\n -Robert F. Kennedy") + quotes+=("All our dreams can come true, if we have the courage to pursue them.\\n -Walt Disney") + quotes+=("Success consists of going from failure to failure without loss of enthusiasm.\\n -Winston Churchill") + + number=$(( ( RANDOM % 11 ) + 1 )) + echo "${quotes[$number]}" +} + +# ------------------------------------------------------------------------------ +# Displays a random quote +# +# Arguments: +# None +# Returns: +# String with the quote +# ----------------------------------------------------------------------------- +display_quote() { + local quote + local timestamp + + bashio::log.trace "${FUNCNAME[0]}" + + if wget -q --spider http://www.quotationspage.com; then + quote=$(get_quote_online) + else + bashio::log.notice \ + 'Could not connect to quotationspage.com, using an offline quote' + quote=$(get_quote_offline) + fi + + # shellcheck disable=SC2001 + quote=$(sed 's/n()//g' <<< "${quote}" | xargs -0 echo | fmt -40) + timestamp=$(date +"%T") + + bashio::log.info "Random quote loaded @ ${timestamp}" + echo -e "${quote}" +} + +# ============================================================================== +# RUN LOGIC +# ------------------------------------------------------------------------------ +main() { + local sleep + + bashio::log.trace "${FUNCNAME[0]}" + + sleep=$(bashio::config 'seconds_between_quotes') + bashio::log.info "Seconds between each quotes is set to: ${sleep}" + + while true; do + display_quote + sleep "${sleep}" + done +} +main "$@" diff --git a/example/rootfs/usr/bin/example2.sh b/example/rootfs/usr/bin/example2.sh new file mode 100644 index 0000000..ff9101f --- /dev/null +++ b/example/rootfs/usr/bin/example2.sh @@ -0,0 +1,16 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# +# Example add-on for Home Assistant. +# ------------------------------------------------------------------------------ +main() { + bashio::log.trace "${FUNCNAME[0]}" + + while true; do + echo "Second Script Output" + sleep 10 + done +} +main "$@" diff --git a/example/translations/en.yaml b/example/translations/en.yaml new file mode 100644 index 0000000..9737cc5 --- /dev/null +++ b/example/translations/en.yaml @@ -0,0 +1,10 @@ +--- +configuration: + log_level: + name: Log level + description: The amount of logging the add-on should do. + seconds_between_quotes: + name: Seconds between quotes + description: >- + The number of seconds the add-on waits until showing a new quote in the + add-on log. diff --git a/gitea_act_runner/.README.j2 b/gitea_act_runner/.README.j2 new file mode 100644 index 0000000..d54b5b9 --- /dev/null +++ b/gitea_act_runner/.README.j2 @@ -0,0 +1,80 @@ +# Home Assistant Community Add-on: Example + +[![Release][release-shield]][release] ![Project Stage][project-stage-shield] ![Project Maintenance][maintenance-shield] + +[![Discord][discord-shield]][discord] [![Community Forum][forum-shield]][forum] + +[![Sponsor Frenck via GitHub Sponsors][github-sponsors-shield]][github-sponsors] + +[![Support Frenck on Patreon][patreon-shield]][patreon] + +Example add-on by Community Home Assistant add-ons. + +## About + +This is an example add-on for Home Assistant. When started, it displays a +random quote every 5 seconds. + +It shows off several features and structures like: + +- Full blown GitHub repository. +- General Dockerfile structure and setup. +- The use of the `config.yaml` and `build.yaml` files. +- General shell scripting structure (`run.sh`). +- Quality assurance using CodeClimate. +- Continuous integration and deployment using GitLab. +- Usage of the Community Home Assistant Add-ons build environment. +- Small use of the Bash function library in our base images. +- The use of Docker label schema. + +{% if channel == "edge" %} +## WARNING! THIS IS AN EDGE VERSION! + +This Home Assistant Add-ons repository contains edge builds of add-ons. +Edge builds add-ons are based upon the latest development version. + +- They may not work at all. +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. +- Developers. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +{% if channel == "beta" %} +## WARNING! THIS IS A BETA VERSION! + +This Home Assistant Add-ons repository contains beta releases of add-ons. + +- They might stop working at any time. +- They could have a negative impact on your system. + +This repository was created for: + +- Anybody willing to test. +- Anybody interested in trying out upcoming add-ons or add-on features. + +If you are more interested in stable releases of our add-ons: + + + +{% endif %} +[discord-shield]: https://img.shields.io/discord/478094546522079232.svg +[discord]: https://discord.me/hassioaddons +[forum-shield]: https://img.shields.io/badge/community-forum-brightgreen.svg +[forum]: https://community.home-assistant.io?u=frenck +[github-sponsors-shield]: https://frenck.dev/wp-content/uploads/2019/12/github_sponsor.png +[github-sponsors]: https://github.com/sponsors/frenck +[maintenance-shield]: https://img.shields.io/maintenance/yes/2024.svg +[patreon-shield]: https://frenck.dev/wp-content/uploads/2019/12/patreon.png +[patreon]: https://www.patreon.com/frenck +[project-stage-shield]: https://img.shields.io/badge/project%20stage-production%20ready-brightgreen.svg +[release-shield]: https://img.shields.io/badge/version-{{ version }}-blue.svg +[release]: {{ repo }}/tree/{{ version }} diff --git a/gitea_act_runner/DOCS.md b/gitea_act_runner/DOCS.md new file mode 100644 index 0000000..8d7a662 --- /dev/null +++ b/gitea_act_runner/DOCS.md @@ -0,0 +1,139 @@ +# Home Assistant Community Add-on: Example + +This is an example add-on for Home Assistant. When started, it displays a +random quote every 5 seconds. + +It shows off several features and structures like: + +- Full blown GitHub repository. +- General Dockerfile structure and setup. +- The use of the `config.yaml` and `build.yaml` files. +- General shell scripting structure (`run.sh`). +- Quality assurance using CodeClimate. +- Continuous integration and deployment using GitLab. +- Usage of the Community Home Assistant Add-ons build environment. +- Small use of the Bash function library in our base images. +- The use of Docker label schema. + +## Installation + +The installation of this add-on is pretty straightforward and not different in +comparison to installing any other Home Assistant add-on. + +1. Click the Home Assistant My button below to open the add-on on your Home + Assistant instance. + + [![Open this add-on in your Home Assistant instance.][addon-badge]][addon] + +1. Click the "Install" button to install the add-on. +1. Start the "Example" add-on. +1. Check the logs of the "Example" add-on to see it in action. + +## Configuration + +Eventought this add-on is just an example add-on, it does come with some +configuration options to play around with. + +**Note**: _Remember to restart the add-on when the configuration is changed._ + +Example add-on configuration: + +```yaml +log_level: info +seconds_between_quotes: 5 +``` + +### Option: `log_level` + +The `log_level` option controls the level of log output by the add-on and can +be changed to be more or less verbose, which might be useful when you are +dealing with an unknown issue. Possible values are: + +- `trace`: Show every detail, like all called internal functions. +- `debug`: Shows detailed debug information. +- `info`: Normal (usually) interesting events. +- `warning`: Exceptional occurrences that are not errors. +- `error`: Runtime errors that do not require immediate action. +- `fatal`: Something went terribly wrong. Add-on becomes unusable. + +Please note that each level automatically includes log messages from a +more severe level, e.g., `debug` also shows `info` messages. By default, +the `log_level` is set to `info`, which is the recommended setting unless +you are troubleshooting. + +### Option: `seconds_between_quotes` + +Sets the number of seconds between the output of each quote. The value +must be between `1` and `120` seconds. This value is set to `5` seconds by +default. + +## Changelog & Releases + +This repository keeps a change log using [GitHub's releases][releases] +functionality. + +Releases are based on [Semantic Versioning][semver], and use the format +of `MAJOR.MINOR.PATCH`. In a nutshell, the version will be incremented +based on the following: + +- `MAJOR`: Incompatible or major changes. +- `MINOR`: Backwards-compatible new features and enhancements. +- `PATCH`: Backwards-compatible bugfixes and package updates. + +## Support + +Got questions? + +You have several options to get them answered: + +- The [Home Assistant Community Add-ons Discord chat server][discord] for add-on + support and feature requests. +- The [Home Assistant Discord chat server][discord-ha] for general Home + Assistant discussions and questions. +- The Home Assistant [Community Forum][forum]. +- Join the [Reddit subreddit][reddit] in [/r/homeassistant][reddit] + +You could also [open an issue here][issue] GitHub. + +## Authors & contributors + +The original setup of this repository is by [Franck Nijhof][frenck]. + +For a full list of all authors and contributors, +check [the contributor's page][contributors]. + +## License + +MIT License + +Copyright (c) 2017-2024 Franck Nijhof + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +[addon-badge]: https://my.home-assistant.io/badges/supervisor_addon.svg +[addon]: https://my.home-assistant.io/redirect/supervisor_addon/?addon=a0d7b954_example&repository_url=https%3A%2F%2Fgithub.com%2Fhassio-addons%2Frepository +[contributors]: https://github.com/hassio-addons/addon-example/graphs/contributors +[discord-ha]: https://discord.gg/c5DvZ4e +[discord]: https://discord.me/hassioaddons +[forum]: https://community.home-assistant.io/t/repository-community-hass-io-add-ons/24705?u=frenck +[frenck]: https://github.com/frenck +[issue]: https://github.com/hassio-addons/addon-example/issues +[reddit]: https://reddit.com/r/homeassistant +[releases]: https://github.com/hassio-addons/addon-example/releases +[semver]: http://semver.org/spec/v2.0.0.html diff --git a/gitea_act_runner/Dockerfile b/gitea_act_runner/Dockerfile index 843a86e..11b88a8 100644 --- a/gitea_act_runner/Dockerfile +++ b/gitea_act_runner/Dockerfile @@ -1,11 +1,11 @@ -ARG BUILD_FROM -FROM $BUILD_FROM +ARG BUILD_FROM=ghcr.io/hassio-addons/base:16.3.4 +# hadolint ignore=DL3006 +FROM ${BUILD_FROM} ENV LANG C.UTF-8 -# Setup base system -ARG \ - BUILD_ARCH +# Copy root filesystem +COPY rootfs / # Install necessary dependencies RUN apk add --no-cache git docker-cli python3 py3-pip && \ @@ -15,11 +15,15 @@ RUN adduser -s /bin/false -D -H actrunner RUN python3 -m venv /opt/ansible-venv && \ /opt/ansible-venv/bin/pip install --no-cache-dir ansible -# Optional: Additional steps for SSH/GitHub authentication or configuration -# Copy your add-on scripts and configuration files -COPY rootfs / -RUN chmod +x /etc/services.d/actrunner/* +# Build arguments +ARG BUILD_ARCH +ARG BUILD_DATE +ARG BUILD_DESCRIPTION +ARG BUILD_NAME +ARG BUILD_REF +ARG BUILD_REPOSITORY +ARG BUILD_VERSION # Labels LABEL \ @@ -36,3 +40,4 @@ LABEL \ org.opencontainers.image.licenses="NO" \ org.opencontainers.image.url="https://mezgit.duckdns.org/mezned/HAddons" \ org.opencontainers.image.source="https://mezgit.duckdns.org/mezned/HAddons/gitea_act_runner" + diff --git a/gitea_act_runner/build.yaml b/gitea_act_runner/build.yaml new file mode 100644 index 0000000..0eed77f --- /dev/null +++ b/gitea_act_runner/build.yaml @@ -0,0 +1,8 @@ +--- +build_from: + aarch64: ghcr.io/hassio-addons/base:16.3.4 + amd64: ghcr.io/hassio-addons/base:16.3.4 + armv7: ghcr.io/hassio-addons/base:16.3.4 +codenotary: + base_image: codenotary@feres.dev + signer: codenotary@feres.dev diff --git a/gitea_act_runner/config.yaml b/gitea_act_runner/config.yaml index e7cc2da..46ac6df 100644 --- a/gitea_act_runner/config.yaml +++ b/gitea_act_runner/config.yaml @@ -1,15 +1,15 @@ +--- name: "Act Runner and Ansible Add-on" version: "1.0.0" slug: "act_runner_ansible" description: "Home Assistant add-on that runs Act runner with Gitea integration." +url: https://mezgit.duckdns.org/mezned/HAddons/gitea_act_runner +codenotary: codenotary@feres.dev +init: false arch: - aarch64 - amd64 - - armhf - armv7 - - i386 -startup: "application" -boot: "auto" options: gitea_url: "https://your-gitea-instance.com" gitea_token: "your_token" @@ -21,4 +21,4 @@ schema: gitea_token: str repository: str act_runner_options: str? - log_level: list(trace|debug|info|notice|warning|error|fatal)? \ No newline at end of file + log_level: list(trace|debug|info|notice|warning|error|fatal)? diff --git a/gitea_act_runner/icon.png b/gitea_act_runner/icon.png new file mode 100644 index 0000000..f0a2c3f Binary files /dev/null and b/gitea_act_runner/icon.png differ diff --git a/gitea_act_runner/logo.png b/gitea_act_runner/logo.png new file mode 100644 index 0000000..f0a2c3f Binary files /dev/null and b/gitea_act_runner/logo.png differ diff --git a/gitea_act_runner/rootfs/etc/s6-overlay/s6-rc.d/actrunner/finish b/gitea_act_runner/rootfs/etc/s6-overlay/s6-rc.d/actrunner/finish new file mode 100644 index 0000000..69c81c7 --- /dev/null +++ b/gitea_act_runner/rootfs/etc/s6-overlay/s6-rc.d/actrunner/finish @@ -0,0 +1,45 @@ +#!/command/with-contenv bashio +# shellcheck shell=bash +# ============================================================================== +# Home Assistant Community Add-on: Example +# ============================================================================== +declare exit_code +readonly exit_code_container=$( /run/s6-linux-init-container-results/exitcode + fi + + # If the signal is SIGTERM, we should halt the container and take down + # the whole process tree. + [[ "${exit_code_signal}" -eq 15 ]] && exec /run/s6/basedir/bin/halt + +# The service exited with a non-zero exit code, which means it crashed. +elif [[ "${exit_code_service}" -ne 0 ]]; then + + # The service might be a result of another service crashing. Only + # overwrite the container exit code if it is not already set. + if [[ "${exit_code_container}" -eq 0 ]]; then + echo "${exit_code_service}" > /run/s6-linux-init-container-results/exitcode + fi + + # We should halt the container and take down the whole process tree. + exec /run/s6/basedir/bin/halt + +# The service exited with a zero exit code, which means it exited, let +# S6 supervision restart it. +else + bashio::log.info "Service ${service} restarting..." +fi diff --git a/gitea_act_runner/rootfs/etc/services.d/actrunner/run b/gitea_act_runner/rootfs/etc/s6-overlay/s6-rc.d/actrunner/run similarity index 89% rename from gitea_act_runner/rootfs/etc/services.d/actrunner/run rename to gitea_act_runner/rootfs/etc/s6-overlay/s6-rc.d/actrunner/run index 2e97be1..1295519 100644 --- a/gitea_act_runner/rootfs/etc/services.d/actrunner/run +++ b/gitea_act_runner/rootfs/etc/s6-overlay/s6-rc.d/actrunner/run @@ -1,10 +1,10 @@ -#!/usr/bin/with-contenv bashio +#!/command/with-contenv bashio # shellcheck shell=bash # ============================================================================== -# Home Assistant Add-on: actrunner -# Runs actrunner +# Home Assistant Community Add-on: actrunner +# Runs actrunner script # ============================================================================== -readonly PROMTAIL_CONFIG='/etc/promtail/config.yaml' + declare log_level bashio::log.info 'Starting actrunner...' @@ -47,4 +47,4 @@ curl -X POST "$GITEA_URL/api/v1/repos/$REPOSITORY/actions/runners" \ -d '{ "name": "Act Runner", "labels": ["self-hosted"] }' bashio::log.info "Handing over control to actrunner..." -exec s6-setuidgid actrunner act $ACT_OPTIONS +exec /usr/local/bin/act $ACT_OPTIONS \ No newline at end of file diff --git a/gitea_act_runner/rootfs/etc/services.d/actrunner/finish b/gitea_act_runner/rootfs/etc/services.d/actrunner/finish deleted file mode 100644 index 75cbc4e..0000000 --- a/gitea_act_runner/rootfs/etc/services.d/actrunner/finish +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bashio -# ============================================================================== -# Take down the S6 supervision tree when actrunner fails -# s6-overlay docs: https://github.com/just-containers/s6-overlay -# ============================================================================== - -declare APP_EXIT_CODE=${1} - -if [[ "${APP_EXIT_CODE}" -ne 0 ]] && [[ "${APP_EXIT_CODE}" -ne 256 ]]; then - bashio::log.warning "Halt add-on with exit code ${APP_EXIT_CODE}" - echo "${APP_EXIT_CODE}" > /run/s6-linux-init-container-results/exitcode - exec /run/s6/basedir/bin/halt -fi - -bashio::log.info "Service restart after closing"