Add deployment workflow for automatic deployment via Forgejo Actions
This commit is contained in:
parent
f67b356dfe
commit
19a7fa0e48
2 changed files with 124 additions and 0 deletions
116
.forgejo/workflows/deploy.yml
Normal file
116
.forgejo/workflows/deploy.yml
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
name: Deploy Better Life SG
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [master]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: deploy-betterlifesg-${{ forgejo.ref }}
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Configure SSH
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
VPS_SSH_KEY: ${{ secrets.VPS_SSH_KEY }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
install -d -m 700 ~/.ssh
|
||||||
|
python3 - <<'PY'
|
||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
key = os.environ["VPS_SSH_KEY"]
|
||||||
|
if "\\n" in key and "\n" not in key:
|
||||||
|
key = key.replace("\\n", "\n")
|
||||||
|
key = key.replace("\r\n", "\n").replace("\r", "\n").strip() + "\n"
|
||||||
|
Path.home().joinpath(".ssh", "id_ed25519").write_text(key, encoding="utf-8")
|
||||||
|
PY
|
||||||
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
|
ssh-keygen -y -f ~/.ssh/id_ed25519 >/dev/null
|
||||||
|
ssh-keyscan -H 23.226.133.245 >> ~/.ssh/known_hosts
|
||||||
|
|
||||||
|
- name: Deploy on VPS
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
ssh root@23.226.133.245 "cd /opt/src/betterlifesg && bash scripts/deploy-betterlifesg.sh"
|
||||||
|
|
||||||
|
notify:
|
||||||
|
if: ${{ always() }}
|
||||||
|
needs: [deploy]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Send ntfy notification
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
JOB_RESULTS: ${{ toJson(needs) }}
|
||||||
|
NTFY_TOKEN: ${{ secrets.NTFY_TOKEN }}
|
||||||
|
NTFY_TOPIC_URL: https://ntfy.bytesizeprotip.com/deploy
|
||||||
|
RUN_URL: ${{ forgejo.server_url }}/${{ forgejo.repository }}/actions/runs/${{ forgejo.run_id }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
if [ -z "$NTFY_TOKEN" ]; then
|
||||||
|
echo "NTFY_TOKEN secret not configured, skipping notification."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval "$(python3 - <<'PY'
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import shlex
|
||||||
|
|
||||||
|
needs = json.loads(os.environ["JOB_RESULTS"])
|
||||||
|
results = {name: str(data.get("result") or "unknown") for name, data in needs.items()}
|
||||||
|
has_failure = any(result == "failure" for result in results.values())
|
||||||
|
has_cancelled = any(result == "cancelled" for result in results.values())
|
||||||
|
|
||||||
|
if has_failure:
|
||||||
|
status = "failure"
|
||||||
|
priority = "5"
|
||||||
|
tags = "rotating_light,x"
|
||||||
|
elif has_cancelled:
|
||||||
|
status = "cancelled"
|
||||||
|
priority = "4"
|
||||||
|
tags = "warning"
|
||||||
|
else:
|
||||||
|
status = "success"
|
||||||
|
priority = "2"
|
||||||
|
tags = "white_check_mark"
|
||||||
|
|
||||||
|
summary = ", ".join(f"{name}:{result}" for name, result in results.items()) or "no upstream jobs"
|
||||||
|
message = "\n".join([
|
||||||
|
f"Repo: {os.environ['FORGEJO_REPOSITORY']}",
|
||||||
|
f"Workflow: {os.environ['FORGEJO_WORKFLOW']}",
|
||||||
|
f"Status: {status}",
|
||||||
|
f"Ref: {os.environ.get('FORGEJO_REF_NAME', '')}",
|
||||||
|
f"Actor: {os.environ.get('FORGEJO_ACTOR', '')}",
|
||||||
|
f"Run: {os.environ['RUN_URL']}",
|
||||||
|
f"Jobs: {summary}",
|
||||||
|
])
|
||||||
|
|
||||||
|
values = {
|
||||||
|
"NTFY_TITLE": f"{os.environ['FORGEJO_WORKFLOW']} {status}",
|
||||||
|
"NTFY_PRIORITY": priority,
|
||||||
|
"NTFY_TAGS": tags,
|
||||||
|
"NTFY_MESSAGE": message,
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, value in values.items():
|
||||||
|
print(f"{key}={shlex.quote(value)}")
|
||||||
|
PY
|
||||||
|
)"
|
||||||
|
|
||||||
|
curl --fail --show-error --silent \
|
||||||
|
-H "Authorization: Bearer $NTFY_TOKEN" \
|
||||||
|
-H "Title: $NTFY_TITLE" \
|
||||||
|
-H "Priority: $NTFY_PRIORITY" \
|
||||||
|
-H "Tags: $NTFY_TAGS" \
|
||||||
|
-H "Click: $RUN_URL" \
|
||||||
|
-d "$NTFY_MESSAGE" \
|
||||||
|
"$NTFY_TOPIC_URL"
|
||||||
|
|
@ -10,10 +10,18 @@ Static website for Better Life SG insurance consultants, replicated from betterl
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
|
Push to `master` in Forgejo to deploy automatically via Forgejo Actions.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ssh racknerd bash /opt/src/betterlifesg/scripts/deploy-betterlifesg.sh
|
ssh racknerd bash /opt/src/betterlifesg/scripts/deploy-betterlifesg.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Forgejo Actions
|
||||||
|
|
||||||
|
- Trigger: push to `master` and manual `workflow_dispatch`
|
||||||
|
- Required secret: `VPS_SSH_KEY`
|
||||||
|
- Optional secret: `NTFY_TOKEN`
|
||||||
|
|
||||||
## Managed by BetterBot
|
## Managed by BetterBot
|
||||||
|
|
||||||
The site content can be edited via the BetterBot Telegram bot (see `betterbot/` repo).
|
The site content can be edited via the BetterBot Telegram bot (see `betterbot/` repo).
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue