Browse Source

new: [hugo] add ``hugo`` charm

Signed-off-by: Valentin Lab <valentin.lab@kalysto.org>
pull/29/head
Valentin Lab 1 year ago
parent
commit
c4b66c5669
  1. 53
      hugo/actions/generate
  2. 21
      hugo/hooks/init
  3. 12
      hugo/hooks/pre_deploy
  4. 12
      hugo/hooks/publish_dir-relation-joined
  5. 65
      hugo/lib/common
  6. 40
      hugo/metadata.yml

53
hugo/actions/generate

@ -0,0 +1,53 @@
#!/bin/bash
## compose: no-hooks
if [ -z "$SERVICE_DATASTORE" ]; then
echo "This script is meant to be run through 'compose' to work properly." >&2
exit 1
fi
. "$CHARM_PATH/lib/common"
version=0.1
usage="$exname [-h|--help]"
help="
USAGE:
$usage
DESCRIPTION:
Generate website from current content.
EXAMPLES:
$exname
"
dbname=
output=
while [ "$1" ]; do
case "$1" in
"--help"|"-h")
print_help >&2
exit 0
;;
--*|-*)
err "Unexpected optional argument '$1'"
print_usage >&2
exit 1
;;
*)
err "Unexpected positional argument '$1'"
print_usage >&2
exit 1
;;
esac
shift
done
hugo:generate "$HOST_HUGO_SOURCE" "$HOST_HUGO_OUTPUT"

21
hugo/hooks/init

@ -0,0 +1,21 @@
#!/bin/bash
## Init is run on host
## For now it is run every time the script is launched, but
## it should be launched only once after build.
## Accessible variables are:
## - SERVICE_NAME Name of current service
## - DOCKER_BASE_IMAGE Base image from which this service might be built if any
## - SERVICE_DATASTORE Location on host of the DATASTORE of this service
## - SERVICE_CONFIGSTORE Location on host of the CONFIGSTORE of this service
. lib/common
set -e
if ! [ -d "$HOST_HUGO_SOURCE" ]; then
hugo:init-dir || exit 1
fi

12
hugo/hooks/pre_deploy

@ -0,0 +1,12 @@
#!/bin/bash
## Should be executable N time in a row with same result.
set -e
. lib/common
if ! [ -d "$HOST_HUGO_OUTPUT" ]; then
hugo:generate "$HOST_HUGO_SOURCE" "$HOST_HUGO_OUTPUT" || exit 1
fi

12
hugo/hooks/publish_dir-relation-joined

@ -0,0 +1,12 @@
#!/bin/bash
. lib/common
set -e
url=$(relation-get url) || exit 1
mkdir -p "${HOST_HUGO_CONFIG}"
cat <<EOF > "${HOST_HUGO_CONFIG}"/01-baseurl.yaml
baseURL: $url
EOF

65
hugo/lib/common

@ -0,0 +1,65 @@
# -*- mode: shell-script -*-
HUGO_CONFIG="/etc/hugo"
HUGO_BASE="/opt/apps/hugo"
HUGO_SOURCE="$HUGO_BASE/src"
HUGO_OUTPUT="$HUGO_BASE/output"
HUGO_THEME="$HUGO_BASE/theme"
HOST_HUGO_SOURCE="$SERVICE_DATASTORE$HUGO_BASE/src"
HOST_HUGO_OUTPUT="$SERVICE_DATASTORE$HUGO_BASE/output"
HOST_HUGO_THEME="$SERVICE_DATASTORE$HUGO_BASE/theme"
HOST_HUGO_CONFIG="$SERVICE_CONFIGSTORE$HUGO_CONFIG"
HUGO_BUILDER_DEFAULT_IMAGE="docker.0k.io/hugo:0.88.1"
hugo:init-dir() {
mkdir -p "$HOST_HUGO_SOURCE" || return 1
cd "$HOST_HUGO_SOURCE" &&
git config --global user.email "compose@mail.com" &&
git config --global user.name "compose" &&
docker run --rm -v "$HOST_HUGO_SOURCE":"$HUGO_SOURCE" \
-w "$HUGO_SOURCE" "$HUGO_BUILDER_DEFAULT_IMAGE" \
new site -f yaml . &&
docker run --rm -v "$HOST_HUGO_SOURCE":"$HUGO_SOURCE" \
-w "$HUGO_SOURCE" "$HUGO_BUILDER_DEFAULT_IMAGE" \
new posts/my-first-post.md &&
sed -ri '/^baseURL:/d' config.yaml &&
git init &&
git add -A . &&
git commit -m "First import"
}
hugo:generate() {
local src="$1" dst="$2" configs c
theme_url=$(options-get theme-url 2>/dev/null) || true
theme_url=${theme_url:-https://github.com/theNewDynamic/gohugo-theme-ananke.git}
if ! [ -d "$HOST_HUGO_THEME/default" ]; then
mkdir -p "$HOST_HUGO_THEME"
git clone "${theme_url}" "$HOST_HUGO_THEME/default" || {
err "Could not clone theme '$HOST_HUGO_THEME'."
return 1
}
fi
echo "theme: default" > "$HOST_HUGO_CONFIG/80-theme.yaml"
config_files=("$HOST_HUGO_CONFIG/"*.yaml)
configs=""
for c in "${config_files[@]}"; do
configs+="config${c#$SERVICE_CONFIGSTORE$HUGO_CONFIG},"
done
mkdir -p "$dst" || return 1
docker run --rm -v "$src":"$HUGO_SOURCE" \
-v "$dst":"$HUGO_OUTPUT" \
-v "$HOST_HUGO_CONFIG":"$HUGO_CONFIG" \
-v "$HOST_HUGO_THEME":"$HUGO_SOURCE/themes" \
-v "$HOST_HUGO_CONFIG":"$HUGO_SOURCE/config" \
-w "$HUGO_SOURCE" "$HUGO_BUILDER_DEFAULT_IMAGE" \
-D --config "${configs}config.yaml" \
-d "${dst#$SERVICE_DATASTORE}" &&
find "$HOST_HUGO_SOURCE" -depth -type d -empty -delete
}

40
hugo/metadata.yml

@ -0,0 +1,40 @@
description: Hugo
subordinate: true
requires:
web-publishing-directory:
interface: publish-dir
scope: container
data-resources:
- /opt/apps/hugo/output
default-options:
# config:
# language-code: "en-us"
# title: "My Hugo Site"
# theme: "ananke"
uses:
publish-dir:
#constraint: required | recommended | optional
#auto: pair | summon | none ## default: pair
scope: container
constraint: required
auto: summon
solves:
container: "main running server"
default-options:
location: !var-expand "$DATASTORE/$BASE_SERVICE_NAME/opt/apps/hugo/output"
backup:
constraint: recommended
auto: pair
solves:
backup: "Automatic regular backup"
default-options:
## First pattern matching wins, no pattern matching includes.
## include-patterns are checked first, then exclude-patterns
## Patterns rules:
## - ending / for directory
## - '*' authorized
## - must start with a '/', will start from $SERVICE_DATASTORE
exclude-patterns:
- "/opt/apps/hugo/output/"
Loading…
Cancel
Save