Added article about auto release updates

This commit is contained in:
2026-03-24 22:32:03 +01:00
parent ac62e53698
commit 9c9db094a0

View File

@@ -1,6 +1,6 @@
--- ---
date: '2026-03-24T20:36:26+01:00' date: '2026-03-24T20:36:26+01:00'
draft: true draft: false
title: 'Automatic web update release' title: 'Automatic web update release'
author: "Jirka" author: "Jirka"
tags: ["self-host", "gitea", "automation"] tags: ["self-host", "gitea", "automation"]
@@ -170,3 +170,105 @@ jobs:
``` ```
This will automatically create package on push to master. This will automatically create package on push to master.
Now, once the package was successfully built, we can move onto the webhook.
## Webhook set up
For webhook, we will use `almir/webhook:latest` image, But because we need curl and zip, we will build it on our own.
Created `webhook` directory next to `web` directory and create `Dockerfile`:
```
FROM almir/webhook:latest
USER root
RUN apk add --no-cache curl unzip
WORKDIR /app
```
Next we will specify script, which will be executed on webhook trigger. Create file `deploy.sh` with `+x` privileges to be executable:
```bash
#!/bin/sh
set -e
TEMP_DIR=$(mktemp -d)
ZIP_PATH="$TEMP_DIR/web.zip"
curl -fL -o "$ZIP_PATH" "https://git.jirkabuilds.dev/api/packages/jirka/generic/hugo-build/latest/web.zip"
# Delete old web data
rm -rf /site_data/*
rm -rf /site_data/.[!.]* 2>/dev/null || true
unzip -q "$ZIP_PATH" -d /site_data/
rm -rf "$TEMP_DIR"
```
As you can see, we are downloading created package and replacing all site content.
Next step is to define hook itself. Create `hooks.json` file with following content:
```
[
{
"id": "deploy-web",
"execute-command": "/app/deploy.sh",
"command-working-directory": "/app",
"trigger-rule": {
"match": {
"type": "value",
"value": "secret token",
"parameter": {
"source": "header",
"name": "X-Deploy-Token"
}
}
}
}
]
```
You should create `secret`, which you will store to Gitea, same as with token earlier` with name `WEBHOOK_SECRET`. Thanks to it, only the workflow can trigger this webhook.
And last step is to create `docker-compose.yml`:
```
services:
webhook:
build: .
container_name: jirkabuilds_release_web_webhook
volumes:
- ./hooks.json:/etc/webhook/hooks.json:ro
- ./deploy.sh:/app/deploy.sh:ro
- ./../web/site_data:/site_data
command: ["-verbose", "-hooks=/etc/webhook/hooks.json", "-hotreload"]
restart: unless-stopped
networks:
- jirkabuilds_proxy_network
networks:
jirkabuilds_proxy_network:
```
You can see, we are using the same proxy network as for everything. Next step is to add following block to `Caddyfile`:
```
hooks.jirkabuilds.dev {
reverse_proxy jirkabuilds_release_web_webhook:9000
}
```
And following line to our root `docker-compose.yml`
```
- webhook/docker-compose.yml
```
Now you can restart the stack and webhook should work.
Final last step is to replace #TODO in our workflow with following:
```
- name: Trigger Webhook
run: |
curl -X POST "https://hooks.jirkabuilds.dev/hooks/deploy-web" \
-H "X-Deploy-Token: ${{ secrets.WEBHOOK_SECRET }}"
```
And that is it. On next push, web should update itself automatically.