Compare commits
18 Commits
79877d8eae
...
0.1.0+up25
| Author | SHA1 | Date | |
|---|---|---|---|
|
8ed24361bf
|
|||
|
c4fae1e2d8
|
|||
|
25707b7f89
|
|||
|
61d3bc4aba
|
|||
|
bc5138ef84
|
|||
|
fe12222722
|
|||
|
be91c9677a
|
|||
|
33fbe9e443
|
|||
|
c09e1a2978
|
|||
|
337b9e9f0b
|
|||
|
91bb7a4fd1
|
|||
|
005aab7ec9
|
|||
|
c2ccd5e27f
|
|||
|
7cf5f43299
|
|||
|
3eaa7e6b60
|
|||
|
fac90514e4
|
|||
|
f22cdaa818
|
|||
|
55ca2b3af4
|
@@ -6,7 +6,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
env:
|
env:
|
||||||
CHART_DIR: bookstack/
|
CHART_DIR: bookstack/
|
||||||
CHART_VERSION: ${{ github.event.release.tag_name }}
|
CHART_VERSION: ${{ github.event.release.tag_name }}
|
||||||
@@ -31,18 +31,20 @@ jobs:
|
|||||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||||
trust_level: 5
|
trust_level: 5
|
||||||
|
|
||||||
# 4) “Generation‑1”‑Secret‑Ring für Helm erzeugen (TMP, 600 Rechte)
|
# 3) "Generation-1"-Secret-Ring für Helm erzeugen (TMP, 600 Rechte)
|
||||||
- name: Build legacy secret-keyring
|
- name: Build legacy secret-keyring
|
||||||
run: |
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
install -m 700 -d /tmp/gpgring
|
install -m 700 -d /tmp/gpgring
|
||||||
gpg --batch --pinentry-mode loopback \
|
gpg --batch --yes --pinentry-mode loopback \
|
||||||
|
--passphrase "$PASSPHRASE" \
|
||||||
--export-secret-keys "$GPG_KEY_ID" \
|
--export-secret-keys "$GPG_KEY_ID" \
|
||||||
--output /tmp/gpgring/secring.gpg
|
>/tmp/gpgring/secring.gpg
|
||||||
chmod 600 /tmp/gpgring/secring.gpg
|
chmod 600 /tmp/gpgring/secring.gpg
|
||||||
echo "$PASSPHRASE" > /tmp/gpgring/passphrase.txt
|
echo "$PASSPHRASE" > /tmp/gpgring/passphrase.txt
|
||||||
chmod 600 /tmp/gpgring/passphrase.txt
|
chmod 600 /tmp/gpgring/passphrase.txt
|
||||||
|
|
||||||
# 5) Chart bauen & signieren
|
# 4) Chart bauen & signieren
|
||||||
- name: Package & sign chart
|
- name: Package & sign chart
|
||||||
run: |
|
run: |
|
||||||
cp README.md "$CHART_DIR"/
|
cp README.md "$CHART_DIR"/
|
||||||
@@ -50,11 +52,11 @@ jobs:
|
|||||||
helm package "$CHART_DIR" \
|
helm package "$CHART_DIR" \
|
||||||
--version "$CHART_VERSION" \
|
--version "$CHART_VERSION" \
|
||||||
--sign \
|
--sign \
|
||||||
--key "$GPG_KEY_ID" \
|
--key "Morlana Signing" \
|
||||||
--keyring /tmp/gpgring/secring.gpg \
|
--keyring /tmp/gpgring/secring.gpg \
|
||||||
--passphrase-file /tmp/gpgring/passphrase.txt
|
--passphrase-file /tmp/gpgring/passphrase.txt
|
||||||
|
|
||||||
# 6) In dein internes Chart‑Repo hochladen
|
# 5) In dein internes Chart-Repo hochladen
|
||||||
- name: Upload to ChartMuseum
|
- name: Upload to ChartMuseum
|
||||||
env:
|
env:
|
||||||
REPO_CREDENTIALS: ${{ secrets.REPO_CREDENTIALS }}
|
REPO_CREDENTIALS: ${{ secrets.REPO_CREDENTIALS }}
|
||||||
@@ -64,7 +66,7 @@ jobs:
|
|||||||
-F "prov=@bookstack-$CHART_VERSION.tgz.prov" \
|
-F "prov=@bookstack-$CHART_VERSION.tgz.prov" \
|
||||||
https://charts.morlana.net/api/charts
|
https://charts.morlana.net/api/charts
|
||||||
|
|
||||||
# 7) Public‑Key aus Repo beilegen und als Release‑Asset anhängen
|
# 6) Public-Key aus Repo beilegen und als Release-Asset anhängen
|
||||||
- name: Attach release assets
|
- name: Attach release assets
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
@@ -74,7 +76,7 @@ jobs:
|
|||||||
bookstack-${{ env.CHART_VERSION }}.tgz.prov
|
bookstack-${{ env.CHART_VERSION }}.tgz.prov
|
||||||
pubkeys/morlana.asc
|
pubkeys/morlana.asc
|
||||||
|
|
||||||
# 8) Aufräumen (optional, Runner ist ohnehin kurzlebig)
|
# 7) Aufräumen (optional, Runner ist ohnehin kurzlebig)
|
||||||
- name: Cleanup sensitive files
|
- name: Cleanup sensitive files
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
run: rm -rf /tmp/gpgring
|
run: rm -rf /tmp/gpgring
|
||||||
|
|||||||
9
.vscode/settings.json
vendored
Normal file
9
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"github.copilot.enable": {
|
||||||
|
"*": true,
|
||||||
|
"plaintext": false,
|
||||||
|
"markdown": false,
|
||||||
|
"scminput": false,
|
||||||
|
"yaml": true
|
||||||
|
}
|
||||||
|
}
|
||||||
15
CHANGELOG.md
Normal file
15
CHANGELOG.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## 0.1.0+up25.5.0 - 2025-06-12
|
||||||
|
- **Changed** ✦ Packages upstream BookStack v25.5.0
|
||||||
|
- [Release Notes](https://github.com/solidnerd/docker-bookstack/releases/tag/25.5.0)
|
||||||
|
- [Project homepage](https://www.bookstackapp.com/)
|
||||||
|
|
||||||
|
## 0.1.0+up25.2.3 – 2025-05-08
|
||||||
|
- **Added** Initial Helm chart for BookStack.
|
||||||
|
- ✦ Packages upstream BookStack v25.2.3
|
||||||
|
- [Project homepage](https://www.bookstackapp.com/)
|
||||||
|
- **Added** ✦ Ingress, persistence, TLS and SMTP settings ready‑made
|
||||||
|
- **Added** ✦ Includes optional MariaDB and Redis sub‑charts
|
||||||
|
- [MariaDB sub‑chart](https://artifacthub.io/packages/helm/bitnami/mariadb)
|
||||||
|
- [Redis sub‑chart](https://artifacthub.io/packages/helm/bitnami/redis)
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# BookStack Helm Chart
|
# BookStack Helm Chart
|
||||||
|
|
||||||
Deploys the BookStack wiki platform on Kubernetes with optional MariaDB and Redis sub‑charts.
|
Deploys the BookStack wiki platform on Kubernetes with optional MariaDB and Redis sub-charts.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
apiVersion: v2
|
apiVersion: v2
|
||||||
name: bookstack
|
name: bookstack
|
||||||
description: A Helm chart for Kubernetes
|
description: |
|
||||||
|
Deploys the BookStack wiki platform on Kubernetes with optional MariaDB and Redis sub-charts.
|
||||||
|
|
||||||
type: application
|
type: application
|
||||||
|
|
||||||
version: "0.1.0+up25.2.3"
|
version: "0.1.0+up25.5.0"
|
||||||
|
|
||||||
appVersion: "25.2.3"
|
appVersion: "25.5.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- name: mariadb
|
- name: mariadb
|
||||||
@@ -18,3 +19,27 @@ dependencies:
|
|||||||
version: ">=21.0.0 <22.0.0"
|
version: ">=21.0.0 <22.0.0"
|
||||||
repository: "oci://registry-1.docker.io/bitnamicharts"
|
repository: "oci://registry-1.docker.io/bitnamicharts"
|
||||||
condition: redis.enabled
|
condition: redis.enabled
|
||||||
|
|
||||||
|
annotations:
|
||||||
|
artifacthub.io/license: MIT
|
||||||
|
artifacthub.io/links: |
|
||||||
|
- name: Git Repository
|
||||||
|
url: https://git.morlana.online/f.weber/bookstack-chart
|
||||||
|
- name: Issues
|
||||||
|
url: https://github.com/flweber/helm-bookstack/issues
|
||||||
|
- name: GitHub Mirror
|
||||||
|
url: https://github.com/flweber/helm-bookstack
|
||||||
|
artifacthub.io/maintainers: |
|
||||||
|
- name: Florian Weber
|
||||||
|
email: kosmos@morlana.net
|
||||||
|
artifacthub.io/signKey: |
|
||||||
|
fingerprint: 8975 6E20 1E4C 99B1 A2E9 5712 DF7D F259 CD8F CAAA
|
||||||
|
url: https://raw.githubusercontent.com/flweber/helm-bookstack/refs/heads/main/pubkeys/morlana.asc
|
||||||
|
artifacthub.io/changes: |
|
||||||
|
- kind: changed
|
||||||
|
description: ✦ Packages upstream BookStack v25.5.0
|
||||||
|
links:
|
||||||
|
- name: Release Notes
|
||||||
|
url: https://github.com/solidnerd/docker-bookstack/releases/tag/25.5.0
|
||||||
|
- name: Project homepage
|
||||||
|
url: https://www.bookstackapp.com/
|
||||||
|
|||||||
83
generate_changelog.py
Normal file
83
generate_changelog.py
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
generate_changelog.py - Wandelt den Artifact Hub-Changelog in Chart.yaml
|
||||||
|
in eine Markdown-Datei (CHANGELOG.md) um.
|
||||||
|
|
||||||
|
Aufruf:
|
||||||
|
python generate_changelog.py # takes ./Chart.yaml
|
||||||
|
python generate_changelog.py path/to/Chart.yaml
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import datetime as dt
|
||||||
|
import pathlib
|
||||||
|
import sys
|
||||||
|
import textwrap
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
|
MD_HEADER = "# Changelog\n\n"
|
||||||
|
|
||||||
|
|
||||||
|
def read_chart(path: pathlib.Path) -> dict:
|
||||||
|
if not path.exists():
|
||||||
|
sys.exit(f"❌ Chart.yaml not found: {path}")
|
||||||
|
with path.open() as f:
|
||||||
|
return yaml.safe_load(f)
|
||||||
|
|
||||||
|
|
||||||
|
def extract_changes(chart: dict) -> list[dict]:
|
||||||
|
try:
|
||||||
|
raw = chart["annotations"]["artifacthub.io/changes"]
|
||||||
|
except KeyError:
|
||||||
|
sys.exit("❌ No 'artifacthub.io/changes' annotations found.")
|
||||||
|
|
||||||
|
try:
|
||||||
|
return yaml.safe_load(raw) or []
|
||||||
|
except yaml.YAMLError as e:
|
||||||
|
sys.exit(f"❌ Changelog annotations are not in a valid YAML format:\n{e}")
|
||||||
|
|
||||||
|
|
||||||
|
def render_markdown(chart: dict, changes: list[dict]) -> str:
|
||||||
|
version = chart.get("version", "Unversioniert")
|
||||||
|
today = dt.date.today().isoformat()
|
||||||
|
|
||||||
|
heading = f"## {version} - {today}\n"
|
||||||
|
bullets = []
|
||||||
|
|
||||||
|
for item in changes:
|
||||||
|
kind = item.get("kind", "").capitalize()
|
||||||
|
desc = item.get("description", "").strip()
|
||||||
|
links = item.get("links", [])
|
||||||
|
link_md = ""
|
||||||
|
if links:
|
||||||
|
link_md = " " + " ".join(f"[{l['name']}]({l['url']})" for l in links)
|
||||||
|
bullets.append(f"- **{kind}** {desc}{link_md}")
|
||||||
|
|
||||||
|
return MD_HEADER + heading + "\n".join(bullets) + "\n"
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Generates CHANGELOG.md from Chart.yaml annotations."
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"chart_yaml",
|
||||||
|
nargs="?",
|
||||||
|
default="Chart.yaml",
|
||||||
|
help="Pfad zur Chart.yaml (Standard: ./Chart.yaml)",
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
chart_path = pathlib.Path(args.chart_yaml)
|
||||||
|
chart = read_chart(chart_path)
|
||||||
|
changes = extract_changes(chart)
|
||||||
|
changelog_md = render_markdown(chart, changes)
|
||||||
|
|
||||||
|
outfile = chart_path.parent / "CHANGELOG.md"
|
||||||
|
outfile.write_text(changelog_md, encoding="utf-8")
|
||||||
|
print(f"✅ CHANGELOG.md generated under {outfile.resolve()}.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -1,10 +1,29 @@
|
|||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
mDMEaBxO9xYJKwYBBAHaRw8BAQdA/7OLLFRkqsTzyufHwHVgB7M6XoX9+df8qCvi
|
mQINBGgiWykBEACtiiNGno+ZL99rI0qP98Ei+HNcs/MgBWqjPa3/nYv6wK1FVEhu
|
||||||
u5xQM7i0OE1vcmxhbmEgQ0kgU2lnbmluZyBLZXkgPGNvbnRhY3QrZGV2ZWxvcG1l
|
95w/4Oh/EBEP7vuq5lDfC2JQHiif6AHu4tBB6V2Hx3XLyZE9HY+7SuqIWzeGGr2F
|
||||||
bnRAbW9ybGFuYS5uZXQ+iJYEExYIAD4WIQS84h7qJd4UtBgZbaH/b3JG+qmcMAUC
|
GlD8GkEQ4/HtdHDK+htFUgTPrzW7f/ax5pgvvzAXQcXnC6fIOGsd2IJO0LoEjhTn
|
||||||
aBxO9wIbAwUJAeEzgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRD/b3JG+qmc
|
KJQqEOgPqGjyfND9+3bfscLJi2CSK23pWz30f1sTzqLM4eMN7poXGqjwjtyKwGog
|
||||||
MLuMAQDM/CPa1DO31dmcI5Xtt9uK3svdv3mZl5GGqqTylcYTXgD+LL4/OPp7XHx+
|
j66t6Na6A/B3AU9QPP5BB1/Qj09FVsd/InLsyelULG1fZmY0wx2/wiE0VNhenjGa
|
||||||
WTf9NitfTlwpRKJJWec7vp2NG0NQ8wg=
|
EejCp8oHieZ++x811ux6wROdJc38HC5lJfXhyob3yJ2OXeGBYnZG8PrT2CqJpTXz
|
||||||
=ACKv
|
W/5kDVYAyKOh2iiPGADGlMOajnyCgtRI9YEsKYybxlRW7vuvh7ItHb7/iplbamgx
|
||||||
|
RUrxiJGDMTEENsePTQq4pGOblXptw6PiIogGv9kWJ9WaEIbbAlFJmAIOh2JXRF+Y
|
||||||
|
JgaCzUjUNRv/z3P5Ymwd2qYxp+RO8QVCPs+/PAqL0BgwCFQXhOC5Yez3/89D5tKy
|
||||||
|
UOMBxK+xP3i7mj5C6BZa+1ChMdN9yUYpGKVfm16xLVrGBbwWZI6YB4qF+3n4qUtp
|
||||||
|
Ld7CVEzPVarftb8UpIaqAO/R/MYPUAJeKCykHrlaaOqkj3Dhacqgl+h9FQARAQAB
|
||||||
|
tDFNb3JsYW5hIFNpZ25pbmcgPGNvbnRhY3QrZGV2ZWxvcG1lbnRAbW9ybGFuYS5u
|
||||||
|
ZXQ+iQJOBBMBCgA4FiEEiXVuIB5MmbGi6VcS333yWc2PyqoFAmgiWykCGwMFCwkI
|
||||||
|
BwIGFQoJCAsCBBYCAwECHgECF4AACgkQ333yWc2PyqrhXA//SnEa+hG0hIAB4Ua/
|
||||||
|
qgqv/7nzpRIFAA5tqSoOPZ0p4YvtsSywc7zJ+ZH7IClvlewOo0Omeo4XiYQCLYSL
|
||||||
|
LnYv/yqrWVNU35TI29k2RTE4pmcHB9hMdG8heI2c5O3vd9C4yQCWwWKMSD3pEPrq
|
||||||
|
aLkHkQvLyXZukBeMzNFaVK4wOjPB02MadQLIu9rbUbKW9DvUmt/x8uBVmm/Pq4Ds
|
||||||
|
HBgxdnOifEhzMG2gG+4UJYt2jfibMwCJpM4d/drs28Qf9dhjj1UHzhhwBW3OpJkJ
|
||||||
|
E+hHVMObzolefh4eR3gPctIkxuVjYC91FVZkqVV3TgrLKhfgro5ML7IFgCnzHVuZ
|
||||||
|
PKJsssNZds+2Sv/nf2QtXcGvQgZ3xjNlaQUxE0WTGe+DKx4pMyxx4s+eNYGhA5Yo
|
||||||
|
rrb9on8TfDNaexU0BDUyt3DLQVxk8niqQPmj9jmD+BrsjWnj7Dn1yCgjre/viZjH
|
||||||
|
Ys8AHwxSu4qh3XBtjUQ9YDhUMmNqIOtJHiVp97kWbLbQ7CiCI+/7IT6Pk50+GzXV
|
||||||
|
KaTRfEp6zxpMx2wgsw4CP7aKukLrIFWxDNyQ+030c8TQW8WuL1W3oTzh0iu7DCgR
|
||||||
|
XVmgS6+YAbxjX/gAD0Dx3jLftQ2Y3PGMWPXtZmtZucIFhg1ArmYb2v1n8sWMi+cK
|
||||||
|
k/0Bxc8p29/H9s7dv5pVyrx2fcM=
|
||||||
|
=o6F8
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
|||||||
Reference in New Issue
Block a user